使用gpio_direction_output()无法设置GPIO原因分析
在driver中使用gpio_direction_output()设置GPIO3_D7为高电平,但是系统启动之后又被设置为了低电平,问题分析。
查看GPIO电平状态
cat /sys/kernel/debug/gpio
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电源使能所以需要注释掉
};
参考资料
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输出高电平
|