IMX6ULL的寄存器手册 和 设备树 代码

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):



posted @ 2026-06-12 11:46  一见无始道成空  阅读(15)  评论(0)    收藏  举报