正点原子I.MX6U-MINI应用篇2点亮开发板的LED
Posted 果果小师弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正点原子I.MX6U-MINI应用篇2点亮开发板的LED相关的知识,希望对你有一定的参考价值。
在Linux 系统下,一切皆文件!应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现。开发板是如何访问磁盘、Flash、SD卡、U盘的呢?是通过将这个硬件设备挂载在linux的文件系统上,一般这些挂载的操作被人已经帮我们做好了,插上就能自动挂载,但是有时候也需要我们手动挂载。
使用df -h
命令就可以查看当前板子挂在了哪些设备。
应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/目录下,我们把/dev 目录下的文件称为设备节点。另外我们还可以通过 sysfs 文件系统对硬件设备进行操控。
一、编写程序
源码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
#define USAGE() fprintf(stderr, "usage:\\n" \\
" %s <on|off>\\n" \\
" %s <trigger> <type>\\n", argv[0], argv[0])
int main(int argc, char *argv[])
int fd1, fd2;
/* 校验传参 */
if (2 > argc)
USAGE();
exit(-1);
/* 打开文件 */
fd1 = open(LED_TRIGGER, O_RDWR);
if (0 > fd1)
perror("open error");
exit(-1);
fd2 = open(LED_BRIGHTNESS, O_RDWR);
if (0 > fd2)
perror("open error");
exit(-1);
/* 根据传参控制LED */
if (!strcmp(argv[1], "on"))
write(fd1, "none", 4); //先将触发模式设置为none
write(fd2, "1", 1); //点亮LED
else if (!strcmp(argv[1], "off"))
write(fd1, "none", 4); //先将触发模式设置为none
write(fd2, "0", 1); //LED灭
else if (!strcmp(argv[1], "trigger"))
if (3 != argc)
USAGE();
exit(-1);
if (0 > write(fd1, argv[2], strlen(argv[2])))
perror("write error");
else
USAGE();
exit(0);
二、编译程序
gcc -o led led.c
./led on
上述命令编译得到的可执行程序 hello 可以在Ubuntu 中运行,
执行file led
命令就可以看到led是64位LSB的ELF格式文件,目标机架构为x86-64,说明这个可执行文件只能在PC机上执行。
但是如果把它放到 ARM 板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86 的。我们要想给 ARM 板编译出 hello 程序,需要使用交叉编译工具链,交叉编译的工具链我们已经安装过了,详细请看【正点原子】I.MX6U 嵌入式Linux驱动开发指南V1.x.pdf 的第 4.3 小节
。我是用的是arm-linux-gnueabihf交叉编译工具链。使用arm-linux-gnueabihf-gcc -v
可以查看交叉编译工具链的版本号。
然后就可以使用下面命令编译出可以在ARM板子上运行的可执行文件了。
arm-linux-gnueabihf-gcc -o led led.c
- 1、arm 表示这是编译 arm 架构代码的编译器。
- 2、linux 表示运行在 linux 环境下。
- 3、gnueabihf 表示嵌入式二进制接口。
- 4、gcc 表示是 gcc 工具。
这样编译出来的 led程序才可以在 ARM 板子上运行。执行file led
命令就可以看出hello是32位 LSB 的 ELF 格式文件,目标机架构为ARM,说明这个交叉编译正常,可执行文件可以在ARM板上执行。
三、上传程序到开发板
开发板启动后通过nfs挂载Ubuntu目录的方式,将相应的文件拷贝到开发板上。简单来说,就是通过NFS在开发板上通过网络直接访问ubuntu虚拟机上的文件,并且就相当于自己本地的文件一样。
开发板想访问/home/zhiguoxin/myproject/alientek_app_development_source
这个目录中的文件,就要把/home/zhiguoxin/myproject/alientek_app_development_source
挂载到开发板的mnt
目录,这样就可以通过nfs来访问/home/zhiguoxin/myproject/alientek_app_development_source
了。
因为我的代码都放在/home/zhiguoxin/myproject/alientek_app_development_source
这个目录下,所以我们将这个目录作为NFS共享文件夹。设置方法参考移植SQLite3、OpenCV到RV1126开发板上开发人脸识别项目第一章。
Ubuntu IP为 192.168.10.100,然后一般都是挂载在开发板的mnt目录下,这个目录是专门用来给我们作为临时挂载的目录。
然后使用MobaXterm软件通过SSH访问开发板。
ubuntu ip:192.168.10.100
windows ip:192.168.10.200
开发板ip:192.168.10.50
在开发板上执行以下命令:
mount -t nfs -o nolock,vers=3 192.168.10.100:/home/zhiguoxin/myproject/alientek_app_development_source /mnt
就将开饭的mnt
目录挂载在ubuntu的/home/zhiguoxin/myproject/alientek_app_development_source
目录下了。这样我们就可以在Ubuntu下修改文件,然后可以直接在开发板上执行可执行文件了。当然我这里的/home/zhiguoxin/myproject/
和windows
之间是一个共享目录,我也可以直接在windows
上面修改文件,然后ubuntu和开发板直接进行文件同步了。
然后编译,可以编译成功
查看LED 状态是否与程序执行的效果一致!
以上是关于正点原子I.MX6U-MINI应用篇2点亮开发板的LED的主要内容,如果未能解决你的问题,请参考以下文章
正点原子I.MX6U-MINI应用篇1编写第一个应用App程序helloworld
正点原子I.MX6U-MINI移植篇kernel移植过程详解
正点原子I.MX6U-MINI移植篇kernel移植过程详解
正点原子I.MX6U-MINI驱动篇2嵌入式 Linux驱动开发之点灯大法