一 简介
上一章我们编写了基于设备树的
LED
驱动,但是驱动的本质还是没变,
都是配置 LED 灯
所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别
。
Linux
是一个庞大而完善的系统,
尤其是驱动框架,像
GPIO
这种最基本的驱动不可能采用“原始”的裸机驱动开发方式,否则
就相当于你买了一辆车,结果每天推着车去上班。
Linux
内核提供了
pinctrl
和
gpio
子系统用于
GPIO
驱动,本章我们就来学习一下如何借助
pinctrl
和
gpio
子系统来简化
GPIO
驱动开发。
没什么特别注意的 记忆就行了
二 pinctrl 子系统
2.1 pinctrl 子系统简介
Linux 驱动讲究驱动分离与分层,pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物,
驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架,关于驱动的分
离与分层我们后面会讲。本来
pinctrl
和
gpio
子系统应该放到驱动分离与分层章节后面讲解,但
是不管什么外设驱动,
GPIO
驱动基本都是必须的,而
pinctrl
和
gpio
子系统又是
GPIO
驱动必
须使用的,所以就将
pintrcl
和
gpio
子系统这一章节提前了。
我们先来回顾一下上一章是怎么初始化
LED
灯所使用的
GPIO
,步骤如下:
①、修改设备树,添加相应的节点,节点里面重点是设置 reg 属性,reg 属性包括了 GPIO相关寄存器。②、获取 reg 属性中 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 这两个寄存器地址,并且初始化这两个寄存器,这两个寄存器用于设置 GPIO1_IO03 这个 PIN 的复用功能、上下拉、速度等。③、在②里面将 GPIO1_IO03 这个 PIN 复用为了 GPIO 功能,因此需要设置 GPIO1_IO03这个 GPIO 相关的寄存器,也就是 GPIO1_DR 和 GPIO1_GDIR 这两个寄存器。
总结一下,②中完成对
GPIO1_IO03
这个
PIN
的初始化,设置这个
PIN
的复用功能、上下
拉等,比如将
GPIO_IO03
这个
PIN
设置为
GPIO
功能。③中完成对
GPIO
的初始化,设置
GPIO
为输入
/
输出等。如果使用过
STM32
的话应该都记得,
STM32
也是要先设置某个
PIN 的复用功
能、速度、上下拉等,然后再设置 PIN 所对应的 GPIO。其实对于大多数的 32 位 SOC 而言,引
脚的设置基本都是这两方面,因此
Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于 GPIO
的配置推出了 gpio 子系统
。本节我们来学习
pinctrl
子系统,下一节再学习
gpio
子系统。
大多数
SOC
的
pin
都是支持复用的,比如
I.MX6ULL
的
GPIO1_IO03
既可以作为普通的
GPIO
使用,也可以作为
I2C1
的
SDA
等等。此外我们还需要配置
pin
的电气特性,比如上
/
下
拉、速度、驱动能力等等。传统的配置
pin
的方式就是直接操作相应的寄存器,但是这种配置
方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引
入的,
pinctrl
子系统主要工作内容如下:
①、获取设备树中

文章介绍了Linux内核如何通过pinctrl子系统简化GPIO驱动开发,强调了驱动分离与分层的思想,并详细解析了pinctrl子系统的工作内容和如何在设备树中配置PIN信息。通过对I.MX6ULLSoC的设备树配置举例,阐述了PIN的配置信息和外设关联。
最低0.47元/天 解锁文章
7606

被折叠的 条评论
为什么被折叠?



