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只起了一个功能切换的作用。
欢迎转载,欢迎指正,更欢迎点赞。转载请附原文链接。