【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

时间:2023-01-03 14:52:31

【前言】
首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提供了一个非常好的入门和学习嵌入式的机会,同时在社区及技术群内也得到了很大的帮助和鼓励,这也是我不断前行和进步的动力,在这里一并致谢了。下面我附上本次学习心得及过程。
米尔MYS-6ULX单板机介绍:
MYS-6ULX是一款以NXP i.MX6UL/i.MX6ULL处理器,Cortex-A7内核为核心的嵌入式单板机,主频为528MHz。配备了256MB高速DDR3、256M NAND Flash,集成了以太网、WIFI、LCD接口、USB OTG、USB Host、TF Card、用户按键、用户LED、IO扩展接口等功能。
详细介绍:http://www.myir-tech.com/product/mys_6ulx.htm
收到米尔的板子,先上图:

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

【概述】
计划通过本次项目实现一些家庭电器设备控制,进现实现远程监控;
1,实现计时控制插排包括,计时,延时,定时,倒计时,周期开通和关闭功能;
2,实现PWM调控灯光或者风扇调速;
3,实现红外遥控控制空调。
正文:【驱动GPIO点亮外接LED】
在上一篇gpio解析基础上,我在device tree添加了自己要用到的gpio,并且简单的驱动了外接led灯,点亮和熄灭。我暂定使用资源gpio1_io9,手册上简写gpio9。今天的操作成功对于我来说是里程碑了,非常关键,项目里叫milestone。我的项目是智能插排,其中一项功能就是开关控制插座,不要小瞧了开关,有N中方法可以实现,我用继电器。有M种控制模式,比如,计时,倒计时,延时,定时,周期工作等等,花样繁多。下边分享一下我的调试过程,比较艰辛。
1. 参考dts里已经有的两个节点gpio_leds,gpio_key,先照葫芦画个瓢,添加些代码,如图所示
说明:gpio5已经被占用,我是在操作的时候发现的,就先忽略掉。
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

并且在iomux里添加如下图代码
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED
2.修改完成后,单独编译dts文件,生成dtb,然后我就懵了,怎么更新呢,总不至于全部更新一遍吧,群里求助,@软件工程师(红旗哥)给我一个方案是利用tftp,uboot引导通过tftp访问server自动下载dtb文件进行更新,好像有些难度,不过方案肯定是可以的(红旗哥对嵌入式开发还是比较熟悉的)。于是我在网上找到另外一种方法,就是说要找到开发板的dtb文件存贮的位置,然后用编译好的dtb直接替换掉,重启就可以加载了,多么简单,于是我就开始在开发板上查找脚dtb的文件一直无果,以至于我开始怀疑自己是不是忘记find命令了。直到有一份资料说可能存贮在某个特定的分区里,这时候才恍然大悟,fdisk -l 看到4个分区,又用cat /proc/partation查看了一下,如图所示
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

看到dtb了我很开心,mount上来不就可以操作了吗?用了几种参数,终于蒙对了,加载上了,然而进去查找也没有dtb文件,但是看起来目录结构有些像dtb生成的
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED
找到了比较熟悉的例程里的leds,gpio_key

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

怀疑这个整个分区就是dtb了,于是决定用dd命令试探一下,先用scp把编译好的文件传到开发板上,使用dd命令对mtdblock2进行覆盖
dd if= of=,其总if表示input file ,of表示out file大概这个意思。
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

重新启动开发板系统之后,打开系统去查找我添加的power_strip,看看是否能找到,当我看到这个参数时非常高兴,终于更新成功了
【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED
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    —> 写低电平

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

执行这个命令,控制外接的LED灯亮和熄灭了,说明设置正确,可以用来驱动继电器来控制插排了。
对比一下就明显了,要不然看不出来是亮和灭的状态

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED
后续继续更新博客,敬请关注,有同道者欢迎提出建议。
声明:本文首发在与非网社区 NXP论坛›竞技场›恩智浦/米尔i.MX6ULL竞赛专区.›作者论坛ID:leo121_3006061