比如定义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
谢谢!