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

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

物联沃分享整理
物联沃-IOTWORD物联网 » 分析gpio_direction_output()无法设置GPIO的原因

发表评论