i.MX6ULL(十八) linux pinctrl 子系统

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

一 简介

上一章我们编写了基于设备树的 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 子系统主要工作内容如下:
①、获取设备树中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值