先總結一句:不管是單片機還是高端 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子系統的函數。
-
嵌入式
+關注
關注
5087文章
19148瀏覽量
306156 -
Linux
+關注
關注
87文章
11322瀏覽量
209857 -
軟件
+關注
關注
69文章
4973瀏覽量
87726 -
GPIO
+關注
關注
16文章
1212瀏覽量
52182 -
系統
+關注
關注
1文章
1017瀏覽量
21376
發布評論請先 登錄
相關推薦
評論