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_input为0即可。
如果有例如IOMUXC_UART2_UART_RX_DATA_SELECT_INPUT,即uart的rx管脚配置,如下图,所以RX的sel_input_ofs=0x928,这里选择对应的值“110 SD4_DATA4_ALT2 — Selecting ALT2 mode ofpad SD4_DAT4 for UART2_RX_DATA.“所以RX的sel_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
更多推荐
所有评论(0)