IOMUX Controller (IOMUXC) IO多路复用控制器
1.1概述
IOMUXC和IOMUX使IMX6能够多个功能模块公用一个pad. 共用是通过对pad的输入/输出信号的多路复用技术来实现的.每一个模块需要一个特定的pad设置, 且对于每一个pad, 有多达8个复用选择(称为ALT(alternative)). 这些pad设置通过IOMUXC控制.IOMUX由多个基本的IOMUX单元的组合逻辑构成. 每一个基本的IOMUX单元只能处理一个pad的信号复用.
1.2 特性
32位软件多路控制寄存器(IOMUXC_SW_MUX_CTL_PAD_<PADNAME> or IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>)配置8个可选(ALT)多路复用模式位域, 并强制设置pad输入路径(通过SION bit)
32位软件pad控制寄存器(IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME> or IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>)对每一个pad配置特定的pad设置
32位通用寄存器14个(GPR0 to GPR13), 32位寄存器根据SoC需求用于任何使用
32位输入选择控制器用于控制输入路径到一个模块当不止一个pad驱动这个模块输入时每一个SW MUX/PAD CTL IOMUXC寄存器只能处理一个pad或一个pad组。
1.3 功能模块
IOMUXC由两个子模块组成:
IOMUXC_REGISTERS包含所有的IOMUXC寄存器;
IOMUXC_LOGIC包含所有IOMUXC组合逻辑(IP接口控制, 地址解码)。
GPIO在基于i.MX6的Linux3.0.35内核中的配置:
1)GPIO管脚特定模式的相关配置在arch/arm/mach-mx6/iomux_mx6q.h文件中。
2)GPIO的宏定义配置参数在iomux-v3.h文件中
3)GPIO板级初始化管脚在board-mx6q_sabresd.h文件中
1.4 板级初始化说明
1.4.1 GPIO的首次调用
mx6_sabresd_board_init
上面的mx6q_sabresd_pads是一个数组结构,里面定义了gpio的引脚。
iomux_v3_cfg_t的数据域分布如下:
MUX_CTRL_OFS: 0..11 (12)
Mux控制寄存器地址偏移量,占用12个bit,分布为iomux_v3_cfg_t的第0-11bit
PAD_CTRL_OFS: 12..23 (12)
Pad控制寄存器地址偏移占用12个bit,分布为iomux_v3_cfg_t的第12-23bit
SEL_INPUT_OFS: 24..35 (12)
Select input地址偏移量,占用12个bit,分布为iomux_v3_cfg_t的第24-35bit
MUX_MODE + SION: 36..40 (5)
Mux模式和Software Input On Field.寄存器的设置,占据5位,其中mux mode占用3个bit,SION占用两个bit,分布为iomux_v3_cfg_t的36-40bit
PAD_CTRL + NO_PAD_CTRL: 41..58 (18)
Pad_ctrl寄存器配置占用18个bit,分布为iomux_v3_cfg_t的41-58bit
SEL_INP: 59..62 (4)
SEL_INP占用4个bit,分布为iomux_v3_cfg_t的59-62bit
reserved: 63 (1)
1.4.2 AUDMUX 分析
在声卡部分用到的GPIO口:CSIO_DATA4,在手册中查找到DAT4的复用功能选项,以及它在代码中的定义。
根据上面的定义:_pad_ctrl_ofs 0638
_mux_ctrl_ofs 0268
_mux_mode 4(100)
_sel_input_ofs 0000
_sel_input 0
_pad_ctrl 0
在 IOMUXC memory map 中
在Pad Mux Register中:
在Pad Register中:
sel_input_ofs=0x000,对应的sel_input为0即可。
1.4.2.1 函数 IOMUX_PAD
IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, \
_sel_input, _pad_ctrl)
参数:_pad_ctrl_ofs 控制寄存器的偏移地址(16进制)
_mux_ctrl_ofs MUX控制寄存器的偏移地址(16进制), 用于选择引脚的功能
_mux_mode MUX模式,bit0~3,范围0~7
_sel_input_ofs SELECT_INPUT寄存器偏移地址(16进制)
_sel_input Daisy Chain模式, bit0~1,范围0~3
_pad_ctrl 控制寄存器
偏移量的定义:
基地址:20E_0000h
1)_pad_ctrl_ofs
Pad Control Register
(IOMUXC_SW_PAD_CTL_PAD_SD2_DATA1)
Address: 20E_0000h base + 360h offset = 20E_0360h
_pad_ctrl_ofs = 0x360
2)_mux_ctrl_ofs, _mux_mode
Pad Mux Register
(IOMUXC_SW_MUX_CTL_PAD_SD2_DATA1)
Address: 20E_0000h base + 4Ch offset = 20E_004Ch
_mux_ctrl_ofs = 0x4c
_mux_mode 范围 000 ~ 101
3)_sel_input_ofs, _sel_input
Select Input Register
(IOMUXC_ASRC_ASRCK_CLOCK_6_SELECT_INPUT)
Address: 20E_0000h base + 7B0h offset = 20E_07B0h
_select_input_ofs=0x7B0,当_mux_mode = 0时 _select_input=0x1
4)_pad_ctrl
_pad_ctrl一般取值为0
控制寄存器的取值(具体内容通过MUX_PAD_CTRL)