若该文为原创文章,转载请注明原文出处。
一、介绍
二、设备树框架
1、设备树节点
led_gpio:led-gpio {
compatible = "fsl,gpio-led-test";
#address-cells = <1>;
#size-cells = <1>;
pinctrl-names = "default";
status = "okay";
led1-gpio:led1 {
compatible = "fsl,led1-test";
pinctrl-0 = <&pinctrl_led>;
gpios-led = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>;
status = "okay";
};
beep-gpio:beep {
compatible = "fsl,beep-test";
pinctrl-0 = <&pinctrl_beep>;
gpios-beep = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
status = "okay";
};
};
1、节点
led_gpio:led-gpio 前面是节点标签(label),“:”后面的才是节点名字
即节点是led-gpio
里面的led1:led1-gpio是led-gpio子节点,节点为led1
2、compatible 属性
用于将设备和驱动绑定起来,字符串列表用于选择设备所要使用的驱动程序。
一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设
备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个
驱动
struct of_device_id led_tbl[]={
{.c = "led-gpio",}, // led-gpio 对应compatible 名称
};
3、gpios-led
指定了与该设备相关联的 GPIO。&gpiol 表示 GPIO 控制器的句柄(handle),
RK_PC0 是与该 GPIO 相关的资源描述符(resource specifier)
GPIO_ACTIVE_HIGH 表示 GPIO 的
默认电平为高电平。
4、pinctrl-names 和 pinctrl-0
用于指定引脚控制器(pinctrl)的配置。
pinctrl-names 表示引脚控制器配置的名称,这里为 "default"。
pinctrl-0 指定了与该配置相关联的引脚控制器句柄,这里为 &led_gpio_ctrl。
2、pinctrl 节点
led-gpios {
/omit-if-no-ref/
pinctrl_led: led-pin {
rockchip,pins =
<0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
};
pinctrl_beep: beep-pin {
rockchip,pins =
<0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
在设备树中,pinctrl
节点用于定义引脚控制配置
1、led-gpios
led-gpios的设备节点
2、pinctrl_led
这是子节点的名称,表示引脚控制配置的具体实现, led-pin为标签
3、rockchip,pins
这是一个特定于Rockchip平台的引脚配置属性。它指定了引脚编号、引脚名称和引脚功能。在这个例子中,<0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>
表示:
-
0
: 引脚编号,通常是一个整数,表示引脚在芯片上的位置。 -
RK_PC0
: 引脚名称,表示引脚的标识符。 -
RK_FUNC_GPIO
: 引脚功能,表示引脚将被用作通用输入输出(GPIO)功能。 -
&pcfg_pull_none
: 可选的引脚配置选项,表示没有上拉/下拉电阻。
三、常用的函数
1、of_find_node_by_name 函数
of_find_node_by_name 函数通过节点名字查找指定的节点
2、of_find_node_by_type 函数
of_find_node_by_type 函数通过 device_type 属性查找指定的节点
3、of_find_compatible_node 函数
of_find_compatible_node 函数根据 device_type 和 compatible 这两个属性查找指定的节点,
4、of_find_matching_node_and_match 函数
of_find_matching_node_and_match 函数通过 of_device_id 匹配表来查找指定的节点
5、of_find_node_by_path 函数
of_find_node_by_path 函数通过路径来查找指定的节点
比如:
/* 1、获取设备节点:gpioled */
gpioled.nd[0] = of_find_node_by_path("/leds/led1");
/* 2、 获取设备树中的 gpio 属性,得到 LED 所使用的 LED 编号 */
gpioled.gpios[0] = of_get_named_gpio(gpioled.nd[0], "gpios-led", 0);
如有侵权,或需要完整代码,请及时联系博主。