本帖最后由 leo121_3006061 于 2018-7-6 12:11 编辑
在上一篇gpio解析基础上,我在device tree添加了自己要用到的gpio,并且简单的驱动了外接led灯,点亮和熄灭。我暂定使用资源gpio1_io9,手册上简写gpio9。今天的操作成功对于我来说是里程碑了,非常关键,项目里叫milestone。我的项目是智能插排,其中一项功能就是开关控制插座,不要小瞧了开关,有N中方法可以实现,我用继电器。有M种控制模式,比如,计时,倒计时,延时,定时,周期工作等等,花样繁多。下边分享一下我的调试过程,比较艰辛。
1. 参考dts里已经有的两个节点gpio_leds,gpio_key,先照葫芦画个瓢,添加些代码,如图所示
说明:gpio5已经被占用,我是在操作的时候发现的,就先忽略掉。
并且在iomux里添加如下图代码
2.修改完成后,单独编译dts文件,生成dtb,然后我就懵了,怎么更新呢,总不至于全部更新一遍吧,群里求助,@软件工程师(红旗哥)给我一个方案是利用tftp,uboot引导通过tftp访问server自动下载dtb文件进行更新,好像有些难度,不过方案肯定是可以的(红旗哥对嵌入式开发还是比较熟悉的)。于是我在网上找到另外一种方法,就是说要找到开发板的dtb文件存贮的位置,然后用编译好的dtb直接替换掉,重启就可以加载了,多么简单,于是我就开始在开发板上查找脚dtb的文件一直无果,以至于我开始怀疑自己是不是忘记find命令了。直到有一份资料说可能存贮在某个特定的分区里,这时候才恍然大悟,fdisk -l 看到4个分区,又用cat /proc/partation查看了一下,如图所示
看到dtb了我很开心,mount上来不就可以操作了吗?用了几种参数,终于蒙对了,加载上了,然而进去查找也没有dtb文件,但是看起来目录结构有些像dtb生成的
找到了比较熟悉的例程里的leds,gpio_key
3. 怀疑这个整个分区就是dtb了,于是决定用dd命令试探一下,先用scp把编译好的文件传到开发板上,使用dd命令对mtdblock2进行覆盖
dd if= of=,其总if表示input file ,of表示out file大概这个意思。
4. 重新启动开发板系统之后,打开系统去查找我添加的power_strip,看看是否能找到,当我看到这个参数时非常高兴,终于更新成功了
5.加载完成,就要验证一下是不是这个设备是正确的,打开路径/sys/class/gpio/gpio9,这个应该是我在设备树里添加的,然后在这里生成出来的。
纠正一下错误,当时我的做了很多操作(是后补的帖子,就把这件事混淆了,非常抱歉),上边gpio9不是从设备树生成出来的,是通过下边的命令,感谢@apple_9938下边回帖提出的质疑,我再三检查了一下,但是power_strip确实是从设备树生成出来的,怎么像leds一样注册在/sys/class目录下,这一步我还不知道。
echo 9 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio9/direction echo 1 > /sys/class/gpio/gpio9/value ---> 写高电平 echo 0 > /sys/class/gpio/gpio9/value ---> 写低电平
执行这个命令,控制外接的LED灯亮和熄灭了,说明设置正确,可以用来驱动继电器来控制插排了。
对比一下就明显了,要不然看不出来是亮和灭的状态
|