Linux设备树中GPIO信息解析 - 以imx6ul-gpio为例

在Linux设备树中,GPIO信息以节点的形式进行描述,每个节点对应一个GPIO控制器,包含了该控制器所连接的引脚信息、中断配置等。

示例代码:

aliases {
    can0 = &flexcan1;
    can1 = &flexcan2;
    ethernet0 = &fec1;
    ethernet1 = &fec2;
    gpio0 = &gpio1;
    gpio1 = &gpio2;
    gpio2 = &gpio3;
    gpio3 = &gpio4;
    gpio4 = &gpio5;
    // ...
}

gpio1: gpio@0209c000 {
    compatible = 'fsl,imx6ul-gpio', 'fsl,imx35-gpio';
    reg = <0x0209c000 0x4000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    // 两个必须的节点
    gpio-controller;
    // 表明这是一个gpio controller
    #gpio-cells = <2>;
    // 表明多少个cell来描述一个引脚
    interrupt-controller;
    #interrupt-cells = <2>;
};

myled {
    compatible = '100ask,leddrv';
    led-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
}

解析:

  1. gpio1: gpio@0209c000: 该节点代表一个GPIO控制器,gpio1 是该控制器的别名,@0209c000 是该控制器的地址。
  2. compatible = 'fsl,imx6ul-gpio', 'fsl,imx35-gpio': 该属性表示该GPIO控制器兼容哪些型号的芯片。
  3. reg = <0x0209c000 0x4000>: 该属性表示该GPIO控制器的寄存器地址范围。
  4. interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>: 该属性表示该GPIO控制器支持的中断信息,包括中断控制器类型、中断号以及中断类型。
  5. gpio-controller: 该属性表明这是一个GPIO控制器节点。
  6. #gpio-cells = <2>: 该属性表示每个GPIO引脚信息需要使用两个cell来描述。
  7. interrupt-controller: 该属性表明该GPIO控制器同时也是一个中断控制器。
  8. #interrupt-cells = <2>: 该属性表示每个中断信息需要使用两个cell来描述。
  9. myled: 该节点代表一个LED设备。
  10. led-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>: 该属性指定了该LED设备所连接的GPIO引脚信息,包括引脚的地址(&gpio1),引脚编号(10)以及引脚的电平状态(GPIO_ACTIVE_LOW)。

结论:

这段代码描述了GPIO控制器 gpio1 的信息,并定义了一个LED设备 myled,并将该LED设备与GPIO控制器 gpio1 的第 10 个引脚相连。

当系统驱动 myled 设备时,它会根据 led-gpios 属性找到对应的GPIO控制器 gpio1,并控制相应的GPIO引脚,从而实现LED的开关控制。

理解GPIO信息在设备驱动中的应用:

GPIO信息是Linux设备树中重要的组成部分,它为设备驱动提供了 GPIO 控制器的地址、引脚信息、中断配置等信息,帮助设备驱动程序实现与硬件的交互。

例如:

  • 驱动程序可以通过读取 GPIO 控制器的寄存器地址,访问 GPIO 引脚的电平状态;
  • 驱动程序可以通过配置 GPIO 控制器的中断信息,实现对 GPIO 引脚中断事件的处理。

通过理解 GPIO 信息在设备树中的描述方式,我们可以更深入地理解设备驱动程序的工作原理,并编写更简洁高效的驱动代码。

更多信息:

Linux设备树中GPIO信息解析 - 以imx6ul-gpio为例

原文地址: https://www.cveoy.top/t/topic/n2ET 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录