正点原子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驱动开发之点灯大法

正点原子I.MX6U-MINI应用篇8嵌入式Linux网络通信socket编程

正点原子I.MX6U-MINI应用篇3Framebuffer应用编程,操作屏幕