1. QNX GPIO 概述
1.1 GPIO 基本概念
GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础、最灵活的引脚接口。每个 GPIO 引脚可通过软件独立配置为输入或输出模式,用于读取外部数字信号(如按键状态、传感器电平)或驱动外部设备(如 LED、继电器)。
在 QNX 实时操作系统中,GPIO 驱动遵循标准资源管理框架,将硬件引脚抽象为文件系统节点,应用程序通过 POSIX 标准 I/O 接口(open()、read()、write()、ioctl())完成控制,无需直接操作寄存器。
/dev/gpio0)发起请求。
1.2 QNX 中 GPIO 的硬件抽象层
QNX 的 GPIO 驱动采用分层架构设计,从上到下依次为:应用层、资源管理器层、硬件抽象层(HAL)、物理寄存器层。其中硬件抽象层是跨平台移植的核心,它将不同 SoC(如 i.MX8、TI AM57xx、Renesas R-Car)的 GPIO 控制器差异封装为统一接口。
HAL 层定义了一组标准回调函数指针结构体,BSP(板级支持包)开发者只需实现这些回调,即可完成 GPIO 驱动的移植。典型 HAL 接口包括:
| 接口函数 | 功能描述 | 参数说明 |
|---|---|---|
gpio_init() |
初始化 GPIO 控制器,使能时钟、配置基地址 | 设备 ID、基地址指针 |
gpio_set_dir() |
设置引脚方向(输入/输出) | 引脚号、方向标志 |
gpio_read() |
读取引脚电平状态 | 引脚号,返回 0/1 |
gpio_write() |
设置引脚输出电平 | 引脚号、电平值 |
gpio_irq_attach() |
注册外部中断回调 | 引脚号、触发条件、回调函数 |
gpio_irq_enable() |
使能/禁能引脚中断 | 引脚号、使能标志 |
1.3 GPIO 引脚功能与复用
现代 SoC 的 GPIO 引脚通常具有多种复用功能(Alternate Function,AF)。同一物理引脚可在 GPIO、UART、I²C、SPI、PWM 等模式间切换。QNX GPIO 驱动通过设备树(Device Tree)或板级配置文件管理引脚复用,驱动初始化时根据配置表设置引脚功能选择寄存器。
在 QNX 设备树中,引脚复用配置通常以 pinctrl 节点描述。以下是一个典型的 i.MX8 设备树引脚复用片段:
// i.MX8 QNX 设备树引脚复用配置示例
pinctrl_uart2: uart2grp {
fsl,pins = <
MX8M_UART2_RXD 0x49 /* 复用为 UART2 RX,带上拉 */
MX8M_UART2_TXD 0x49 /* 复用为 UART2 TX,带上拉 */
>;
};
pinctrl_gpio_key: keygrp {
fsl,pins = <
MX8M_GPIO1_IO12 0x1C0 /* 复用为 GPIO,输入,无上拉 */
>;
};
- 每个引脚的功能选择由 MUX 寄存器中的 ALT 位域控制(如 ALT0=GPIO,ALT1=UART,ALT2=I²C 等)。
- 除功能选择外,还需配置电气特性:驱动强度、上拉/下拉、施密特触发、速度等级等。
- QNX 驱动在
gpio_init()阶段读取设备树,批量配置引脚复用,避免运行时动态切换带来的风险。 - 同一引脚不能同时被多个功能模块占用,驱动初始化时会做冲突检测。
1.4 GPIO 引脚编号与命名规范
QNX 中 GPIO 引脚通常采用 bank + pin 的命名方式。例如 GPIO1_IO12 表示第 1 组 GPIO 控制器的第 12 号引脚。驱动内部将物理编号映射为线性索引,便于上层应用访问。
| SoC 平台 | Bank 数量 | 每 Bank 引脚数 | QNX 设备路径 | 引脚编号示例 |
|---|---|---|---|---|
| NXP i.MX8M | 5 | 32 | /dev/gpio0 ~ /dev/gpio4 |
GPIO1_IO12 → 索引 12 |
| TI AM57xx | 8 | 32 | /dev/gpio0 ~ /dev/gpio7 |
GPIO3_21 → 索引 85 |
| Renesas R-Car H3 | 10 | 32 | /dev/gpio0 ~ /dev/gpio9 |
GPIO6_15 → 索引 207 |