一. 简介
前面几篇文章了解了 Linux内核的 pinctrl子系统与 gpio子系统。这两个子系统是针对 gpio驱动开发提供的。
本文学习向设备树文件中添加一个设备节点信息,在 Linux 内核所提供的 pinctrl子系统与 gpio子系统的基础上进行的 gpio驱动开发。
注意:这里假设所使用的是正点原子的 EMMC版ALPHA开发板。所以,针对EMMC版的开发板的设备树文件为 imx6ull-alientek-emmc.dts
二. 向设备树文件中添加pinctrl节点
pinctrl子系统主要是针对 配置 gpio复用功能与 gpio的电器属性。接下来我们学习一下如何在设备树中添加某个外设 的 PIN 信息。
关于 I.MX 系 列 SOC 的 pinctrl 设备树绑定信息可以参考文档(Linux内核源码根目录下):
Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt。
这里我们虚拟一个名为 “led
” 的设
备,
假设 设备dev
使用了
GPIO1_IO00
这个
PIN
的
GPIO
功能,
pinctrl
节点添加过程如下:
1、创建对应的节点
同一个外设的
PIN
都放到一个节点里面,打开
imx6ull-alientek-emmc.dts
,在
iomuxc
节点中的 “
imx6ul-evk
” 子节点下添加 “
pinctrl_led
” 节点,注意!节点前缀一定要为“
pinctrl_
”。添
加完成以后如下所示:
pinctrl_led: ledgrp {
/* 具体的 PIN 信息 */
};
2、添加“fsl,pins”属性
设备树是通过属性来保存信息的,因此,我们需要添加一个属性。
属性名字一定要为 “
fsl,pins
”,
因为对于
I.MX
系列
SOC
而言,
pinctrl
驱动程序是通过读取 “
fsl,pins
” 属性值来获取
PIN
的配
置信息,完成以后如下所示:
pinctrl_led: ledgrp {
fsl,pins = <
/* 设备所使用的 PIN 配置信息 */
>;
};
3、在“fsl,pins”属性中添加 PIN 配置信息
最后在“
fsl,pins
”属性中添加具体的
PIN
配置信息,完成以后如下所示:
pinctrl_led: ledgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具体设置值*/
>;
};
至此,我们已经在
imx6ull-alientek-emmc.dts
文件中添加好了
test
设备所使用的
PIN
配置信息。
三. 向设备树文件中添加gpio节点
上面完成了 gpio 的 PIN配置,即复用功能与配置电气属性。
这里学习如何向设备树下创建一个 GPIO 节点。
1、创建 test 设备节点
在设备树的根节点 “
/
” 下创建
led
设备子节点,如下所示:
led {
/* 节点内容 */
};
2、添加 pinctrl 信息
在添加pinctrl节点的学习中,
我们创建了
pinctrl_led
节点,此节点描述了
test
设备所使用的
GPIO1_IO00
这
个
PIN
的信息,我们要将这节点添加到
test
设备节点中,如下所示:
test {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_led>;
/* 其他节点内容 */
};
第
2
行,添加
pinctrl-names
属性,此属性描述
pinctrl
名字为“
default
”。
第
3
行,添加
pinctrl-0
节点,此节点引用
上面创建 pinctrl方法中的
pinctrl_led
节点,表示 led
设备
的所使用的
PIN
信息保存在
pinctrl_test
节点中。
3、添加 GPIO 属性信息
我们最后需要在
test
节点中添加
GPIO
属性信息,表明
test
所使用的
GPIO
是哪个引脚,添加完成以后如下所示:
test {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_led>;
gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
};
第
4
行,
test
设备所使用的
gpio
。
关于
pinctrl
子系统和
gpio
子系统就讲解到这里,接下来就使用
pinctrl
和
gpio
子系统来驱
动
I.MX6ULL-ALPHA
开发板上的
LED
灯。
三. 总结
以上的共同完成了 向设备树文件添加 设备节点信息,具体添加 pinctrl节点信息与gpio节点信息。
在此基础上就可以进行(Linux内核中的基于 pinctrl子系统与 gpio子系统)gpio驱动的一些开发。