使用imx6 的gpio时候需要关注board-mx6q_sabresd.h中的内容
本文以MX6Q_PAD_CSI0_DAT10__UART1_RXD进行详细说明:
(1)用source insight查看MX6Q_PAD_CSI0_DAT10__UART1_RXD
主要由 _MX6Q_PAD_CSI0_DAT11__UART1_RXD | MUX_PAD_CTRL组成#define MX6Q_PAD_CSI0_DAT11__UART1_RXD \ (_MX6Q_PAD_CSI0_DAT11__UART1_RXD | MUX_PAD_CTRL(MX6Q_UART_PAD_CTRL))
(2)查看:_MX6Q_PAD_CSI0_DAT11__UART1_RXD
(3)查看 IOMUX_PAD#define _MX6Q_PAD_CSI0_DAT11__UART1_RXD \ IOMUX_PAD(0x0654, 0x0284, 3, 0x0920, 1, 0)
(4)产看 MUX_PAD_CTRL#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))
(5)可以发现 MUX_PAD_CTRL的意思和 IOMUX_PAD 的_pad_ctrl参数是一个意思。#define MUX_PAD_CTRL(x) ((iomux_v3_cfg_t)(x) << MUX_PAD_CTRL_SHIFT)
(6)IOMUX_PAD的参数意思分别如下
(7)查看datasheet:对应可以找到 (0x0654, 0x0284, 3, 0x0920, 1, 0)参数的具体意思
_pad_ctrl_ofs
控制寄存器的偏移地址(16进制)
_mux_ctrl_ofs
MUX控制寄存器的偏移地址(16进制), 用于选择引脚的功能
_mux_mode
MUX模式,bit0~3,范围0~7
_select_input_ofs
SELECT_INPUT寄存器偏移地址(16进制)
_select_input
Daisy Chain模式, bit0~1,范围0~3
_pad_ctrl
控制寄存器的取值(具体内容通过MUX_PAD_CTRL)
(8)在iomux-v3.h可以看个控制寄存器的具体取值:
(9)最终通过32位的寄存器地址配置32位的寄存器把gpio配置好#define NO_PAD_CTRL (1 << 17) #define NO_PAD_I 0 #define NO_MUX_I 0 #ifdef CONFIG_SOC_IMX6Q #define PAD_CTL_LVE (1 << 22) #define PAD_CTL_LVE_MASK (1 << 22) #define PAD_CTL_DDR_SEL_LPDDR2 (2 << 18) #define PAD_CTL_DDR_SEL_DDR3 (3 << 18) #define PAD_CTL_DDR_SEL_MASK (3 << 18) #define PAD_CTL_HYS (1 << 16) #define PAD_CTL_PUS_100K_DOWN (0 << 14) #define PAD_CTL_PUS_47K_UP (1 << 14) #define PAD_CTL_PUS_100K_UP (2 << 14) #define PAD_CTL_PUS_22K_UP (3 << 14) #define PAD_CTL_PUE (1 << 13) #define PAD_CTL_PKE (1 << 12) #define PAD_CTL_ODE (1 << 11) #define PAD_CTL_SPEED_LOW (1 << 6) #define PAD_CTL_SPEED_MED (2 << 6) #define PAD_CTL_SPEED_HIGH (3 << 6) #define PAD_CTL_DSE_DISABLE (0 << 3) #define PAD_CTL_DSE_240ohm (1 << 3) #define PAD_CTL_DSE_120ohm (2 << 3) #define PAD_CTL_DSE_80ohm (3 << 3) #define PAD_CTL_DSE_60ohm (4 << 3) #define PAD_CTL_DSE_48ohm (5 << 3) #define PAD_CTL_DSE_40ohm (6 << 3) #define PAD_CTL_DSE_34ohm (7 << 3) #define PAD_CTL_SRE_FAST (1 << 0) #define PAD_CTL_SRE_SLOW (0 << 0)