Linux设备树中GPIO信息解析 - 以imx6ul-gpio为例
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>;
}
解析:
gpio1: gpio@0209c000: 该节点代表一个GPIO控制器,gpio1是该控制器的别名,@0209c000是该控制器的地址。compatible = 'fsl,imx6ul-gpio', 'fsl,imx35-gpio': 该属性表示该GPIO控制器兼容哪些型号的芯片。reg = <0x0209c000 0x4000>: 该属性表示该GPIO控制器的寄存器地址范围。interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>: 该属性表示该GPIO控制器支持的中断信息,包括中断控制器类型、中断号以及中断类型。gpio-controller: 该属性表明这是一个GPIO控制器节点。#gpio-cells = <2>: 该属性表示每个GPIO引脚信息需要使用两个cell来描述。interrupt-controller: 该属性表明该GPIO控制器同时也是一个中断控制器。#interrupt-cells = <2>: 该属性表示每个中断信息需要使用两个cell来描述。myled: 该节点代表一个LED设备。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 信息在设备树中的描述方式,我们可以更深入地理解设备驱动程序的工作原理,并编写更简洁高效的驱动代码。
更多信息:
原文地址: https://www.cveoy.top/t/topic/n2ET 著作权归作者所有。请勿转载和采集!