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

转载地址:https://blog.csdn.net/u013554213/article/details/79309235
平台:  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引脚配置的寄存器的一般命名规则

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

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

管脚控制寄存器: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的定义为

[cpp]  view plain  copy
  1. #define  MX6Q_PAD_SD3_DAT6__GPIO_6_18         \  
  2.   
  3.        (_MX6Q_PAD_SD3_DAT6__GPIO_6_18 |MUX_PAD_CTRL(NO_PAD_CTRL))  
其中
[cpp]  view plain  copy
  1. #define MUX_PAD_CTRL(x)              ((iomux_v3_cfg_t)(x)<< MUX_PAD_CTRL_SHIFT)  
  2.   
  3. typedef u64 iomux_v3_cfg_t;  
  4.   
  5. #define MUX_PAD_CTRL_SHIFT     41  
[cpp]  view plain  copy
  1. #defineNO_PAD_CTRL               (1 << 17)  

其中_MX6Q_PAD_SD3_DAT6__GPIO_6_18定义为:

[cpp]  view plain  copy
  1. #define_MX6Q_PAD_SD3_DAT6__GPIO_6_18                 \  
  2.   
  3.               IOMUX_PAD(0x0694, 0x02AC, 5,0x0000, 0, 0)  
这个IOMUX_PAD宏是定义GPIO的关键宏,其原型为:
[cpp]  view plain  copy
  1. #defineIOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, \  
  2.   
  3.               _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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值