在Linux内核的GPIO子系统中,gpio_chip、gpio_desc和gpio_device(假设存在)的结构体关系如下:
1. gpio_chip:GPIO控制器抽象
- 作用:表示一个GPIO控制器(如SoC内置的GPIO模块或I2C/SPI扩展的GPIO芯片)。
- 核心字段:
label:控制器名称(如"imx6ul-gpio1")。base:控制器管理的起始GPIO编号。ngpio:控制器管理的GPIO总数。- 操作函数指针(如
direction_input、get、set)用于硬件操作。
- 关系:
- 每个
gpio_chip管理一组GPIO引脚(通过base和ngpio定义范围)。 - 驱动需实现
gpio_chip并注册到内核(通过gpiochip_add),使系统识别该控制器。
- 每个
2. gpio_desc:GPIO引脚描述符
- 作用:描述一个具体的GPIO引脚,包含配置信息和元数据。
- 核心字段:
chip:指向关联的gpio_chip。flags:引脚属性(如GPIOF_DIR_OUT表示输出模式)。label和name:引脚的标签和名称(如"led_gpio")。dev和consumer:关联的设备(如使用该GPIO的LED驱动)。
- 关系:
- 每个
gpio_desc对应gpio_chip中的一个引脚(通过offset计算实际编号:gpio = chip->base + offset)。 - 通过
gpio_to_desc(gpio)可将GPIO编号转换为描述符,用于安全操作。
- 每个
3. 假设的gpio_device:GPIO设备抽象
- 假设作用:若存在,可能表示一个使用GPIO的设备(如LED、按钮或传感器),或GPIO扩展芯片本身。
- 可能关系:
- 场景1:若
gpio_device代表GPIO扩展芯片(如PCA953x),则其内部包含一个gpio_chip,管理该芯片的GPIO引脚(每个引脚对应一个gpio_desc)。 - 场景2:若
gpio_device表示普通外设(如LED),则可能关联多个gpio_desc(如控制亮灭的GPIO)。
- 场景1:若
关系总结
| 结构体 | 层级 | 作用 |
|---|---|---|
gpio_chip | 底层控制器 | 管理一组GPIO引脚,提供硬件操作函数。 |
gpio_desc | 中间描述符 | 描述单个GPIO引脚,包含配置和元数据,关联到gpio_chip。 |
gpio_device(假设) | 上层设备抽象 | 可能表示GPIO控制器设备(如扩展芯片)或使用GPIO的外设(如LED)。 |
典型流程示例
- 驱动注册GPIO控制器:
- 初始化
gpio_chip,设置操作函数和引脚范围。 - 调用
gpiochip_add(&chip)注册到内核。
- 初始化
- GPIO描述符创建:
- 内核为
gpio_chip的每个引脚自动生成gpio_desc。
- 内核为
- 外设使用GPIO:
- 外设驱动(如LED)通过
gpiod_get获取gpio_desc。 - 操作
gpio_desc控制引脚(如gpiod_set_value(desc, 1)点亮LED)。
- 外设驱动(如LED)通过
代码示例(简化)
// 1. 定义GPIO控制器(gpio_chip)
static struct gpio_chip my_gpio_chip = {
.label = "my-gpio",
.owner = THIS_MODULE,
.direction_input = my_gpio_dir_input,
.get = my_gpio_get_value,
.direction_output = my_gpio_dir_output,
.set = my_gpio_set_value,
.base = 0, // GPIO编号起始值(由内核分配)
.ngpio = 32, // 管理32个引脚
};
// 2. 注册控制器
gpiochip_add(&my_gpio_chip);
// 3. 外设获取GPIO描述符(如LED使用GPIO 5)
struct gpio_desc *led_gpio = gpiod_get(dev, "led", GPIOD_OUT_HIGH);
if (IS_ERR(led_gpio)) {
// 错误处理
}
// 4. 操作GPIO
gpiod_set_value(led_gpio, 1); // 点亮LED
关键结论
gpio_chip是核心:所有GPIO操作最终通过其函数指针实现。gpio_desc是安全接口:替代原始GPIO编号,避免冲突。gpio_device非标准结构体:若存在,可能是特定场景的抽象(如扩展芯片设备),但内核中通常通过gpio_chip和gpio_desc管理GPIO。

737

被折叠的 条评论
为什么被折叠?



