现在大多数的主流ARM处理器由于管脚数目的限制,大部分的PIN脚都是好几个功能复用。内部信号传送到管脚,或者从管脚传送信号到芯片内部模块都是通过选择配置一个叫做IOMUX的输入输出多路复用器。IOMUX在配置管脚复用功能的同时还负责配置管脚的一些例如:电平,驱动强弱,迟滞等…… 
基于这个原因用户在使用I.MX6处理器的某一个pin脚上的功能时必须先按管脚特性及功能先配置IOMUX控制器上一系列的寄存器。 下面我们就来理一理整个过程。
首先,我们想要知道CPU pin脚上复用了哪些功能的话我们就要先查看下CPU数据手册“External Signals and Pin Multiplexing”章节,我们截取如下部分:

我们从这个表格可以看到: SD2_DAT1 pin 上共复用有ALT0—-ALT6 7个功能,如果你需要用USDHC2 控制器的 DAT1信号的话就需要选择ALT0模式。
其次,关于IOMUX控制器如何设置管脚特性就需要查看cpu数据手册“IOMUX Controller”章节了。下面是IOMUX控制器的一个结构框图:IOMUX控制器与IOMUX单元一起完成了输入输出管脚的复用。

IOMUX控制器包含4类寄存器:
1. 通用寄存器,包含关键字IOMUXC_GPRx-负责PLL频率,电压等通用设置。
2. 菊花链控制寄存器,包含关键字IOMUX_XXXXX_SELECT_INPUT控制从芯片外部哪一个pad连接到内部哪个模块(因为可能不止一个pin可以配置成对应的功能)。
3. MUX 控制寄存器,负责更改Pin脚对应的功能,可以单个pin脚配置也可以以组为单位配置:

  • IOMUXC_SW_MUX_CTL_PAD_<PAD NAME>
  • IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>

4. PAD控制寄存器,负责PIN脚的一些特性设置如:上下拉电阻,开漏,SLOW 等等。

  • IOMUXC_SW_PAD_CTL_PAD_<PAD NAME>
  • IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>

了解完上面的信息我们就可以动手设置了: