美文网首页
Freescales i.mx6配置IOMUX

Freescales i.mx6配置IOMUX

作者: songwenbin | 来源:发表于2015-02-26 14:02 被阅读0次

    为什么IOMUX

    Soc芯片上有很多引脚,每个引脚对应特定的功能。例如控制电机需要控制电机的功能引脚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. 芯片原理图
    2. 芯片软件手册
    3. 内核源代码

    配置步骤

    1. 查看原理图

    下面是USB转串口芯片的原理图,我们需要配置UART1_RX这个接口。


    uart.jpeg

    通过UART1_RX,我们可以在i.mx6的原理图中找到对应的引脚CSI0_DAT11。


    imx6soc.jpeg

    2. 查找软件手册(引脚功能)

    软件手册第4章
    查找CSI0_DAT11,可以得到两个重要的信息

    • Pad的控制寄存器名称 SW_PAD_CTL_PAD_CSI0_DATA11
    • CSI0_DAT11的功能UART1_RX_DATA 用于查找其他两个寄存器


      uartfunction.jpeg

    查找UART1_RX_DATA,可以得到两个寄存器

    • Mux的控制寄存器名称 IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11
    • Select Input的寄存器名称 IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT


      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_INPUT

    IOMUX_SW_PAD_CTL_PAD_CSI0_DATA11

    偏移地址:654h
    Pad控制寄存器主要用于控制引脚的上拉电阻,下拉电阻和电压控制


    pad.jpeg

    IOMUX_SW_MUX_CTL_PAD_CSI0_DATA11

    偏移地址:284h
    配置MUX_MODE的模式为ALT3,就能使用UART1_RX_DATA的功能


    mux.jpeg

    IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT

    偏移地址:920h


    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_<padname>__<padmode>
     * If <padname> or <padmode> refers to 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)
    */
    
    #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的寄存器配置信息,再到内核代码如何进行配置的全部映射关系。

    最后总结: i.mx6 太TMD复杂了

    相关文章

      网友评论

          本文标题:Freescales i.mx6配置IOMUX

          本文链接:https://www.haomeiwen.com/subject/yfkpxttx.html