linux系统、arm芯片的驱动的gpio部分,gpio_desk、gpio_device、gpio_chip 这3个结构体的关系

在Linux内核的GPIO子系统中,gpio_chipgpio_descgpio_device(假设存在)的结构体关系如下:

1. gpio_chip:GPIO控制器抽象

  • 作用:表示一个GPIO控制器(如SoC内置的GPIO模块或I2C/SPI扩展的GPIO芯片)。
  • 核心字段
    • label:控制器名称(如"imx6ul-gpio1")。
    • base:控制器管理的起始GPIO编号。
    • ngpio:控制器管理的GPIO总数。
    • 操作函数指针(如direction_inputgetset)用于硬件操作。
  • 关系
    • 每个gpio_chip管理一组GPIO引脚(通过basengpio定义范围)。
    • 驱动需实现gpio_chip并注册到内核(通过gpiochip_add),使系统识别该控制器。

2. gpio_desc:GPIO引脚描述符

  • 作用:描述一个具体的GPIO引脚,包含配置信息和元数据。
  • 核心字段
    • chip:指向关联的gpio_chip
    • flags:引脚属性(如GPIOF_DIR_OUT表示输出模式)。
    • labelname:引脚的标签和名称(如"led_gpio")。
    • devconsumer:关联的设备(如使用该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)。

关系总结

结构体层级作用
gpio_chip底层控制器管理一组GPIO引脚,提供硬件操作函数。
gpio_desc中间描述符描述单个GPIO引脚,包含配置和元数据,关联到gpio_chip
gpio_device(假设)上层设备抽象可能表示GPIO控制器设备(如扩展芯片)或使用GPIO的外设(如LED)。

典型流程示例

  1. 驱动注册GPIO控制器
    • 初始化gpio_chip,设置操作函数和引脚范围。
    • 调用gpiochip_add(&chip)注册到内核。
  2. GPIO描述符创建
    • 内核为gpio_chip的每个引脚自动生成gpio_desc
  3. 外设使用GPIO
    • 外设驱动(如LED)通过gpiod_get获取gpio_desc
    • 操作gpio_desc控制引脚(如gpiod_set_value(desc, 1)点亮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_chipgpio_desc管理GPIO。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值