Linux Pin Control 子系統


Pin Control Subsystem是Linux內核抽象出的一套用於控制硬件引腳的一套子系統。

1、源文件列表

源碼位於linux/drivers/pinctrl目錄下,源文件列表如下:

文件名 描述
core.c core.h pin control subsystem的core driver
pinctrl-utils.c pinctrl-utils.h pin control subsystem的一些utility接口函數
pinmux.c pinmux.h pin control subsystem的core driver(pin muxing部分的代碼,也稱為pinmux driver)
pinconf.c pinconf.h pin control subsystem的core driver(pin config部分的代碼,也稱為pin config driver)
devicetree.c devicetree.h pin control subsystem的device tree代碼
pinctrl-xxxx.c 各種pin controller的low level driver。

在pin controller driver文檔中 ,我們以2416的pin controller為例,描述了一個具體的low level的driver,這個driver涉及的文件包括pinctrl-samsung.c,pinctrl-samsung.h和pinctrl-s3c24xx.c,具體位於ux/drivers/pinctrl/samsung目錄。

2、和其他內核模塊接口頭文件

很多內核的其他模塊需要用到pin control subsystem的服務,這些頭文件就定義了pin control subsystem的外部接口以及相關的數據結構。我們整理linux/include/linux/pinctrl目錄下pin control subsystem的外部接口頭文件列表如下(在4.1內核中已經找不到以下文件):

文件名 描述
consumer.h 其他的driver要使用pin control subsystem的下列接口: 
a、設置引腳復用功能 
b、配置引腳的電氣特性 
這時候需要include這個頭文件
devinfo.h 這是for linux內核的驅動模型模塊(driver model)使用的接口。struct device中包括了一個struct dev_pin_info    *pins的成員,這個成員描述了該設備的引腳的初始狀態信息,在probe之前,driver model中的core driver在調用driver的probe函數之前會先設定pin state
machine.h 和machine模塊的接口。

 

3、Low level pin controller driver接口

我們整理linux/include/linux/pinctrl目錄下pin control subsystem提供給底層specific pin controller driver的頭文件列表如下:

 

文件名 描述
pinconf-generic.h 這個接口主要是提供給各種pin controller driver使用的,不是外部接口。
pinconf.h pin configuration 接口
pinctrl-state.h pin control state狀態定義
pinmux.h pin mux function接口

 

pin control subsystem的主要功能包括:

(A)管理系統中所有可以控制的pin。在系統初始化的時候,枚舉所有可以控制的pin,並標識這些pin。

(B)管理這些pin的復用(Multiplexing)。對於SOC而言,其引腳除了配置成普通GPIO之外,若干個引腳還可以組成一個pin group,形成特定的功能。例如pin number是{ 0, 8, 16, 24 }這四個引腳組合形成一個pin group,提供SPI的功能。pin control subsystem要管理所有的pin group。

(C)配置這些pin的特性。例如配置該引腳上的pull-up/down電阻,配置drive strength等。

 

Pin Control Subsystem和GPIO subsystem交互

為何pin control subsystem要和GPIO subsystem交互?

作為軟件工程師,我們期望的硬件設計應該如下圖所示:

GPIO的HW block應該和其他功能復用的block是對等關系的,它們共同輸入到一個復用器block,這個block的寄存器控制哪一個功能電路目前是active的。pin configuration是全局的,不論哪種功能是active的,都可以針對pin進行電氣特性的設定。這樣的架構下,上圖中紅色邊框的三個block是完全獨立的HW block,其控制寄存器在SOC datasheet中應該是分成三個章節描述,同時,這些block的寄存器應該分別處於不同的地址區間。

對於軟件工程師,我們可以讓pin control subsystem和GPIO subsystem完全獨立,各自進行初始化,各自映射自己的寄存器地址空間,對於pin control subsystem而言,GPIO和其他的HW block沒有什么不同,都是使用自己提供服務的一個軟件模塊而已。然而實際上SOC的設計並非總是向軟件工程師期望的那樣,有的SOC的設計框架圖如下:

這時候,GPIO block是alway active的,而紅色邊框的三個block是緊密的捆綁在一起,它們的寄存器占據了一個memory range(datasheet中用一個章節描述這三個block)。這時候,對於軟件工程師來說就有些糾結了,本來不屬於我的GPIO控制也被迫要參與進來。這時候,硬件寄存器的控制都是pin controller來處理,GPIO相關的操作都要經過pin controller driver,這時候,pin controller driver要作為GPIO driver的back-end出現。

 Reprinted From:http://www.wowotech.net/gpio_subsystem/pin-control-subsystem.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM