pinctrl 和 gpio 子系统详解

一、pinctrl 和 gpio 子系统简介

1、为什么要引入 pinctrl 和 gpio 子系统?

【答】:前面编写的基于设备树的 LED 驱动,本质上还是配置 LED 使用的 GPIO 寄存器,驱动开发方式和裸机基本没区别。Linux 内核提供了 pinctrl 和 gpio 子系统用于 GPIO 驱动,借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。

2、pinctrl 子系统和 gpio 子系统区别与联系?
在这里插入图片描述

如果 pinctrl 子系统将 PIN 复用为 GPIO,那么接下来就要配置 gpio 子系统,且 gpio 子系统依赖于 pinctrl 子系统来实现。

pinctrl 子系统作用:从设备树中获取 PIN 的描述信息来设置 PIN 的复用和电气属性,PIN 可复用为 I2C、SPI、GPIO。

gpio 子系统作用:初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值等。

二、pinctrl 子系统

我们需要在设备树里面设置 PIN 的配置信息,因为 pinctrl 子系统要根据你提供的信息来配置 PIN 功能,一般会在设备树里面创建一个节点来描述 PIN 的配置信息。

至于 pinctrl 子系统如何运行、如何设置 pin 复用和电气属性,最终肯定仍要初始化寄存器,这部分已由半导体厂商写好。

1、根据 iomuxc 节点下的兼容值 “fsl,imx6ul-iomuxc” 找到它会匹配到 pinctrl-imx6ul.c 驱动文件,这个驱动文件经过一系列调用会解析设备树并获取设备树中关于 PIN 的配置信息。

2、设备树中添加 pinctrl 节点
在这里插入图片描述
<mux_reg conf_reg input_reg mux_mode input_val>
3、属性名字一定要为 “fsl,pins”,pinctrl 驱动程序是通过读取 “fsl,pins” 属性值来获取 PIN 的配置信息。
在这里插入图片描述
4、使用 pinctrl 系统的设备

(1)使用 pinctrl 系统的设备,它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。

(2)然后我们在驱动中通过 OF 函数来访问节点中的属性值来配置 GPIO。

四、gpio 子系统

如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统。gpio 子系统用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值等。

我们需要做的工作:在设备树根节点下添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API 函数来操作 GPIO。

pinctrl 配置好后就是设置 gpio 了, 驱动程序如何知道控制 LED 灯亮灭的引脚连接的 GPIO1_IO03 呢?

【答】:添加 gpio 节点信息,在设备节点中创建一个属性,此属性描述所使用的 gpio 引脚,然后驱动程序通过 OF 函数来获取属性值配置 GPIO。

1、设备树中如何添加 gpio 节点?

(1)根节点下创建 gpioled 设备节点。

(2)添加 pinctrl 信息描述 pin 复用及电气属性。

(3)添加 GPIO 属性信息描述使用的 gpio 引脚。

2、驱动节点信息分析
在这里插入图片描述
在这里插入图片描述
3、当实现 GPIO 子系统后,我们就可以:

(1)在设备树里指定 GPIO 引脚。

(2)在驱动代码中使用 GPIO 子系统的标准函数获得 GPIO、设置 GPIO 方向、读取/设置 GPIO 值。这样的驱动代码与板子无关。

4、在驱动代码中调用 gpio 子系统

通过 OF 函数从设备树中获取要使用的 gpio 信息。
在这里插入图片描述

五、如何编写驱动程序

1、检查 PIN 是否被其他外设使用

如果 A 引脚在设备树中配置为了 I2C 的 SDA 信号,那么 A 引脚就不能再配置为 GPIO,否则的话驱动程序在申请 GPIO 的时候就会失败。

(1)检查复用,也就是 pinctrl 设置,即搜索 “MX6UL_PAD_GPIO1_IO03__GPIO1_IO03” 是否有冲突。

(2)如果这个 PIN 配置为 GPIO 的话,检查这个 GPIO 有没有被别的外设使用,即搜索 “&gpio1 3” 是否有冲突。

2、我们自定义的 gpioled 节点中描述了使用的 gpio 引脚、pin 复用及电气属性,我们通过 OF 函数来获取 gpioled 节点的信息用于初始化 LED 所使用的 GPIO。
在这里插入图片描述
3、取消掉了配置寄存器的过程,改为使用 Linux 内核提供的 API 函数。在 GPIO 操作上更加的规范化,符合 Linux
代码框架,而且也简化了 GPIO 驱动开发的难度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值