Elfboard-ELF开发板 Linux学习笔记(四)—— 应用编程篇

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灯在同时闪烁

  • 35
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君逸~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值