pinctrl子系統分析(一)
pinctrl子系統分析(二)
pinctrl子系統分析(三)
許多soc的內部都包含了pin控制器,通過pin控制器,我們可以匹配引腳的狀態和功能特性。在了解pinctrl子系統之前,我們先來了解一些基本的概念。
soc的很多引腳都可以配置成不同的功能,如a1和a2兩個引腳,既可以當作普通的gpio使用,又可以配置為i2c的scl和sda,也可以配置為其他功能等等,這稱作引腳的復用(簡稱pinmux)。
除此之外,還可以配置引腳的電氣屬性,如上拉/下拉、輸入/輸出等,這稱作引腳的配置(簡稱pinconf)。
有時需要將多個引腳組合在一起,以實現特定的功能,如spi介面、i2c介面等,需要以group為單位,訪問、控制多個pin,這就是pin groups。引腳復用的功能,稱作pin function。
一些soc為了設計靈活,同乙個功能,可以引出多個pin groups,如在晶元內部的i2c0的功能可能引出到pin groups ,也可能引出到另外乙個pin groups ,但毫無疑問,這兩個pin group不能同時active,畢竟晶元內部的i2c0的硬體邏輯只有乙個,也就是說乙個pin function可以對應多個pin groups。
pinctrl子系統,正是通過pin groups和pin function這兩個概念,來管理soc的引腳復用,pin function及pin groups一經確定,引腳的復用功能也就確認了。
pinctrl子系統的軟體架構,如下圖。
最底層是pin控制器,pin控制器驅動提供了引腳復用、配置的功能。pin control核心是乙個硬體無關模組,提供了pin控制器驅動的註冊、登出方法,從使用者角度給出了操作pin的介面,這樣,各個driver不需要關注pin控制器的底層硬體相關的內容。
上層的driver呼叫pin control核心介面的主要目標有兩個:
(1) 設定裝置的引腳功能復用
(2) 設定裝置的引腳電氣特性
此外,由於電源管理的要求,某個device可能處於某個電源管理狀態,例如idle或者sleep,這時候,屬於device的所有pin就會需要處於另外的狀態。
綜合上述的需求,就定義了pin control state的概念,也就是說裝置可能處於非常多的狀態中的乙個,裝置驅動可以切換裝置處於的狀態。為了方便管理pin control state就有了pin control state holder的概念,用來管理乙個裝置的所有的pin control state。核心用struct pinctrl_state資料結構抽象pin control state。
裝置的pin control state在裝置節點裡描述,如下圖例子:
pinctrl-names裡定義了2種狀態:default、sleep。
第0種狀態的引腳配置資訊在pinctrl-0中定義,第1種狀態的引腳配置資訊在pinctrl-1中定義,以此類推。每種狀態的引腳配置由乙個或多個裝置節點來描述,這些裝置節點裡面描述的配置資訊沒有統一標準,每家晶元都不太一樣,但都要位於pin控制器的裝置節點之下。
上層的driver可以呼叫以下函式來設定不同狀態下的裝置引腳配置:
//設定預設狀態下的引腳配置
static
inline
struct pinctrl * __must_check pinctrl_get_select_default
(struct device *dev)
;//根據name選擇某種狀態的引腳配置
static
inline
struct pinctrl * __must_check pinctrl_get_select
(struct device *dev,
const
char
*name)
;
驅動程式可以不用呼叫pinctrl_get_select_default函式,因為在device與driver的match之後,呼叫driver的probe之前,會呼叫pinctrl_bind_pins函式設定預設狀態下裝置的引腳設定:
static
intreally_probe
(struct device *dev,
struct device_driver *drv)
else
if(drv->probe)..
....
}
pinctrl_dev結構體,描述乙個pin控制器。乙個pin控制器,並不都是可以配置晶元上所有的引腳,有些晶元含有多個pin控制器,那麼系統上會註冊多個pinctrl_dev,註冊後會插入到全域性鍊錶pinctrldev_list裡,便於查詢。
pinctrl_dev結構體定義如下:
struct pinctrl_dev
;
pinctrl_dev結構體有一成員desc,資料型別為struct pinctrl_desc,描述了該pin控制器名字、可配置引腳個數及引腳的pinctrl_pin_desc,還有引腳復用的設定方法、引腳配置的設定方法等資訊,定義如下:
struct pinctrl_desc
;
註冊pin控制器,需要提供乙個pinctrl_desc結構體。
pinctrl_pin_desc結構體,描述由硬體平台提供的乙個引腳資訊,定義如下:
struct pinctrl_pin_desc
;
硬體平台提供的乙個引腳資訊會註冊進核心,核心使用pin_desc資料結構描述乙個引腳資訊,定義如下:
struct pin_desc
;
pinctrl_ops結構體,描述pin控制器的通用方法,定義如下:
struct pinctrl_ops
;
pinmux_ops 結構體,描述引腳復用的方法,定義如下:
struct pinmux_ops
;
pinconf_ops結構體,描述引腳配置的方法,定義如下:
struct pinconf_ops
;
pinctrl結構體,pin control state holder,也可以稱為管理者,用於管理乙個裝置不同狀態下的引腳配置,每個裝置有乙個,系統中的pinctrl會插入到全域性鍊錶pinctrl_list裡。
struct pinctrl
;
pinctrl_state結構體,描述乙個pin control state。
struct pinctrl_state
;
pinctrl子系統分析(二)
pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 pin控制器驅動的主要工作是,列舉pin控制器的資訊,如控制器有多少個引腳,支援多少個function,每個function對應幾個group,支援多少個group等,建立table儲存這些資訊,最後呼叫pin...
pinctrl子系統分析(三)
pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 這章講解配置節點的解析以及pinctrl state的pinctrl setting增添,先來個圖 create pinctrl static struct pinctrl create pinctrl str...
framebuffer 子系統分析
fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...