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