先總結一句:不管是單片機還是高端 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子系統的函數。
-
嵌入式
+關注
關注
5095文章
19189瀏覽量
307979 -
Linux
+關注
關注
87文章
11351瀏覽量
210504 -
軟件
+關注
關注
69文章
5028瀏覽量
88137 -
GPIO
+關注
關注
16文章
1217瀏覽量
52436 -
系統
+關注
關注
1文章
1020瀏覽量
21440
發布評論請先 登錄
相關推薦
一文搞懂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)
評論