• 使用gpio_direction_output()无法设置GPIO原因分析


    使用gpio_direction_output()无法设置GPIO原因分析

    在driver中使用gpio_direction_output()设置GPIO3_D7为高电平,但是系统启动之后又被设置为了低电平,问题分析。

    查看GPIO电平状态

    cat /sys/kernel/debug/gpio
    
    • 1

    在这里插入图片描述

    1、首先怀疑是GPIO冲突,可能是多个设备树节点都使用这个GPIO,通过查看log发现并没有GPIO申请冲突的log打印,而且打印gpio_direction_output()这个值的返回值也是设置正确的,所以系统跑的时候应该是运行正常的。
    2、初步怀疑是驱动设置为高之后,又被别的地方被拉低,是否为不规范使用导致GPIO导致,所以打算用逻辑分析仪看看是不有我们driver拉高,然后又被拉低。
    3、通过逻辑分析仪抓到的波形分析可以看到,我们的driver是有一段时间把这个GPIO拉高的动作的,但是不久之后这个IO后就有一段很长的拉低拉高的波形,这个波形很像数据传输的波形,最后IO口被拉低,然后我们有理由怀疑这个IO口是和控制器冲突了,通过查看这个IO口可以知道GPIO3_D7在RK3399芯片中是I2S0控制器DATA0输出引脚。所以我们需要在设备树中disable这个引脚。
    在这里插入图片描述

    打开\arch\arm64\boot\dts\rockchip\rk3399.dtsi

    	i2s0 {
    			i2s0_8ch_bus: i2s0-8ch-bus {
    				rockchip,pins =
    					<3 24 RK_FUNC_1 &pcfg_pull_none>,
    					<3 25 RK_FUNC_1 &pcfg_pull_none>,
    					<3 26 RK_FUNC_1 &pcfg_pull_none>,
    					<3 27 RK_FUNC_1 &pcfg_pull_none>,
    					<3 28 RK_FUNC_1 &pcfg_pull_none>,
    					<3 29 RK_FUNC_1 &pcfg_pull_none>,
    					<3 30 RK_FUNC_1 &pcfg_pull_none>;
    					//<3 31 RK_FUNC_1 &pcfg_pull_none>;   //泰山项目使用GPIO3_D7作为普通IO,用于ZIGBEE电源使能所以需要注释掉
    			};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参考资料

    linux 应用层操作GPIO
    cat /sys/kernel/debug/gpio

    #GPIO3_D7 = 127 = 323 + (4 * 8 - 1) GPIO3就是332 D7就是4*8 其中A = 0, B = 1以此类推D就是4
    echo 127 > /sys/class/gpio/export #导出GPIO3_D7
    echo out > /sys/class/gpio/gpio127/direction #设置GPIO3_D7为输出模式
    echo 1 > /sys/class/gpio/gpio127/value #设置GPIO3_D7输出高电平

  • 相关阅读:
    自然语言处理概念笔记
    17个 Python常见错误
    数据增强系列(6)使用Albumentations进行关键点增强
    ES6和ES5的区别
    《Effective C++》知识点(9)--杂项讨论
    阿里云RDS CPU100%排查
    《Premiere Pro 2022视频制作案例实战》简介
    第七章 查找 八、B树
    Mysql语句的RegExp的用法与案例
    Android -- 每日一问:你在Android开发中遇到的技术难题是什么,你是怎么解决的?
  • 原文地址:https://blog.csdn.net/qq_27809619/article/details/126391046