RK3399 io操作GPIO

环境:RK3399-JD4 ubuntu18.04

SDK提供了一个io工具可以很方便的控制所有gpio口,但是当我想控制gpio3_d时却发现控制不了。DR,DDR寄存器不管怎么写都没有变化

root@firefly:/usr/bin# io -4 -w 0xff788000 0xffffffff
root@firefly:/usr/bin# io -4 -r 0xff788000           
ff788000:  00008400
root@firefly:/usr/bin# io -4 -w 0xff788000 0x0       
root@firefly:/usr/bin# io -4 -r 0xff788000    
ff788000:  00008400
root@firefly:/usr/bin# io -4 -r 0xff788004
ff788004:  00008400

iomux对应的寄存器0xff77e01c可以写成功,我把gpio3_d的8个gpio都设成了gpio模式。(要写这个寄存器必须要把高16bit的对应位置1才能生效。)

root@firefly:/usr/bin# io -4 -r 0xff77e01c 
ff77e01c:  00005555
root@firefly:/usr/bin# io -4 -w 0xff77e01c 0xffff0000
root@firefly:/usr/bin# io -4 -r 0xff77e01c           
ff77e01c:  00000000

       看wiki这个io操作也没什么特别的啊,read是没问题的,因为我用/sys/class/gpio节点操作某个gpio是可以的,设成输出之后通过io读发现确实设成了输出。

       于是研究了一下io的实现,其实也没什么,就是通过dev/mem设备把输入的寄存器地址mmap成对应的用户空间可以操作的地址。这样在用户空间可以对gpio的寄存器进行直接赋值操作。加了一些log,看流程没有任何问题,所有的操作都成功。问题肯定在别的地方。

        折腾了半天,发现可能是因为GPIO的clk没有使能导致。搜了一下,果然,gpio2,3,4的clk都没有使能。

cat clk_summary |grep gpio
             pclk_gpio4                   0            1   100000000          0 0  
             pclk_gpio3                   0            1   100000000          0 0  
             pclk_gpio2                   0            1   100000000          0 0  

使能之后果然可以设置成功了,量电平也有变化,主要还是对这个平台不熟悉,之前没弄过。

root@firefly:/sys/kernel/debug/clk/pclk_gpio3# io -4 -w 0xff788004 0xffff8400    
root@firefly:/sys/kernel/debug/clk/pclk_gpio3# io -4 -r 0xff788004           
ff788004:  ffff8400

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值