一、pinctrl子系统
(1)pinctrl子系统简介
pinctrl 子系统源码目录为 drivers/pinctrl 。
pinctrl 子系统重点是设置 PIN( PAD )的复用和电气属性。
pinctrl 子系统主要工作内容如下:
- 获取设备树中 pin 信息。
- 根据获取到的 pin 信息来设置 pin 的复用功能
- 根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
- 在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成。
(2)设备树中添加pinctrl节点
- 设备树中的 iomuxc 节点就是I.MX6ULL的IOMUXC外设对应的节点
- “iomuxc”节点下引用了 pinctrl_hog_1节点, Linux内核中的iomuxc驱动自动初始化pinctrl_hog_1 节点下的所有 PIN
在设备树(imx6ull-iot-emmc.dts)创建一个节点来描述 PIN 的配置信息
1、创建对应节点
2、添加“fsl,pins”属性
3、 在“ fsl,pins ”属性中添加 PIN 配置信息
例:
在 iomuxc 节点中的“imx6ul-evk ”子节点下添加“ pinctrl_test ”节点。
pinctrl_test: testgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具体设置值*/
>;
};(3)Linux 内核的 pinctrl 子系统实现原理
imx6ul_pinctrl_probe 函数就是 I.MX6ULL 这个 SOC 的 PIN 配置入口函数
函数调用路径:

二、gpio子系统
(1)gpio子系统简介
- gpio 子系统用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值等。
- 在设备树中添加 gpio 相关信息,在驱动程序中使用 gpio 子系统提供的 API 函数来操作 GPIO。
(2)gpio子系统API 函数
申请 GPIO 管脚 | int gpio_request (unsigned gpio, const char *label) gpio :要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信 息,此函数会返回这个 GPIO 的标号。 label :给 gpio 设置个名字。 返回值 : 0 :申请成功;其他值:申请失败 |
释放 GPIO 管脚 | void gpio_free (unsigned gpio) gpio :要释放的 gpio 标号 |
设置 GPIO 为输入 | int gpio_direction_input (unsigned gpio) gpio :要设置为输入的 GPIO 标号。 返回值 : 0 :设置成功;负值:设置失败 |
设置 GPIO 为输出 | int gpio_direction_output (unsigned gpio, int value) gpio :要设置为输出的 GPIO 标号。 value : GPIO 默认输出值。 返回值 : 0 :设置成功;负值:设置失败 |
获取 GPIO 的值 (0 或 1) | #define gpio_get_value __gpio_get_value int __gpio_get_value (unsigned gpio) gpio :要获取的 GPIO 标号。 返回值 : 非负值:得到的 GPIO 值;负值:获取失败 |
设置 GPIO 的值 | #define gpio_set_value __gpio_set_value void __gpio_set_value (unsigned gpio, int value) gpio :要设置的 GPIO 标号。 value : 要设置的值。 |
(3)设备树中添加gpio 节点
1、创建test 设备节点
2、添加pinctrl信息
3、添加GPIO 属性信息
例:
test {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_test>;
gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
};
(4)与gpio相关的OF 函数
获取设备树某个属性里面的 GPIO 数量 (统计任意属性的 GPIO 信息) | int of_gpio_named_count (struct device_node *np, const char *propname) np :设备节点。 propname :要统计的 GPIO 属性。 返回值 : 正值:统计到的 GPIO 数量;负值:失败 |
获取设备树某个属性里面的 GPIO 数量 (统计“gpios”属性的 GPIO 数量 ) | int of_gpio_count (struct device_node *np) np :设备节点。 返回值 : 正值:统计到的 GPIO 数量;负值:失败 |
获取 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 编号;负值:失败 |
版权声明:本文为p1279030826原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。