Bootstrap

向设备树中添加pinctrl节点与gpio节点的方法

一.  简介

前面几篇文章了解了 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驱动的一些开发。

;