OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1178|回复: 0

基于pinctrl与gpio子系统点灯实验,灯不亮问题(已解决)

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-12-1
在线时间
27 小时
发表于 2023-7-13 21:25:42 | 显示全部楼层 |阅读模式
本帖最后由 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`(如果你也是跟着教程移植的设备树的话!)


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

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



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 05:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表