最近要做一个HAL模块,用GPIO供电。
上网查了一下,可以通过echo N > /sys/class/gpio/export,动态导出/sys/class/gpio/gpioN,然后通过写入/sys/class/gpio/gpioN下directiion和value两个节点文件控制GPIO的输出。
这就简单了,马上改代码,编译,满怀希望地运行,蹦出了一个EACESS错误。
ls看了一下/sys/class/gpio/export的属性,owner是root。这难不倒我,马上修改ueventd.board.rc,加上一行
/sys/class/gpio/export 0660 system system
运行,还是EACESS,export的owner还是root。又上网搜了一下,原来描述sysfs需要5列,比通常的多1列。由于不明白第2列是啥意思,依样画葫芦改成
/sys/class/gpio/export enabled 0660 system system
运行,还是EACESS;这太没道理了。由于找不到太多资料,那就自己看ueventd的代码了。原来对于sysfs,要用第1列和第2列一起拼成1个路径。那就继续修改
/sys/class/gpio export 0660 system system
运行,还是EACESS。继续查看ueventd的代码,ueventd要从sysfs目录下的uevent节点中读取信息,但是/sys/class/gpio目录下并没有uevent。通过ueventd修改节点属性行不通了,除非改kernel让gpio生成uevent。
这个太麻烦了,还是简单粗暴的改/init.board.rc吧,加上
chmod system system /sys/class/gpio/export
然后在/ueventd.board.rc中加入
/sys/class/gpio/gpio8 direction 0660 system system
/sys/class/gpio/gpio8 value 0660 system system
希望在程序中控制gpio的导出,然后再设置gpio的direction/value。
运行,还是EACCESS。在程序中用stat查看节点属性,/sys/class/gpio/gpio8/direction的owner还是root。这下彻底没辙了,也没那么多功夫继续debug了。还是继续简单粗暴的修改/init.board.rc吧,于是得到
write /sys/class/gpio/export 8
chmod system system /sys/class/gpio/gpio8/direction
chmod system system /sys/class/gpio/gpio8/value
终于OK了
阅读(3649) | 评论(0) | 转发(0) |