• 使用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输出高电平

  • 相关阅读:
    失眠睡不着如何调理
    LaTeX 数学公式常见问题及解决方案
    python+unittest+requests+HTMLRunner搭建接口测试框架,执行用例请求多个不同请求方式的接口
    随机森林算法介绍
    [学习笔记] VFX Silhouette
    【SQL Server】入门教程(总结篇)
    吐血整理,最全Pytest自动化测试框架快速上手(超详细)
    vulfocus靶场tomcat-cve_2017_12615 文件上传
    202112-2 CCF 序列查询新解 (枚举 + 分段讨论 满分题解)
    UGUI交互组件ScrollView
  • 原文地址:https://blog.csdn.net/qq_27809619/article/details/126391046