一. 简介
前面在设备树文件中,创建了 Led设备节点。如下所示:
gpioled{
compatible = "alientek, gpioled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpioled>;
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
status = "okay";
};
这里Led设备节点中,定义了一个名为 “led-gpio” 的属性,led-gpio属性描述了 gpioled 这个设备所使用的 GPIO。在驱动程序中需要读取 gpio 属性内容,Linux 内核提供了几个与 GPIO 有关的 OF 函数。
二. 与 gpio子系统相关的OF函数
1、of_gpio_named_count 函数
of_gpio_named_count
函数用于获取设备树某个属性里面定义了几个
GPIO 信息。此函数原型如下:
int of_gpio_named_count(struct device_node *np, const char *propname)
函数参数和返回值含义如下:
np
:设备节点。
propname
:要统计的
GPIO
属性。
返回值:
正值,统计到的
GPIO
数量;负值,失败。
要注意的是,当为
空的 GPIO 信息时,of_gpio_named_count
函数也会统计到,比如:
gpios = <0
&gpio1 1 2
0
&gpio2 3 4>;
上述代码的 “
gpios
” 节点一共定义了
4
个
GPIO
,但是有
2
个是空的,没有实际的含义。
通过
of_gpio_named_count
函数统计出来的
GPIO
数量就是
4
个。
2、of_gpio_count 函数
和
of_gpio_named_count
函数一样,但是不同的地方在于,此函数统计的是“
gpios
”这个属性的
GPIO
数量,而
of_gpio_named_count
函数可以统计任意属性的
GPIO
信息,函数原型如下
所示:
int of_gpio_count(struct device_node *np)
函数参数和返回值含义如下:
np
:设备节点。
返回值:
正值,统计到的
GPIO
数量;负值,失败。
3、of_get_named_gpio 函数
此函数获取
GPIO
编号,因为
Linux
内核中关于
GPIO
的
API
函数都要使用
GPIO
编号,
此函数会将设备树中类似
<&gpio5 7 GPIO_ACTIVE_LOW>
的属性信息转换为对应的
GPIO
编
号。
注意:此函数在驱动中使用很频繁!
函数原型如下:
int of_get_named_gpio(struct device_node *np, const char *propname, int index)
函数参数和返回值含义如下:
np
:设备节点。
propname
:包含要获取
GPIO
信息的属性名。
index
:
GPIO
索引,因为一个属性里面可能包含多个
GPIO
,此参数指定要获取哪个
GPIO的编号,如果只有一个
GPIO
信息的话此参数为
0
。
返回值:
正值,获取到的
GPIO
编号;负值,失败。