Skip to content

Commit 1f73662

Browse files
author
shiguanghu
authored
Create Freescales_imx6配置IOMUX
1 parent a48db8d commit 1f73662

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

pinctrl/Freescales_imx6配置IOMUX

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
Freescales_imx6配置IOMUX
2+
3+
i.mx6的Soc芯片提供IOMUX机制,就是用来解决引脚复用的问题。
4+
5+
需要的概念:
6+
1. Pad 对应的是Soc芯片上的引脚
7+
2. Signal 对应的是控制电机的功能
8+
9+
需要配置的寄存器:
10+
1. Pad控制寄存器
11+
2. Mux控制寄存器
12+
3. Select Input寄存器
13+
14+
配置IOMUX的必备工具:
15+
芯片原理图
16+
芯片软件手册
17+
内核源代码
18+
--------------------------------
19+
配置步骤
20+
--------------------------------
21+
1. 查看原理图
22+
下面是USB转串口芯片的原理图,我们需要配置UART1_RX这个接口。
23+
uart.jpeg
24+
25+
通过UART1_RX,我们可以在i.mx6的原理图中,找到对应的引脚 CSI0_DAT11。
26+
imx6_soc.jpeg
27+
28+
2. 查找软件手册(引脚功能)
29+
软件手册第4章
30+
查找CSI0_DAT11,可以得到两个重要的信息:
31+
32+
Pad的控制寄存器名称: SW_PAD_CTL_PAD_CSI0_DATA11
33+
CSI0_DAT11的功能UART1_RX_DATA 用于查找其他两个寄存器
34+
uart_function.jpeg
35+
36+
查找UART1_RX_DATA,可以得到两个寄存器
37+
Mux的控制寄存器名称: IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11
38+
39+
Select Input的寄存器名称: IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT
40+
uart_muxoption.jpeg
41+
42+
3. 查找软件手册(IOMUX功能配置)
43+
软件手册第36章, 介绍了IOMUX需要配置寄存器的所有信息。
44+
45+
根据三个寄存器的名称进行查找:
46+
Pad的控制寄存器名称: SW_PAD_CTL_PAD_CSI0_DATA11
47+
Mux的控制寄存器名称: IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11
48+
Select Input的寄存器名称: IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT
49+
50+
IOMUX_SW_PAD_CTL_PAD_CSI0_DATA11: 偏移地址:654h
51+
Pad控制寄存器,主要用于控制引脚的上拉电阻,下拉电阻和电压控制
52+
pad.jpeg
53+
54+
IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11: 偏移地址:284h
55+
配置MUX_MODE的模式为ALT3,就能使用UART1_RX_DATA的功能(pin )
56+
mux.jpeg
57+
58+
IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT: 偏移地址:920h
59+
selectinput.jpeg
60+
61+
-------------------------------
62+
三 源码配置
63+
-------------------------------
64+
配置IOMUX的过程,实际上就是向指定的地址,写入配置值的过程。
65+
66+
内核代码提供专门的宏 IOMUX_PAD,用来把IOMUX的配置,进行拼装,然后写入到指定的地址中。
67+
IOMUX_PAD 定义:
68+
文件 ~/android/kernel_imx/arch/arm/plat-mxc/include/mach/iomux-v3.h
69+
70+
/*
71+
* build IOMUX_PAD structure
72+
*
73+
* This iomux scheme is based around pads, which are the physical balls
74+
* on the processor.
75+
*
76+
* - Each pad has a pad control register (IOMUXC_SW_PAD_CTRL_x) which controls
77+
* things like driving strength and pullup/pulldown.
78+
* - Each pad can have but not necessarily does have an output routing register
79+
* (IOMUXC_SW_MUX_CTL_PAD_x).
80+
* - Each pad can have but not necessarily does have an input routing register
81+
* (IOMUXC_x_SELECT_INPUT)
82+
*
83+
* The three register sets do not have a fixed offset to each other,
84+
* hence we order this table by pad control registers (which all pads
85+
* have) and put the optional i/o routing registers into additional
86+
* fields.
87+
*
88+
* The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
89+
* If <padname> or <padmode> refers to a GPIO, it is named
90+
* GPIO_<unit>_<num>
91+
*
92+
* IOMUX/PAD Bit field definitions
93+
*
94+
* MUX_CTRL_OFS: 0..11 (12)
95+
* PAD_CTRL_OFS: 12..23 (12)
96+
* SEL_INPUT_OFS: 24..35 (12)
97+
* MUX_MODE + SION: 36..40 (5)
98+
* PAD_CTRL + NO_PAD_CTRL: 41..58 (18)
99+
* SEL_INP: 59..62 (4)
100+
* reserved: 63 (1)
101+
*/
102+
103+
#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, _sel_input, _pad_ctrl)
104+
(((iomux_v3_cfg_t)(_mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) |
105+
((iomux_v3_cfg_t)(_mux_mode) << MUX_MODE_SHIFT) |
106+
((iomux_v3_cfg_t)(_pad_ctrl_ofs) << MUX_PAD_CTRL_OFS_SHIFT) |
107+
((iomux_v3_cfg_t)(_pad_ctrl) << MUX_PAD_CTRL_SHIFT) |
108+
((iomux_v3_cfg_t)(_sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT) |
109+
((iomux_v3_cfg_t)(_sel_input) << MUX_SEL_INPUT_SHIFT))
110+
111+
参数:
112+
_pad_ctrl_ofs //pad控制寄存器的偏移地址
113+
_mux_ctrl_ofs //mux控制寄存器的偏移地址
114+
_mux_mode //mux的模式
115+
_sel_input_ofs //input寄存器的偏移地址
116+
_sel_input //input的类型
117+
118+
119+
-------------------------------
120+
配置
121+
-------------------------------
122+
通过软件手册,查找到三个寄存器的地址, 使用IOMUX_PAD配置代码。
123+
124+
SW_PAD_CTL_PAD_CSI0_DATA11 偏移地址 0x654
125+
IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11 偏移地址 0x284
126+
IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT 偏移地址 0x920
127+
128+
文件 ~/android/kernel_imx/arch/arm/plat-mxc/include/mach/iomux-mx6q.h
129+
130+
#define _MX6Q_PAD_CSI0_DAT11__UART1_RXD \
131+
IOMUX_PAD(0x0654, 0x0284, 3, 0x0920, 1, 0)
132+
133+
134+
总结: 描述了从原理图查找指定引脚,到软件手册找到Mux,Pad,Sel_Input的寄存器配置信息,再到内核代码如何进行配置的全部--太复杂.

0 commit comments

Comments
 (0)