linux pinmux 引腳多路復(fù)用驅(qū)動(dòng)并沒(méi)有那么難
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、網(wǎng)上的文章一般都是分析pinctrl驅(qū)動(dòng)的,從頭到尾分析了一遍,搞的相當(dāng)復(fù)雜,實(shí)際上沒(méi)那么復(fù)雜
二、pinmux的概要分析,有關(guān)文件如下/pinctrl/core.c、/pinctrl/Pinmux.c、平臺(tái)相關(guān)的結(jié)構(gòu)體pinctrl_state,pinctrl_setting,pinmux_ops,pinctrl_desc,pinctrl_map,基本原理如下:
1、通過(guò)在平臺(tái)相關(guān)的pinctrl驅(qū)動(dòng)初始化函數(shù)pinctrl_probe,調(diào)用pinctrl_register函數(shù),將平臺(tái)相關(guān)的,已經(jīng)定義好的函數(shù)指針等通過(guò)結(jié)構(gòu)體封裝,傳給該函數(shù),相當(dāng)于已經(jīng)注冊(cè)好了;
2、不管是core.c里面的實(shí)現(xiàn),還是Pinmux.c里面的實(shí)現(xiàn),無(wú)非是最終會(huì)通過(guò)回調(diào)函數(shù),調(diào)用到上面提到的平臺(tái)相關(guān)的已經(jīng)定義好的實(shí)現(xiàn),包括以功能為依據(jù)的分組,比如SPI、UART的引腳的配置,完成引腳的功能配置
3、這就是linux下面抽象出了各種功能,形成了一個(gè)中間件,對(duì)上層app提供統(tǒng)一的接口,下層各個(gè)soc廠商按照定義好的格式對(duì)其進(jìn)行實(shí)現(xiàn),最后上層app就會(huì)調(diào)用到底層來(lái)
4、當(dāng)然,pinmux的實(shí)現(xiàn)利用了很多機(jī)制,比如鏈表的插入、遍歷等等
三、具體到代碼,如何調(diào)用API實(shí)現(xiàn)引腳功能復(fù)用呢?
1、直接在代碼中調(diào)用這個(gè)API即可,devm_pinctrl_get_select( struct device *dev, const char *name),參考其他地方的調(diào)用,可以直接針對(duì)功能進(jìn)行引腳復(fù)用的配置,當(dāng)然,前提是pinctrl-soc.c里面已經(jīng)做好了相關(guān)配置,這里的soc指的是ARM平臺(tái),比如高通、三星、MTK、TI等等。