為什么IOMUXSoc芯片上有很多引腳,每個引腳對應特定的功能。例如控制電機需要控制電機的功能引腳1和引腳2,控制傳感器需要控制傳感器功能的引腳3和引腳4。對于使用Soc芯片的需求方來說,可能只是控制電機,或者只是控制傳感器。這樣Soc芯片上的4個引腳就浪費了2個引腳。為了能提供更多的功能,減少引腳的浪費,可以把引腳1,2和引腳3,4合并,通過復用引腳來解決問題。 i.mx6的Soc芯片提供IOMUX機制就是用來解決引腳復用的問題。
如何確定使用引腳12,還是使用引腳34,是下面要介紹的主要內容
需要的概念Pad 對應的是Soc芯片上的引腳
Signal 對應的是控制電機的功能
需要配置的寄存器- Pad控制寄存器
- Mux控制寄存器
- Select Input寄存器
配置IOMUX的必備工具配置步驟1. 查看原理圖下面是USB轉串口芯片的原理圖,我們需要配置UART1_RX這個接口。
245883-b4e7751a69ddce3a.jpeg (59.25 KB, 下載次數: 97)
下載附件
2016-12-31 02:06 上傳
uart.jpeg
通過UART1_RX,我們可以在i.mx6的原理圖中找到對應的引腳CSI0_DAT11。
245883-ae7897292f6e6411.jpeg (206.62 KB, 下載次數: 131)
下載附件
2016-12-31 02:06 上傳
imx6soc.jpeg
2. 查找軟件手冊(引腳功能)軟件手冊第4章
查找CSI0_DAT11,可以得到兩個重要的信息
- Pad的控制寄存器名稱 SW_PAD_CTL_PAD_CSI0_DATA11
- CSI0_DAT11的功能UART1_RX_DATA 用于查找其他兩個寄存器
-
245883-5a7f2e47233ed2fd.jpeg (91.75 KB, 下載次數: 96)
下載附件
2016-12-31 02:06 上傳
uartfunction.jpeg
查找UART1_RX_DATA,可以得到兩個寄存器
- Mux的控制寄存器名稱 IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11
- Select Input的寄存器名稱 IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT
-
245883-266920e4428e6fd8.jpeg (118.58 KB, 下載次數: 113)
下載附件
2016-12-31 02:06 上傳
uartmuxoption.jpeg
3. 查找軟件手冊(IOMUX功能配置)軟件手冊第36章, 介紹了IOMUX需要配置寄存器的所有信息。
根據三個寄存器的名稱進行查找
- Pad的控制寄存器名稱 SW_PAD_CTL_PAD_CSI0_DATA11
- Mux的控制寄存器名稱 IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11
- Select Input的寄存器名稱 IOMUXC_UART1_UART_RX_DATA_SELECT_INPUTIOMUX_SW_PAD_CTL_PAD_CSI0_DATA11偏移地址:654h
Pad控制寄存器主要用于控制引腳的上拉電阻,下拉電阻和電壓控制 -
245883-2a30358df691caa5.jpeg (57.18 KB, 下載次數: 94)
下載附件
2016-12-31 02:06 上傳
pad.jpeg
IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11偏移地址:284h
配置MUX_MODE的模式為ALT3,就能使用UART1_RX_DATA的功能
245883-2b17bc29eb987d26.jpeg (170.54 KB, 下載次數: 107)
下載附件
2016-12-31 02:06 上傳
mux.jpeg
IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT偏移地址:920h
245883-4c5b245c878478d4.jpeg (42.74 KB, 下載次數: 104)
下載附件
2016-12-31 02:06 上傳
selectinput.jpeg
三 源碼配置配置IOMUX的過程,實際上就是向指定的設備地址寫入配置值的過程。
內核代碼提供專門的宏 IOMUX_PAD,用來把IOMUX的配置進行拼裝,然后寫入到指定的設備地址中。
IOMUX_PAD 定義文件 ~/android/kernel_imx/arch/arm/plat-mxc/include/mach/iomux-v3.h
/* * build IOMUX_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 does have an output routing register * (IOMUXC_SW_MUX_CTL_PAD_x). * - Each pad can have but not necessarily does have an input routing register * (IOMUXC_x_SELECT_INPUT) * * The three register sets do not have a fixed offset to each other, * hence we order this table by pad control registers (which all pads * have) and put the optional i/o routing registers into additional * fields. * * The naming convention for the pad modes is MX35_PAD___ * If or refers to a GPIO, it is named * GPIO__ * * 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)*/#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, _sel_input, _pad_ctrl) (((iomux_v3_cfg_t)(_mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) | ((iomux_v3_cfg_t)(_mux_mode) << MUX_MODE_SHIFT) | ((iomux_v3_cfg_t)(_pad_ctrl_ofs) << MUX_PAD_CTRL_OFS_SHIFT) | ((iomux_v3_cfg_t)(_pad_ctrl) << MUX_PAD_CTRL_SHIFT) | ((iomux_v3_cfg_t)(_sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT) | ((iomux_v3_cfg_t)(_sel_input) << MUX_SEL_INPUT_SHIFT))參數- _pad_ctrl_ofs pad控制寄存器的偏移地址
- _mux_ctrl_ofs mux控制寄存器的偏移地址
- _mux_mode mux的模式
- _sel_input_ofs input寄存器的偏移地址
- _sel_input input的類型
配置通過軟件手冊查找到三個寄存器的地址, 使用IOMUX_PAD配置代碼。
- SW_PAD_CTL_PAD_CSI0_DATA11 偏移地址 0x654
- IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11 偏移地址 0x284
- IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT 偏移地址 0x920
文件 ~/android/kernel_imx/arch/arm/plat-mxc/include/mach/iomux-mx6q.h
#define _MX6Q_PAD_CSI0_DAT11__UART1_RXD IOMUX_PAD(0x0654, 0x0284, 3, 0x0920, 1, 0)上面的內容描述了從原理圖查找指定引腳,到軟件手冊找到Mux,Pad,SelInput的寄存器配置信息,再到內核代碼如何進行配置的全部映射關系。
|