比如定義PAD_GPIO_19作為一個GPIO_4_5使用:
#define MX6Q_PAD_GPIO_19__GPIO_4_5 (_MX6Q_PAD_GPIO_19__GPIO_4_5 | MUX_PAD_CTRL(NO_PAD_CTRL))
看上面的宏:
_MX6Q_PAD_GPIO_19__GPIO_4_5
它的定義是:
#define _MX6Q_PAD_GPIO_19__GPIO_4_5 IOMUX_PAD(0x0624, 0x0254, 5, 0x0000, 0, 0)
#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, _sel_input, _pad_ctrl)
IOMUX_PAD宏有6個參數,每個參數的意思是:
_pad_ctrl_ofs 控制寄存器的偏移地址(16進制) 該地址定義PAD是cmos還是schimitt輸入,上拉還是下拉,阻抗多少om等功能,請查看寄存器;
_mux_ctrl_ofs MUX控制寄存器的偏移地址(16進制), 用於選擇引腳的功能
_mux_mode MUX模式,bit0~3,范圍0~7,ALT的值,0~7,就是選引腳是gpio還是其他功能,一個pad是個確確實實能摸到的芯片的管腳,而這管腳有多種配置,實現不同的功能
_sel_input_ofs SELECT_INPUT寄存器偏移地址(16進制) 當ALT的選擇使得PAD作為其他PAD也能實現的功能時,這個寄存器才有用。比如關鍵PIN35\PIN45都能做UART_TXD,這個時候,就要在這個寄存器里,對_sel_input,進行設置,具體查看寄存器。
_pad_ctrl 一般取值為0(好吧,暫不追究)
因此一個PAD就可以出現下面這么多種配置:
- #define _MX6Q_PAD_GPIO_19__KPP_COL_5 \
- IOMUX_PAD(0x0624, 0x0254, 0, 0x08E8, 1, 0)
- #define _MX6Q_PAD_GPIO_19__ENET_1588_EVENT0_OUT \
- IOMUX_PAD(0x0624, 0x0254, 1, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__SPDIF_OUT1 \
- IOMUX_PAD(0x0624, 0x0254, 2, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__CCM_CLKO \
- IOMUX_PAD(0x0624, 0x0254, 3, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__ECSPI1_RDY \
- IOMUX_PAD(0x0624, 0x0254, 4, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__GPIO_4_5 \
- IOMUX_PAD(0x0624, 0x0254, 5, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__ENET_TX_ER \
- IOMUX_PAD(0x0624, 0x0254, 6, 0x0000, 0, 0)
- #define _MX6Q_PAD_GPIO_19__SRC_INT_BOOT \
- IOMUX_PAD(0x0624, 0x0254, 7, 0x0000, 0, 0)
以上的宏定義來自imx6的linux源碼的arm/arch/palt-mxc/include/mach/iomux-mx6q.h
MUX_PAD_CTRL(NO_PAD_CTRL)
這個好像是一些上拉或下拉,還有電阻的控制。具體還待研究!
參照:
http://blog.csdn.net/xnwyd/article/details/9042159
謝謝!