【Linux驱动开发】pinctrl 子系统 与 gpio 子系统

一、pinctrl子系统

(1)pinctrl子系统简介

pinctrl 子系统源码目录为 drivers/pinctrl 

pinctrl 子系统重点是设置 PIN( PAD )的复用和电气属性。

pinctrl 子系统主要工作内容如下:

  • 获取设备树中 pin 信息。
  • 根据获取到的 pin 信息来设置 pin 的复用功能
  • 根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
  • 在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成。

(2)设备树中添加pinctrl节点

  • 设备树中的 iomuxc 节点就是I.MX6ULLIOMUXC外设对应的节点
  • 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版权协议,转载请附上原文出处链接和本声明。