IOMUX是指引脚功能复用功能配置,MUX是指multiplex多路复用的意思,由于芯片硬件引脚资源有限,但又想实现尽可能多的功能,于是芯片厂商,就实现了一个引脚可复用为多路功能的设计。不同厂家的SOC芯片有不同的配置方法,下面我们讲i.MX6ULL的引脚功能复用的配置方法。
下边以背光引脚为例进行讲解。
接下来我们查看硬件资料中的<<FETMX6ULx-S核心板管脚功能分配表20200624.xlsx>>
核心板管脚功能分配表中,第一列是连接器的引脚编号;第二列是信号名称;第三列是开发板默认功能;第四列是功能描述;Alt0-Alt5表示该引脚可以复用成的功能,能够看出63引脚可以复用成pwm1,wdog1,spdif,csi.VSYNC,usdhc2.VSELECT,gpio1.IO8。
与软件中是如何对应的呢,打开源码中arch/arm/boot/dts/imx6ull-elf1-emmc.dts,其中背光节点backlight节点引用了pwm1标签。
接下来搜索pwm1标签,pinctrl-0属性中定义了引脚的复用状态:
进一步搜索pinctrl_pwm1标签:
其中GPIO1_IO08是引脚的信号名称,PWM1_OUT为此引脚复用成的功能。那MX6UL_PAD_GPIO1_IO08__PWM1_OUT这个宏是在哪里定义的呢?我们打开arch/arm/boot/dts/imx6ull-pinfunc.h,在文件中搜索信号名称GPIO1_IO08:
搜索发现此文件中没有没有这个引脚的相关描述。
这个文件还引用了imx6ul-pinfunc.h,因为imx6ull与imx6ul有一些通用的配置,所以就把通用的部分都放到了imx6ul-pinfunc.h文件中,然后把差异的部分放到imx6ull-pinfunc.h中来描述。
接下来再打开arch/arm/boot/dts/imx6ul-pinfunc.h,搜索信号名称GPIO1_IO08,能搜索到如下宏定义。其中GPIO1_IO08能复用成9种功能,我们使用到的是第一种PWM1_OUT。
将其展开为:0x007C 0x0308 0x0000 0x0 0x0 0x110b0
0x007C | 0x0308 | 0x0000 | 0x0 | 0x0 | 0x110b0
----------------------------------------------------------------------------------------------------------------------
mux_ctrl_ofs | pad_ctrl_ofs | sel_input_ofs | mux_mode | sel_input | pad_ctrl
注意:下述参考手册为《IMX6ULLRM.pdf》找到32章节IOMUX Controller
此章节IOMUXC Memory Map/Register Definition中的IOMUXC中有两类描述,一类是IOMXUC_SW_MUX_CTL_PAD,另一类是IOMUXC_SW_PAD_CTL_PAD。其中IOMXUC_SW_MUX_CTL_PAD描述的是复用寄存器;IOMUXC_SW_PAD_CTL_PAD描述的是电气属性寄存器。
先查看复用寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO08。
从下图可以看到此引脚复用寄存器的偏移地址就是7C,想把此引脚复用成pwm1,需要选择ALT0,所以mux_ctrl_ofs为0x007C,mux_mode为0x0
pad_ctrl_ofs为电气属性寄存器的偏移地址0x0308,并根据pad_ctrl的值(0x110b0)来设置此寄存器。此寄存器主要时配置一些内部上下拉电阻,转换速率,引脚驱动强度等电气属性。
我们以一个引脚为例来介绍IOMUX,相信通过这个实例,我们对如何将一个引脚复用成想用的功能有了清晰的理解,接下来我们通过理解ELF 1开发板的接口功能的适配,进一步强化这方面的技能,通过后边内容的加强,您很快就可以自己实现自己的软件接口适配了。