1.IOMUX概念
IOMUX概念的引出:SOC廠商為了推出功能豐富的核心板,以應對不同市場不同用戶的需求,引入了引腳復用-IOMUXC架構。
IOMUX架構:輸入輸出多路復用器(Input/Output Multiplexer ),說白了就是用有限的引腳資源實現盡可能多的功能,每個引腳最多可復用好幾種功能,每個功能又可以出現在不同的引腳上。
2.IOMUX引腳功能配置方法
IOMUX引腳功能配置,主要是對SOC芯片中IOMUXC控制器中的各寄存器作相應參數配置。
控制器中的寄存器主要分為三大類:
IOMUXC_SW_PAD_CTRL_X - 管腳控制寄存器
IOMUXC_SW_MUX_CTL_PAD_X - 輸出路由寄存器
IOMUXC_X_SELECT_INPUT - 輸入路由寄存器
在Linux內核中,我們定義引腳時,會用到以下6個參數,分別是:
_pad_ctrl_ofs - 控制寄存器的偏移地址(16進制)
_mux_ctrl_ofs - MUX控制寄存器的偏移地址(16進制),用於選擇引腳的功能
_mux_mode - MUX模式,bit0~3,范圍0~7
_select_input_ofs - SELECT_INPUT寄存器偏移地址(16進制)
_select_input - Daisy Chain模式,bit0~1,范圍0~3
_pad_ctrl - 引腳控制寄存器
關於前5個參數的配置方法,網上有很多文檔講的很好,很細致,這里就不再復述了。
而且在Linux內核的dtb目錄中,SOC廠商已經把各功能引腳的這五個參數的值寫到了相應的宏定義頭文件(xxx-pinfunc.h)中,直接查看即可,無需更改。
對應關系,如下例所示:
0x0694 | 0x02AC | 0x5 | 0x0000 | 0x0
--------------------------------------------------------------------------------------
mux_ctrl_ofs | pad_ctrl_ofs |sel_input_ofs | mux_mode | sel_input
這里主要講最后一個參數如何確定,因為最后一個參數往往需要我們自己在設備樹-dtb中添加或修改。
_PAD_CTRL的確定:
首先,要有soc芯片廠商提供的芯片使用手冊。
其次,翻閱到IOMUXC章節,找到對應引腳功能的MUX_PAD_CTRL寄存器,根據手冊說明確定其值即可。
比如,我在xxx-pinfunc.h頭文件中,查到A引腳可做GPIO1_IO01使用,那么我就在IOMUXC章節中搜索包括GPIO1_IO01和PAD_CTRL的寄存器即可。
若搜索不到,可以在External Signals and Pin Multiplexing章節搜索GPIO1_IO01,看看他被哪個功能名稱所替代,然后再用那個功能名稱去IOMUXC章節搜索即可。
最后,在設備樹的dtb中的iomux部分,添加該功能引腳定義即可。
如下例所示:
xxx-pinfunc.h中的功能引腳宏定義 | _pad_ctrl
--------------------------------------------------------------------------------------
MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x17059
3.IOMUX內部原理
以下分析是我的個人理解,如有不正確的地方,歡迎各位不吝指正。
IOMUX的寄存器配置是通過物理地址->總線地址一 一映射到復用控制器上的,將物理地址的參數值傳遞給掛載在總線的IOMUXC控制寄存器上,也就是引腳功能配置最終是靠IOMUXC控制器來完成。
引腳配置完成后,還需要配置具體功能的控制器里寄存器參數,這樣才能共同完成引腳的功能確定。IOMUXC只起了一個功能切換的作用。
歡迎轉載,歡迎指正,更歡迎點贊。轉載請附原文鏈接。