imx6中iomux IO復用


IOMUX Controller (IOMUXC) IO多路復用控制器
1.overview
The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC to share one pad to several functional blocks.
IOMUXC和IOMUX使IMX6能夠多個功能模塊公用一個pad. 共用是通過對pad的輸入/輸出信號的多路復用技術來實現的.
每一個模塊需要一個特定的pad設置, 且對於每一個pad, 有多達8個復用選擇(稱為ALT(alternative)). 這些pad設置通過IOMUXC控制.
IOMUX由多個基本的IOMUX單元的組合邏輯構成. 每一個基本的IOMUX單元只能處理一個pad的信號復用.

2.features
32位軟件多路控制寄存器(IOMUXC_SW_MUX_CTL_PAD_<PADNAME> or IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>)配置8個可選(ALT)多路復用模式位域, 並強制設置pad輸入路徑(通過SION bit)
32位軟件pad控制寄存器(IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME> or IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>)對每一個pad配置特定的pad設置
32位通用寄存器14個(GPR0 to GPR13), 32位寄存器根據SoC需求用於任何使用
32位輸入選擇控制器用於控制輸入路徑到一個模塊當不止一個pad驅動這個模塊輸入時
每一個SW MUX/PAD CTL IOMUXC寄存器只能處理一個pad或一個pad組

3.functional description
IOMUXC由兩個子模塊組成:
IOMUXC_REGISTERS包含所有的IOMUXC寄存器
IOMUXC_LOGIC包含所有IOMUXC組合邏輯(IP接口控制, 地址解碼)
3.1ALT6和ALT7擴展多路復用模式
ALT6和ALT7多路復用模式允許系統的任何信號(比如fuse, pad input)重寫任何軟件配置和強制ALT6/ALT7多路復用模式
它也允許一個IOMUX軟件寄存器控制一組pads
3.2SW loopback功能通過設置SION bit
當IOMUXC_SW_MUX_CTL的SION位被置1他講忽視模式控制位的輸入模式
3.3Daisy鏈-多個pads驅動同一個模塊的輸入引腳
有些時候, 多個pad可能驅動單個模塊的輸入引腳
比如imx6dl中, uart4的收數據輸入引腳: UART4_RX_DATA, 它有兩個pad可以驅動它, 也就是說有兩個pad都可以作為UART4_RX_DATA引腳, 這取決與硬件. 在imx6dl手冊中搜索UART4_RX_DATA可知, 有這兩個pad: CSI0_DAT13, KEY_ROW0可以作為UART4_RX_DATA的輸入引腳. 具體參照原理圖, HUD項目中, 原理圖中UART4_RX_DATA是接到KEY_ROW0這個pad上了, 所以項目中, KEY_ROW0這個pad作為UART4_RX_DATA輸入腳, 故要設置IOMUXC_UART4_UART_RX_DATA_SELECT_INPUT[DAISY]=3


如何理解IOMUX多路復用器呢?
a.首先這些IO都是輸入輸出管腳(pad)
b.這些管腳可以復用成多個功能(比如GPIO, CCM_CLKO, SPDIF_OUT...)
c.手冊中會以其中的一個功能來命名pad名
d.然后在IOMUX章節可以找到其他復用的功能
例子:
節油項目中音頻解碼器芯片mp7741dq中的EN使能腳是通過AP_EN來控制的, 然后找到AP_EN管腳對應的pad為EIM_D29, 在數據手冊IOMUX Controller章節搜索EIM_D29可以看到它可以復用成其他7個功能(IPU1_DI1_PIN15, ECSPI4_SS0, UART2_RTS_B, GPIO3_IO29, IPU1_CSI1_VSYNC, IPU1_DI0_PIN14, EPDC_PWR_WAKE), 只是這里以EIM_D29為pad名, 然后就可以在數據手冊中搜索到其他的復用功能

解析uboot下iomux相關宏的使用
在arm/include/asm/imx-common/iomux-v3.h中, 描述了IOMUX模塊相關寄存器的宏
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)
IOMUX_PAD(pad_ctrl_ofs, mux_ctrl_ofs, mux_mode, sel_input_ofs, sel_input, pad_ctrl) \
...
其實這里的宏定義就是要把IOMUX相關的寄存器集中在IOMUX_PAD中, 然后通過相應函數(imx_iomux_v3_setup_multiple_pads)的解析, 把該宏定義好的值寫入到到IOMUX相關寄存器中, 這樣就實現了設置IO復用功能

一個設置IO復用的例子:
在board/fresscale/mx6sabresd/mx6sabresd.c中有很多IO復用的例子, 這里舉一個
iomux_v3_cfg_t const yaxon_pads[] = {
MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

static void setup_yaxon(void)
{
imx_iomux_v3_setup_multiple_pads(yaxon_pads, ARRAY_SIZE(yaxon_pads));
}

這里首先通過定義yaxon_pads為iomux_v3_cfg_t類型的常量數據, 然后通過imx_iomux_v3_setup_multiple_pads()函數設置IOMUX相關寄存器來設置需要的IO復用
a.MX6_PAD_GPIO_17__GPIO7_IO12是拼接起來的, 在source insight中搜索GPIO_17__GPIO_IO12, 可以在arch/arm/include/asm/arch-mx6/mx6dl_pins.h中搜到MX6_PAD_DECL(GPIO_17__GPIO7_IO12, 0x5E8, 0x0218, 5, 0x0000, 0, 0)
b.繼續搜索MX6_PAD_DECL, 在arch/arm/include/asm/arch/mx6-pins.h有該宏定義:
#define MX6_PAD_DECL(name, pco, mc, mm, sio, si, pc) \
MX6_PAD_DECLARE(MX6_PAD_, name, pco, mc, mm, sio, si, pc)
c.繼續搜索MX6_PAD_DECLARE, 同樣在arch/arm/include/asm/arch/mx6-pins.h有該宏定義:
#define MX6_PAD_DECLARE(prefix, name, pco, mc, mm, sio, si, pc) \
prefix##name = IOMUX_PAD(pco, mc, mm, sio, si, pc)
d.繼續搜索IOMUX_PAD, 在arm/include/asm/imx-common/iomux-v3.h中
參照上面內容(解析uboot下iomux相關宏的使用), 所以
MX6_PAD_GPIO_17__GPIO7_IO12其實就是:
MX6_PAD_GPIO_17__GPIO7_IO12 = IOMUX_PAD(0x5E8, 0x0218, 5, 0x0000, 0, 0)
其中, 0x05E8 ---> pad_ctrl_ofs
0x0218 ---> mux_ctrl_ofs
5 ---> mux_mode
0x0000 ---> sel_input_ofs
0 ---> sel_input
0 ---> pad_ctrl
查找imx6dl產品規格書, IOMUX章節
IOMUXC_SW_MUX_CTL_PAD_GPIO17寄存器可知mux_ctrl_ofs確實為0x218, 我們需要設置為GPIO模式, 即mux_mode為5, 與實際一樣
IOMUXC_SW_PAD_CTL_PAD_GPIO17寄存器可知pad_ctrl_ofs確實為0x5E8, 我們不需要設置pad_ctrl
我們不需要設置sel_input_ofs, 所以設置它為0
然后通過分析imx_iomux_v3_multiple_pads()函數把剛剛的這些值寫入到對應寄存器里, 這樣就設置好我們想要的IO復用模式了

 

參考:http://www.xuebuyuan.com/774804.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM