先总结一句:不管是单片机还是高端 ARM 平台,最底层都是寄存器,硬件之上就是寄存器,任何封装形式到最底层就是操作寄存器。
对于上了 Linux 系统的平台,我们有其他方法,让它可以像单片机一样简单的操作 IO 口,这得益于各路 Linux 大神对系统底层的封装。
在 Linux 中有 pinctrl 和 gpio 子系统,它们提供了 API 接口给你使用,让你方便的操控 GPIO 口。
Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对 GPIO 的配置推出了 gpio 子系统。
上面这句话很重要,我详细解释一下:这里是将 pin 脚和控制 IO 口输入输出分离。
pinctrl 子系统管理 200 个 IO 口的上拉下拉电阻,电流驱动能力,是硬件底层的存在。如果 pinctrl 将某个 pin 脚初始化成了普通GPIO 而不是 IIC 或者 SPI,那么接下来我们就可以使用 gpio 子系统的 API 去操作 IO 口输出高低电平。
传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置 方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成,pinctrl子系统源码目录为 drivers/pinctrl。
注意,pinctrl 子系统也是一个标准的 platform 驱动,当设备和驱动匹配的时候,probe 函数会执行,只是 pinctrl 子系统采用的arch_initcall 去声明,而不是module_init(device_initcall),所以在系统起来的时候它会先加载。(具体原因看下面这篇文章)
Linux 驱动挂载顺序分析
gpio
可以看出其实两者软件框架一样的,主要是 HW Abstract layer 具体实现不一样。
你以为两者是分离的,实际上不是的,gpio 子系统是基于 pinctrl 子系统的,gpio 的 API 接口的实现很多都是基于 pinctrl子系统的函数。
-
嵌入式
+关注
关注
5096文章
19199浏览量
308290 -
Linux
+关注
关注
87文章
11354浏览量
210660 -
软件
+关注
关注
69文章
5034浏览量
88184 -
GPIO
+关注
关注
16文章
1217浏览量
52485 -
系统
+关注
关注
1文章
1020浏览量
21447
发布评论请先 登录
相关推荐
一文搞懂Linux pinctrl/gpio子系统
从需求的角度去理解Linux系列:总线、设备和驱动
从Windows平台迁移到Linux平台怎么实现?
Linux系统的功耗研究
Linux 驱动 = 软件框架 + 硬件操作
基于Linux的XFRM框架下IPSec VPN的研究
嵌入式Linux软件测试框架的研究
如何在嵌入式Linux中使用GPIO
Linux DMA Engine框架的介绍
嵌入式Linux驱动开发从基础到框架
![嵌入式<b class='flag-5'>Linux</b>驱动开发<b class='flag-5'>从</b>基础到<b class='flag-5'>框架</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
从硬件软件角度理解Gadget框架
![<b class='flag-5'>从</b>硬件<b class='flag-5'>软件</b>角度理解Gadget<b class='flag-5'>框架</b>](https://file1.elecfans.com/web2/M00/8C/A3/wKgaomSvbR2AEoUiAAWGHZ-svJI275.jpg)
评论