GPIO1_IO00
这个寄存器专门对应:GPIO1 组第 0 号引脚
每个引脚都一个寄存器吗?
结论:在 i.MX6UL/6ULL 上,每个物理引脚(PAD)都有:
1 个 IOMUXC_SW_MUX_CTL_PAD_xxx 寄存器(选 ALT 复用功能)
1 个 IOMUXC_SW_PAD_CTL_PAD_xxx 寄存器(配置电气属性:上下拉、驱动能力等)
在源码路劲:linux_kernel_zdyz/arch/arm/boot/dts/imx6ul-pinfunc.h
#define MX6UL_PAD_GPIO1_IO00__I2C2_SCL 0x005C 0x02E8 0x05AC 0x0 0x1
#define MX6UL_PAD_GPIO1_IO00__GPT1_CAPTURE1 0x005C 0x02E8 0x058C 0x1 0x0
#define MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x005C 0x02E8 0x04B8 0x2 0x0
#define MX6UL_PAD_GPIO1_IO00__ENET1_REF_CLK1 0x005C 0x02E8 0x0574 0x3 0x0
#define MX6UL_PAD_GPIO1_IO00__MQS_RIGHT 0x005C 0x02E8 0x0000 0x4 0x0
#define MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x005C 0x02E8 0x0000 0x5 0x0
#define MX6UL_PAD_GPIO1_IO00__ENET1_1588_EVENT0_IN 0x005C 0x02E8 0x0000 0x6 0x0
#define MX6UL_PAD_GPIO1_IO00__SRC_SYSTEM_RESET 0x005C 0x02E8 0x0000 0x7 0x0
#define MX6UL_PAD_GPIO1_IO00__WDOG3_WDOG_B 0x005C 0x02E8 0x0000 0x8 0x0
#define MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x005C 0x02E8 0x0000 0x5 0x0
// | | | | |
// MUX PAD DAISY MODE 输入
// 偏移 偏移 偏移 值 值
第一个是MUX_REG 0x005C
复用寄存器
对应手册的 SW_MUX_CTL_PAD_GPIO1_IO00
0x5 就是给 MUX_REG 的值,复用为ALT5
图片不能显示。
直接到芯片手册搜索SW_MUX_CTL_PAD_GPIO1_IO00
![1]()
第二个是PAD_REG 0x02E8
电气属性寄存器
对应手册的 SW_PAD_CTL_PAD_GPIO1_IO00
但是这个的寄存器的值,不是在宏定义里面的。
pinctrl_adc1: adc1grp {
fsl,pin = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0xb0
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0xb0
>;
};
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0xb0
// 宏定义部分(5个参数) ↑
// 配置值
0xb0 就是写入 PAD 寄存器的值(SW_PAD_CTL_PAD_GPIO1_IO00,地址 0x020E02E8)。
0xb0 = 二进制 1011 0000
高位在前,
分别对应 7 6 5 4 3 2 1 0 寄存器的位置
// 伪代码处理流程
// Linux 内核的 pinctrl 驱动会这样处理:
for (每个引脚配置) {
mux_reg = 0x005C; // 从宏的第1个参数
pad_reg = 0x02E8; // 从宏的第2个参数
mux_mode = 0x5; // 从宏的第4个参数
pad_value = 0xb0; // 从设备树的第二个数字
// 配置 MUX 寄存器
writel(mux_mode, iomuxc_base + mux_reg);
// 配置 PAD 寄存器(电气特性)
writel(pad_value, iomuxc_base + pad_reg);
}
![2]()
第三个是INPUT 输入寄存器
最后一个就是给输入寄存器的值。
一般一个物理引脚只有两个寄存器,2 个寄存器(每个引脚都有)
第3个参数(0x0000):INPUT 寄存器的地址
第5个参数(0x0):写入 INPUT 寄存器的值
1 个可选寄存器(部分引脚有)
这算是一个隐藏的额外寄存器,用来处理复杂信号的输入路由。
输入选择寄存器 (INPUT/DAISY Register):