Elfboard-ELF开发板 Linux学习笔记(四)—— 应用编程篇 点亮LED
一、SYSFS文件系统介绍
在 Linux 系统下,一切皆文件,sysfs 是一个基于内存的文件系统,被称为虚拟文件系统,它对系统设备进行管理,产生一个包含所有系统硬件层次的视图,同时将内核信息以文件的方式提供给应用层使用。
sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、展示设备驱动模型中各组件的层次关系。sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。
sysfs 文件系统挂载在/sys 目录下
这里给大家进行一个总结,应用层想要对底层硬件进行操控,通常可以通过两种方式:
- /dev/目录下的设备文件(设备节点);
- /sys/目录下设备的属性文件。
具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。
但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD 等、触摸屏、摄像头等。
二、LED控制方式
1.进入led设备目录
2.查看该目录下个文件的作用
- brightness:翻译过来就是亮度的意思,该属性文件可读可写;所以这个属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级,譬如 brightness 等于 0 表示 LED 灭,brightness 为正整数表示 LED 亮,其值越大、LED 越亮
- max_brightness:该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级。
- trigger:触发模式,该属性文件可读可写,读表示获取 LED 当前的触发模式,写表示设置 LED 的
触发模式。不同的触发模式其触发条件不同,LED 设备会根据不同的触发条件自动控制其亮、灭状态,通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式
使用cat命令可以查看该属性文件。
三、编写LED应用程序
控制led3、led4每隔0.5秒亮灭一次
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define LED1_BRIGHTNESS "/sys/class/leds/led1/brightness"
#define LED2_BRIGHTNESS "/sys/class/leds/led2/brightness"
#define LED3_BRIGHTNESS "/sys/class/leds/led3/brightness"
#define LED4_BRIGHTNESS "/sys/class/leds/led4/brightness"
int main()
{
int on=1;
int led;
int fd1,fd2,fd3,fd4;
fd1=open(LED1_BRIGHTNESS, O_WRONLY);
fd2=open(LED2_BRIGHTNESS, O_WRONLY);
fd3=open(LED3_BRIGHTNESS, O_WRONLY);
fd4=open(LED4_BRIGHTNESS, O_WRONLY);
if(fd1<0)
{
perror("open device led1");
exit(1);
}
if(fd2<0)
{
perror("open device led2");
exit(1);
}
if(fd3<0)
{
perror("open device led3");
exit(1);
}
if(fd4<0)
{
perror("open device led4");
exit(1);
}
printf("leds test show,press ctrl+c to exit \n");
while(1)
{
write(fd3, "1", 1);
write(fd4, "1", 1);
usleep(500000);
write(fd3, "0", 1);
write(fd4, "0", 1);
usleep(500000);
}
close(fd1);
close(fd2);
close(fd3);
close(fd4);
return 0;
}
四、Ubuntu交叉编译工具编译
- 将写好的.c文件上传的Ubuntu中
- 设置交叉编译的环境变量
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
- 查看环境变量
echo $CC
- 使用交叉编译工具编译你上传的文件
$CC led.c -o led
五、开发板上进行测试
- 上传你编译好的文件到开发板中
scp led root@192.168.0.232:/home/root
- 执行程序
./led
实验现象:
两个LED灯在同时闪烁