|
| 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