基于pinctrl与gpio子系统点灯实验,灯不亮问题
- 实验平台:正点原子alpha开发板,核心板V1.6,底板V2.1
- 芯片:IMX6ULL
现象
跟着《I.MX6U嵌入式Linux驱动开发指南V1.8》第四十五章做实验
- 驱动挂载上了,gpio_request也成功,这一步说明led的PIN脚没有被其他驱动占用,但是灯就是没点亮
简洁结论
iomux节点下的 MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 修改 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 导致GPIO1_IO03的引脚被复用为了其他功能,非GPIO
详细原因
由于跟着第三期内核移植的时候,因为用的网络PHY芯片是LAN8720A,照着上面文档教程修改了设备树,在enet1grp节点添加了MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07
&iomuxc {
//为了方便展示将compatible reg 属性 合并过来观察
compatible = "fsl,imx6ul-iomuxc";
reg = <0x020e0000 0x4000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
......
pinctrl_enet1: enet1grp {
fsl,pins = <
MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001B009
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10b0
>;
};
......
};
};
#define MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 \
0x0024 0x0068 0x0000 0x5 0x0
#define MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 \
0x0068 0x02F4 0x0000 0x5 0x0
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07
和MX6UL_PAD_GPIO1_IO03
,
这些fsl,pins
用到的宏定义的五个数值含义分别代表
<mux_reg conf_reg input_reg mux_mode input_val>,其中mux_reg,conf_reg都是偏移值。
从上面代码块中可以看得到
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07
的第2个数值conf_reg:0x0068
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03
的第一个数值mux_reg:0x0068
是一样的!!!
并且它们都在 iomuxc@020e0000 节点下,这就导致了最终控制的寄存器地址是0x020e0000+0x0068=0x020e0068。
0x020e0068是 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
用于控制 GPIO 选择复用功能的,pinctrl_led节点设置好复用为GPIO功能,被后面的enet1grp节点将 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
的值设置为0x10b0,也就是复用为 I2C1_SDA 功能。
所以要屏蔽设备树下iomux节点的MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07
(如果你也是跟着教程移植的设备树的话!)
授人以渔,这类问题的排查思路:在驱动里面打印出相关寄存器的值,看看和你设置的是不是一样,如果不一样肯定就是哪里被改了!这个问题我的思路就是这样逆向排查出来的
学习遇到问题,就要刨根问底才能有所收获!