1.GPIO的配置相关

时间:2024-03-17 07:34:46

1.GPIO的配置相关

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

1.GPIO的配置相关

上面的mx6q_sabresd_pads是一个数组结构,里面定义了gpio的引脚。

1.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.GPIO的配置相关

1.4.2 AUDMUX 分析

在声卡部分用到的GPIO口:CSIO_DATA4,在手册中查找到DAT4的复用功能选项,以及它在代码中的定义。

1.GPIO的配置相关

1.GPIO的配置相关

1.GPIO的配置相关

1.GPIO的配置相关

根据上面的定义:_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 中

1.GPIO的配置相关

1.GPIO的配置相关

在Pad Mux Register中:

1.GPIO的配置相关

在Pad Register中:

1.GPIO的配置相关

 

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 控制寄存器

1.GPIO的配置相关

偏移量的定义:

1.GPIO的配置相关

基地址:20E_0000h

1)_pad_ctrl_ofs

Pad Control Register

(IOMUXC_SW_PAD_CTL_PAD_SD2_DATA1)

Address: 20E_0000h base + 360h offset = 20E_0360h

1.GPIO的配置相关

_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

1.GPIO的配置相关

1.GPIO的配置相关

_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

1.GPIO的配置相关

1.GPIO的配置相关

_select_input_ofs=0x7B0,当_mux_mode = 0时 _select_input=0x1

4)_pad_ctrl

_pad_ctrl一般取值为0

控制寄存器的取值(具体内容通过MUX_PAD_CTRL)

 

next:代码分析