iMX6引脚配置的寄存器使用方法总结

平台:  OKMX6Q-S

系统:  Linux

内核版本:linux-3.0.35

Datasheet:IMX6DQRM.pdf

 i.MX 6Q包含有限数量的引脚,其中大部分具有多个信号选项。这些信号到引脚和引脚到信号的选项由输入输出多路复用器IOMUX选择。IOMUX还用于配置其他引脚特性,例如电压电平,驱动强度和滞后。

在IMX6DQRM.pdf中的第4章ExternalSignals and Pin Multiplexing中分别给出了引脚分配表4-1和复用选项表4-2。引脚分配列出芯片的管脚名称、可分配给每个管脚的各种信号以及每个管脚的默认设置,如表1所示。复用选项列出按模块实例分组的外部信号,每个信号的复用选项以及用于将信号路由至选定管脚的寄存器,如表2所示。

表1 Pin Assignments(部分)

表2 Muxing Options(部分)

 

1.   寄存器命名规则

在\arch\arm\plat-mxc\include\mach\iomux-v3.h中的第43行,说明了iMX6引脚配置的寄存器的一般命名规则

/*
 *   buildIOMUX_PAD structure
 *
 * This iomux scheme is based around pads,which are the physical balls
 * on the processor.
 *
 * - Each pad has a pad control register(IOMUXC_SW_PAD_CTRL_x) which controls
 *  things like driving strength and pullup/pulldown.
 * - Each pad can have but not necessarily doeshave an output routing register
 *  (IOMUXC_SW_MUX_CTL_PAD_x).
 * - Each pad can have but not necessarily doeshave an input routing register
 *  (IOMUXC_x_SELECT_INPUT)
 *
 * The three register sets do not have a fixedoffset to each other,
 * hence we order this table by pad controlregisters (which all pads
 * have) and put the optional i/o routingregisters into additional
 * fields.
 *
 * The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
 * If <padname> or <padmode> refersto a GPIO, it is named
 * GPIO_<unit>_<num>
 *
 * IOMUX/PAD Bit field definitions
 *
 * MUX_CTRL_OFS:                  0..11 (12)
 * PAD_CTRL_OFS:                  12..23 (12)
 * SEL_INPUT_OFS:                 24..35 (12)
 * MUX_MODE + SION:               36..40 (5)
 * PAD_CTRL + NO_PAD_CTRL:        41..58 (18)
 * SEL_INP:                       59..62(4)
 * reserved:                      63    (1)
*/

这个头文件中提到,每个复用管脚最多有三个寄存器:

管脚控制寄存器:IOMUXC_SW_PAD_CTRL_x, x代表某某管脚名称

输出路由寄存器:IOMUXC_SW_MUX_CTL_PAD_x

输入路由寄存器:IOMUXC_x_SELECT_INPUT

Datasheet中使用

 

管脚模式的命名规则为:MX6Q_PAD_<padname>__<padmode>

padname为管脚名,padmode为管脚模式。

如表1中,CSI0_DAT4为padname,取Signal为GPIO5_IO22是,padmode即为ALT5,则其复用管脚名称为MX6Q_PAD_CSI0_DAT4__GPIO5_IO22

Linux内核中使用

 

2.   在内核中定义复用管脚的寄存器

\arch\arm\plat-mxc\include\mach\iomux-mx6q.h中

MX6Q_PAD_SD3_DAT6__GPIO_6_18的定义为

#define  MX6Q_PAD_SD3_DAT6__GPIO_6_18         \

       (_MX6Q_PAD_SD3_DAT6__GPIO_6_18 |MUX_PAD_CTRL(NO_PAD_CTRL))
其中
#define MUX_PAD_CTRL(x)              ((iomux_v3_cfg_t)(x)<< MUX_PAD_CTRL_SHIFT)

typedef u64 iomux_v3_cfg_t;

#define MUX_PAD_CTRL_SHIFT     41
#defineNO_PAD_CTRL               (1 << 17)

其中_MX6Q_PAD_SD3_DAT6__GPIO_6_18定义为:

#define_MX6Q_PAD_SD3_DAT6__GPIO_6_18                 \

              IOMUX_PAD(0x0694, 0x02AC, 5,0x0000, 0, 0)
这个IOMUX_PAD宏是定义GPIO的关键宏,其原型为:
#defineIOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, \

              _sel_input, _pad_ctrl)      
IOMUX_PAD宏有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

bits to be set in register _pad_ctrl_ofs for configuration selection

因此对应关系如下:

    0x0694      |     0x02AC    |         0x5       |    0x0000    |      0x0     |      0x0

----------------------------------------------------------------------------------------------------

mux_ctrl_ofs | pad_ctrl_ofs |sel_input_ofs | mux_mode | sel_input | pad_ctrl


映射关系:

MX6Q_PAD_SD3_DAT6__GPIO_6_18  ->   IOMUX_PAD(0x0694, 0x02AC, 5, 0x0000, 0, 0)

 

例如:MX6Q_PAD_SD3_DAT6__GPIO_6_18,管脚名(padname)为SD3_DAT6。

由于是对复用管脚的配置,于是在管脚复用的章节(IOMUXC)中查找。但是现确定padname才方便,于是定义在ExternalSignals and Pin Multiplexing章节,搜索MX6Q_PAD_SD3_DAT6__GPIO_6_18的中间部分:SD3_DAT6,如下图


可知GPIO_6_18是属于SD3_DAT6的ALT5,于是mux_mode=0x5即可。上图表格中最后一列SW_PAD_CTL_PAD_SD3_DATA6是config配置需要查找的名称,跳到管脚复用的章节(IOMUXC)中,找到SW_PAD_CTL_PAD_SD3_DATA6,如下所示:


如果直接取默认值的话结果是config=0x1b0b0,这里可以根据自己的需要(硬件)更改为与自己的板子匹配的值,我把最后SRE的值设置为1,即Fast Slew Rate,如下图说明:


接下来是mux_ctrl_ofs、pad_ctrl_ofs、sel_input_ofs三个偏移值,这些值都是在复用管脚的章节确定的。因为pad name为SD3_DAT6,所以在找的时候可以拿它当关键字。

首先是mux_ctrl_ofs,找到IOMUXC_SW_MUX_CTL_PAD_*开头的部分,结尾选择SD3_DATA6,即IOMUXC_SW_MUX_CTL_PAD_SD3_DATA6,如下图,


Address: 20E_0000h base + 2ACh offset= 20E_02ACh 中可知offset=2AC,即mux_ctrl_oft=0x2AC

其他的查找方法类似。pad_ctrl_ofs,查找IOMUXC_SW_PAD_CTL_PAD_SD3_DATA6一节,可知偏移值pad_ctrl_ofs=0x694



sel_input_ofs查找IOMUXC章节以SELECT_INPUT结尾的部分,中间选择GPIO_6_18,即IOMUXC_GPIO_6_18_SELECT_INPUT,如果没有这里sel_input_ofs=0x000即可,对应的sel_input0即可。

如果有例如IOMUXC_UART2_UART_RX_DATA_SELECT_INPUT,即uartrx管脚配置,如下图,所以RXsel_input_ofs=0x928,这里选择对应的值“110 SD4_DATA4_ALT2 — Selecting ALT2 mode ofpad SD4_DAT4 for UART2_RX_DATA.“所以RXsel_input=0x6


 

参考:

imx6设备树pinctrl解析http://blog.csdn.net/keleming1/article/details/51034483

imx6ul 设备树中iomux处pad_ctrl寄存器配置详解

http://bbs.witech.com.cn/portal.php?mod=view&aid=162

飞思卡尔IMX6处理器的GPIO配置方式

http://blog.csdn.net/xnwyd/article/details/9042159

 

 

添加GPIO的方法请参考:

http://bbs.witech.com.cn/portal.php?mod=view&aid=134

http://bbs.witech.com.cn/forum.php?mod=viewthread&tid=69370&extra=page%3D2

 


已标记关键词 清除标记