初级会员
- 积分
- 133
- 金钱
- 133
- 注册时间
- 2018-12-1
- 在线时间
- 28 小时
|
本帖最后由 JasonOpendev 于 2023-7-13 21:28 编辑
还是推荐去CSDN看我这篇文章,因为是用markdown写的初稿,在opendev的平台上看着格式没这么舒服。
传送门:
基于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_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`(如果你也是跟着教程移植的设备树的话!)
授人以渔,这类问题的排查思路:在驱动里面打印出相关寄存器的值,看看和你设置的是不是一样,如果不一样肯定就是哪里被改了!这个问题我的思路就是这样逆向排查出来的
学习遇到问题,就要刨根问底才能有所收获!
|
|