基于pinctrl与gpio子系统点灯实验,灯不亮问题

基于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_IO07MX6UL_PAD_GPIO1_IO03
这些fsl,pins用到的宏定义的五个数值含义分别代表
,其中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(如果你也是跟着教程移植的设备树的话!)

授人以渔,这类问题的排查思路:在驱动里面打印出相关寄存器的值,看看和你设置的是不是一样,如果不一样肯定就是哪里被改了!这个问题我的思路就是这样逆向排查出来的

学习遇到问题,就要刨根问底才能有所收获!

你可能感兴趣的:(linux,imx6ull,pinctrl,gpio,驱动问题)