一、前言
在嵌入式系統中,許多SoC的內部都包含了pin控制器,經過芯片內部的pin控制器,咱們能夠配置一個或者一組引腳的狀態和功能特性,Linux內核爲了統一各SoC廠商的引腳管理,提供了pinctrl子系統。linux
二、引腳功能分類
嵌入式芯片手冊每每有一個GPIO控制的章節來描述SoC的引腳如何進行配置,該描述具備大量的寄存器操做,可是經過配置這些寄存器實現的功能基本有三類,以下:數據結構
(1)經過設置pin controller硬件的控制單元,能夠實現架構
(1.1)引腳的功能配置,例如設定I/O引腳是普通的GPIO輸入輸出功能,仍是具備特殊功能的引腳;框架
(1.2)引腳特性配置,例如引腳內部的上/下拉電阻和驅動強度的設定。函數
(2)若是一組pin被配置成SPI,則將會和SPI controller鏈接,若是配置成了GPIO,則將會和GPIO controller進行鏈接,經過配置GPIO controller的寄存器,能夠實現
(2.1)設置GPIO的方向,例如輸入或者輸出;
(2.2)當GPIO設置爲輸出方向時,可以設定該引腳的電平是高電平仍是低電平;
(2.3)當GPIO設置爲輸入方向時,可以讀取該引腳的電平狀態。blog
(3)若是IO口具備中斷控制功能時,經過訪問IO口的中斷控制寄存器,能夠實現
(3.1)設置中斷控制是否使能;
(3.2)設置中斷的觸發方式,例如上升沿/降低沿觸發;
(3.3)經過設置寄存器將中斷狀態清除。接口
三、經過軟件抽象來掩蓋硬件差別
在Linux的內核的pinctrl系統架構中,使用了3個軟件模塊來對應上述的三類功能,以下:
(1)pinctrl子系統,用於pin controller硬件的驅動軟件子系統;
(2)GPIO subsystem,用於GPIO controller硬件的驅動軟件子系統;
(3)GPIO interrupt chip driver,該模塊做爲interrupt subsystem的底層硬件驅動模塊存在。
下圖爲pinctrl subsystem的模塊圖:ip
底層的specific pin controller driver是硬件相關的模塊,與嵌入式SoC相關,pin control core模塊是一個與硬件無關的模塊,它抽象了全部pin controller的硬件特性,它對用戶(other driver)提供了頂層的接口函數,所以,用戶再也不須要關注pin controller的硬件底層相關知識。ci
下圖則是GPIO subsystem的模塊圖:系統架構
該軟件框架圖和pinctrl subsystem的軟件框架圖同樣,其軟件抽象的思想是同樣的,內部的具體實現不同。
四、pinctrl子系統相關文件
(1)核心源文件
在kernel/drivers/pinctrl目錄下,包含了pinctrl子系統的核心驅動文件:
在最後的源文件pinctrl-xxx.c,舉個例子,例如高通msm提供的pinctrl子系統底層驅動文件有以下文件pinctrl-msm.c、pinctrl-msm.h、pinctrl-msm-tlmm.c。
(2)內核模塊提供的接口文件
Linux內核中不少模塊須要用到pinctrl子系統的服務,所以須要提供pinctrl子系統的外部接口和相關的數據結構,這些頭文件在kernel/include/linux/pinctrl目錄下,列表以下:
(3)與SoC相關的底層pinctrl子系統驅動接口
pinctrl子系統提供給底層驅動實現的頭文件以下:
五、pinctrl子系統與其它內核模塊關係
pinctrl子系統與其它內核模塊的關係圖以下所示:
在上圖能夠看到,GPIO子系統的管理歸屬於pinctrl子系統,而且pinctrl子系統與設備驅動模型也有密切的聯繫。