GPIO设备树用于在Linux内核中定义与GPIO相关的硬件资源,它使操作系统可以识别、配置和使用GPIO引脚。设备树中通常会指定GPIO控制器的基地址、GPIO引脚的中断配置、时钟和其他相关信息。
目录
RK相关案例代码
NXP相关案例代码
三星相关案例代码
在设备树中,GPI0控制器需要以下属性:
gpio-controller
表示该节点是GPIO控制器。#gpio-cells
指定该控制器使用的cell数量。data-gpios
属性用于指定具体的GPIO引脚,如<&gpio1 12 0>
,表示选择GPIO1的第12个引脚,并设定特定的标志。
如下就是案例代码:
gpio0: gpio@fdd60e00 {
compatible = "rockchip,gpio-bank"; // GPIO 控制器的兼容性字符串
reg = <0xfdd66000 0x1000>; // GPIO 控制器寄存器的基地址和大小
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; // GPIO中断配置,GIC_SPI代表中断类型
clocks = <&pclk_gpio>, <&spnucru_dbclk_gpio9>; // 时钟源
gpio-controller; // 声明这是一个GPIO控制器
#gpio-cells = <2>; // 每个GPIO需要两个参数:第一个是GPIO编号,第二个是GPIO配置
interrupt-controller; // 该控制器是中断控制器
#interrupt-cells = <2>; // 每个中断需要两个参数:第一个是中断编号,第二个是中断配置
pinctrl-names = "default"; // 引脚控制名称,通常为"default"
pinctrl-0 = <&pinctrl_gpio0>; // 引脚控制节点,指定哪些引脚属于该控制器
};
pinctrl_gpio0: pinctrl@fdd60e00 {
compatible = "rockchip,pinctrl";
reg = <0xfdd60e00 0x1000>; // 引脚控制器的寄存器地址
pins = "gpio0", "gpio1", "gpio2"; // GPIO引脚
function = "gpio"; // 引脚的功能模式
bias-pull-up; // 上拉电阻配置
};
RK相关案例代码
如下为BSP工程师提供的相关代码:
gpio0: qpio@fdd60e00 {
compatible = "rockchip,gpio-bank";
reg = <0xfdd66000 0x1000>;
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;
gpio-controller;
#gpio-cells = <2>;
gpios = <&pinctrl0032>;
interrupt-controller;
#interrupt-cells = <2>;
};
-
gpio0: qpio@fdd60e00
gpio0
是设备树节点的名称,用来表示该节点是 GPIO 控制器的配置。qpio@fdd60e00
是该节点的设备地址(基地址),@
后面是设备的物理地址或映射地址。这里表示的是 GPIO 控制器的寄存器区域,位于地址0xfdd60e00
。
-
compatible = "rockchip,gpio-bank";
- 这表示该硬件平台使用的是 Rockchip 的 GPIO 控制器,并且该节点与 Rockchip 的
gpio-bank
驱动兼容。这个字段帮助内核匹配适合的驱动程序。
- 这表示该硬件平台使用的是 Rockchip 的 GPIO 控制器,并且该节点与 Rockchip 的
-
reg = <0xfdd66000 0x1000>;
reg
定义了设备的寄存器基地址和大小,表示 GPIO 控制器的寄存器映射。0xfdd66000
是 GPIO 控制器寄存器的基地址,0x1000
是寄存器区块的大小,意味着这个区域的大小是 4KB。
-
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
interrupts
配置了中断相关信息,指示设备如何通过中断进行通知。GIC_SPI 33
表示这是一个来自 GIC (通用中断控制器) 的 SPI 类型中断,编号为 33。IRQ_TYPE_LEVEL_HIGH
表示该中断是一个高电平触发的中断。
-
clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;
clocks
定义了该设备所需的时钟源,<&pclk_gpio_g>
和<&spnucru_dbclk_gpio9>
是设备树中时钟节点的引用。具体的时钟节点需要在设备树的其他地方定义。&pclk_gpio_g
和&spnucru_dbclk_gpio9
表示用于该 GPIO 控制器的时钟资源,它们通常会在其他设备树节点中定义。
-
gpio-controller;
- 这个标识符声明该节点为一个 GPIO 控制器。它告诉内核该设备是用来控制 GPIO 引脚的。
-
#gpio-cells = <2>;
#gpio-cells
定义了每个 GPIO 引脚配置所需要的参数个数。这里2
表示每个 GPIO 配置有两个单元:第一个是 GPIO 编号,第二个是引脚的配置(例如方向或电平)。
-
gpios = <&pinctrl0032>;
gpios
引用引脚控制器(pinctrl)的节点,<&pinctrl0032>
表示该 GPIO 控制器与pinctrl0032
节点关联。pinctrl
节点通常包含有关引脚的设置和配置(如电平、功能、方向等)。
-
interrupt-controller;
- 该标识符表明该 GPIO 控制器节点不仅是 GPIO 控制器,还管理中断。即该控制器处理 GPIO 相关的中断。
-
#interrupt-cells = <2>;
#interrupt-cells
定义了中断配置所需的单元数。这里2
表示每个中断配置需要两个参数:第一个是中断编号,第二个是中断配置(如触发方式)。
如下为开发人员所编写的设备树代码:
15x66: edl_ft5306@38 {
status = "disabled";
compatible = "edl,edl-ft5306";
reg = <0x38>;
touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;
interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
touchscreen-size-x = <8>;
touchscreen-size-y = <1280>;
touch-type = <1>;
};
-
15x66: edl_ft5306@38
15x66
是设备树节点的标签,通常是设备的名称或标识符,这里假设是硬件设备的标识。设备树标签用于内核和其他设备访问。edl_ft5306@38
表示该设备是edl-ft5306
触摸屏控制器,@38
是设备的地址,指示触摸屏控制器的地址为0x38
。
-
status = "disabled";
status
设置为"disabled"
,这意味着该设备当前是禁用的。若要启用设备,需要将其改为"enabled"
。
-
compatible = "edl,edl-ft5306";
compatible
指定设备的兼容性标识符。内核通过该字段来匹配合适的驱动程序来支持此设备。这里edl,edl-ft5306
是触摸屏控制器的标识符,意味着该设备使用edl-ft5306
驱动。
-
reg = <0x38>;
reg
表示设备的寄存器地址,<0x38>
表示设备的地址为0x38
。这通常是设备的I2C或SPI地址。
-
touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;
touchscreen-gpio
配置触摸屏的 GPIO 引脚。<&gpio0 RK_PB3 GPIO_ACTIVE_LOW>
表示该 GPIO 控制器 (gpio0
) 的引脚RK_PB3
被用于触摸屏操作,并且设置为GPIO_ACTIVE_LOW
,即低电平有效。
-
interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;
interrupts
配置了设备的中断信息,指定触摸屏的中断由gpio0
控制器的RK_PB6
引脚提供,并且触发类型为IRQ_TYPE_LEVEL_HIGH
,即高电平触发中断。
-
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
reset-gpios
配置了用于复位触摸屏的 GPIO 引脚。与触摸屏 GPIO 引脚相同,复位引脚RK_PB6
设置为GPIO_ACTIVE_LOW
,即低电平有效。
-
touchscreen-size-x = <8>;
touchscreen-size-x
配置了触摸屏的 X 轴分辨率。在这里设置为8
,可能表示触摸屏横向的某些特定参数,通常是像素数或配置值(但通常触摸屏的分辨率应为更高的值,可能需要确认是否符合实际需求)。
-
touchscreen-size-y = <1280>;
touchscreen-size-y
配置了触摸屏的 Y 轴分辨率,设置为1280
,通常表示触摸屏纵向的像素数。
-
touch-type = <1>;
touch-type
设置为1
,这可能表示触摸屏的类型,例如:1 可能代表电容式触摸屏,其他值可能代表其他类型(如电阻式触摸屏)。具体值需根据硬件规格确认。
NXP相关案例代码
如下为BSP工程师的代码:
gpio1: gpiog8209ce00f {
compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";
reg = <0xe209c000 0x4000>;
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
-
gpio1: gpiog8209ce00f
gpio1
是该设备节点的名称,表示这是一个名为gpio1
的 GPIO 控制器节点。gpiog8209ce00f
是设备的标签,通常表示硬件资源的描述或地址。这个标签不一定是常规的设备命名,具体可能依据硬件平台的实现来命名。您可能需要根据实际硬件进行调整。
-
compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";
compatible
字段指示该设备与哪些驱动程序兼容。在此,设备支持 Freescale (现 NXP) 的imx6ul-gpio
和imx3s-gpio
驱动。这两个平台都使用类似的 GPIO 控制器,因此该字段包括两个兼容性标识符。
-
reg = <0xe209c000 0x4000>;
reg
表示设备的寄存器基地址及大小。这里基地址为0xe209c000
,寄存器大小为0x4000
,即 16KB。该设备的 GPIO 控制器寄存器区域映射到这个内存地址范围。
-
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
interrupts
配置了与该 GPIO 控制器相关的中断。这里有两个中断,分别由 GIC (通用中断控制器) 的 SPI (共享外部中断) 66 和 67 触发。IRQ_TYPE_LEVEL_HIGH
表示这些中断是高电平触发的。
-
gpio-controller;
- 该节点表示一个 GPIO 控制器,表明这是一个控制 GPIO 引脚的硬件设备。
-
#gpio-cells = <2>;
#gpio-cells
定义了每个 GPIO 配置所需要的单元数。这里的值2
表示每个 GPIO 配置需要两个参数:一个是 GPIO 编号,另一个是该 GPIO 的配置(如方向或电平)。
-
interrupt-controller;
- 该节点声明自己也是一个中断控制器。意味着该 GPIO 控制器不仅控制 GPIO 引脚,还负责管理这些引脚的中断。
-
#interrupt-cells = <2>;
#interrupt-cells
定义了与中断相关的参数个数。这里的值2
表示每个中断配置需要两个参数:一个是中断号,另一个是中断配置(例如触发类型)。
如下为开发工程师的代码编写:
edt_ft5x05838: edt-ft5x058@38 {
compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_scefault>;
interrupt-parent = <&gpio1>;
interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;
reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
status = "disabled";
};
-
edt_ft5x05838: edt-ft5x058@38
edt_ft5x05838
是该设备节点的标签,它表示一个触摸屏控制器。edt-ft5x058@38
表示该设备的名称和地址,@38
表示设备的地址为0x38
,该地址通常是 I2C 或 SPI 总线上的地址。
-
compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";
compatible
字段表示该设备兼容的驱动程序。这里列出了三个兼容的驱动程序(edt-ft5366
,edt-ft5xB6
, 和edt-ft5406
),它们代表了不同型号的触摸屏。
-
pinctrl-names = "default";
pinctrl-names
用来指定该设备使用的引脚控制配置的名称。"default"
表示使用默认的引脚控制配置。
-
pinctrl-0 = <&pinctrl_scefault>;
pinctrl-0
指定设备的引脚控制配置。&pinctrl_scefault
应该是指向一个引脚控制配置的引用,这个引用在设备树的其他地方定义。根据您的设备,它可能是某个预定义的引脚配置(例如触摸屏数据线的配置)。
-
interrupt-parent = <&gpio1>;
interrupt-parent
字段指定该设备中断的父控制器,这里是gpio1
,即通过 GPIO 控制器 1 触发中断。
-
interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;
interrupts
配置了设备的中断信息。<9 0 IRQ_TYPE_LEVEL_HIGH>
表示设备的中断由gpio1
控制器的 GPIO 引脚 9 提供,且触发方式为IRQ_TYPE_LEVEL_HIGH
,即高电平触发。
-
reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
reset-gpios
配置了设备的复位引脚。这里设置了复位引脚为gpio5
控制器的 GPIO 引脚 0,并且设置为GPIO_ACTIVE_LOW
,表示低电平有效。
-
irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
irq-gpios
配置了设备的中断 GPIO 引脚。这里设置为gpio1
控制器的 GPIO 引脚 9,且设置为GPIO_ACTIVE_LOW
,即低电平有效。
-
status = "disabled";
status = "disabled"
表示该设备当前被禁用。如果希望启用该设备,应将其更改为enabled
。
三星相关案例代码
如下为BSP工程师相关代码:
gpio_c: gpioc {
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
-
gpio_c: gpioc
gpio_c
是该设备节点的标签,用于标识 GPIO 控制器。gpioc
是设备的节点名称,表示这是一个 GPIO 控制器设备。
-
gpio-controller;
gpio-controller
表示这是一个 GPIO 控制器,负责管理 GPIO 引脚的输入输出。
-
#gpio-cells = <2>;
#gpio-cells
定义了每个 GPIO 配置所需要的单元数。这里的2
表示每个 GPIO 配置需要两个参数:- 一个是 GPIO 引脚编号。
- 另一个是该 GPIO 的配置(例如方向、激活电平等)。
-
interrupt-controller;
interrupt-controller
表示该节点同时也充当中断控制器的角色,管理 GPIO 引脚的中断。
-
#interrupt-cells = <2>;
#interrupt-cells
定义了每个中断配置所需要的单元数。这里的2
表示每个中断配置需要两个参数:- 一个是中断号。
- 另一个是中断配置(例如触发方式)。
如下为开发工程师编写的代码;
ft5x06: ft5x66838 {
compatible = "cdt,edt-ft5406";
reg = <0x30>;
pinctrl-names = "default";
pinctrl-0 = <&tsc2007 0>;
interrupt-parent = <&gpio_c>;
interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
#ifdef CONFIG_RGB1024X690
pinctrl-0 = <>911>;
interrupt-parent = <&gpio_b>;
interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
#endif
#ifdef CONFIG_LVDS_1024X768
pinctrl-0 = <>911>;
interrupt-parent = <&gpio_b>;
interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
#endif
reset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;
};
-
ft5x06: ft5x66838
ft5x06
是设备节点的标签。ft5x66838
是设备的名称,表示该设备是ft5x66838
型号的触摸屏控制器。
-
compatible = "cdt,edt-ft5406";
compatible
字段指示设备与哪些驱动程序兼容。这里指示设备支持edt-ft5406
驱动。
-
reg = <0x30>;
reg
字段定义了设备的地址。此处0x30
是设备的 I2C 地址。
-
pinctrl-names = "default";
pinctrl-names
字段指定设备的引脚控制名称,这里使用了default
。
-
pinctrl-0 = <&tsc2007 0>;
pinctrl-0
配置了该设备的引脚控制。这里的<&tsc2007 0>
是指向一个引脚控制配置的引用,这个引用可能在设备树的其他地方定义。
-
interrupt-parent = <&gpio_c>;
interrupt-parent
指定了中断的父控制器,这里为gpio_c
,即通过 GPIO 控制器 C 来管理中断。
-
interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
interrupts
配置了设备的中断信息。26
是中断号,IRQ_TYPE_EDGE_FALLING
表示该中断是边缘触发,且是下降沿触发。
-
#ifdef CONFIG_RGB1024X690
和#endif
- 这是条件编译指令,表示只有在配置中启用了
RGB1024X690
时,才会启用该部分的设备树配置。 - 该部分配置了触摸屏的引脚控制和中断,且中断号为
29
,触发方式是下降沿。
- 这是条件编译指令,表示只有在配置中启用了
-
#ifdef CONFIG_LVDS_1024X768
和#endif
- 同样是条件编译指令,表示只有在配置中启用了
LVDS_1024X768
时,才会启用该部分的设备树配置。 - 该部分与
RGB1024X690
配置类似,设置了相同的引脚控制和中断。
- 同样是条件编译指令,表示只有在配置中启用了
-
reset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;
reset-gpios
配置了设备的复位引脚。这里使用gpio_e
控制器的 GPIO 36 引脚,并且该引脚是低电平有效。