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

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值