Linux应用层点亮硬件的LED灯

一 应用层操作硬件的两种方法

应用层想要对底层硬件进行操控,通常可以通过两种方式:

  1. /dev/目录下的设备文件(设备节点);
  2. /sys/目录下设备的属性文件。

具体使用哪种方式需要根据不同功能类型设备进行选择,通常情况下,一般简单地设备会使用sysfs方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间sysfs文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如LED、GPIO等。但对于一些较复杂的设备通常会使用设备节点的方式,譬如LCD等、触摸屏、摄像头等。

 1.1 什么是sysfs文件系统

sysfs是一个基于内存的文件系统,同devfs、proc文件系统一样,称为虚拟文件系统;它的作用是将内核信息以文件的方式提供给应用层使用,sysfs文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。、

 1.2 sysfs与/sys的关系

sysfs文件系统挂载在/sys目录下,启动ALPHA/Mini I.MX6U开发板,进入Linux系统(开发板出厂系统)之后,我们进入到/sys目录下查看,如下所示:

/sys下的子目录 说明 
/sys/devices 这是系统中所有设备存放的目录,也就是系统中的所有设
备在sysfs中的呈现、表达,也是sysfs管理设备的最重要
的目录结构。 
/sys/block 

块设备的存放目录,这是一个过时的接口,按照sysfs的设
计理念,系统所有的设备都存放在/sys/devices目录下,所

以/sys/block目录下的文件通常是链接到/sys/devices目录下的文件。 

/sys/bus 这是系统中的所有设备按照总线类型分类放置的目录结
构,/sys/devices目录下每一种设备都是挂在某种总线下
的,譬如i2c设备挂在I2C总线下。同样,/sys/bus目录下
的文件通常也是链接到了/sys/devices目录。 
/sys/class这是系统中的所有设备按照其功能分类放置的目录结构,
同样该目录下的文件也是链接到了/sys/devices目录。按照
设备的功能划分组织在/sys/class目录下,譬如/sys/class/leds
目录中存放了所有的LED设备,/sys/class/input目录中存放
/sys/dev 这是按照设备号的方式放置的目录结构,同样该目录下的
文件也是链接到了/sys/devices目录。该目录下有很多以主
设备号:次设备号(major:minor)命名的文件,这些文件都
是链接文件,链接到/sys/devices目录下对应的设备。 
/sys/firmware 描述了内核中的固件
/sys/fs 用于描述系统中所有文件系统,包括文件系统本身和按文
件系统分类存放的已挂载点。
/sys/kernel 这里是内核中所有可调参数的位置
/sys/module 这里有系统中所有模块的信息。 
/sys/power 这里是系统中电源选项,有一些属性可以用于控制整个系
统的电源状态。 

系统中所有的设备(对象)都会在/sys/devices体现出来,是sysfs文件系统中最重要的目录结构;而/sys/bus、/sys/class、/sys/dev分别将设备按照挂载的总线类型、功能分类以及设备号的形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices中。

 1.3 LED的控制方式

正点原子 I.MX6U开发板底板上有一颗可被用户控制的LED灯,如下所示:

此LED设备使用的是Linux内核标准LED驱动框架注册而成,在/dev目录下并没有其对应的设备节点,其实现使用sysfs方式控制。进入到/sys/class/leds目录下,如下所示:  

 

这里我们主要关注便是brightness、max_brightness以及trigger三个文件,这三个文件都是LED设备的属性文件:  

  1. brightness:控制LED的亮灭
  2. max_brightness:该属性文件只能被读取,不能写,用于获取LED设备的最大亮度等级。
  3. trigger:触发模式,该属性文件可读可写,读表示获取LED当前的触发模式,写表示设置LED的触发模式。不同的触发模式其触发条件不同,LED设备会根据不同的触发条件自动控制其亮、灭状态,通过cat命令查看该属性文件,可获取LED支持的所有触发模式以及LED当前被设置的触发模式:
  4. 方括号([heartbeat])括起来的表示当前LED对应的触发模式,none表示无触发,常用的触发模式包括none(无触发)、mmc0(当对mmc0设备发起读写操作的时候LED会闪烁)、timer(LED会有规律的一亮一灭,被定时器控制住)、heartbeat(心跳呼吸模式,LED模仿人的心跳呼吸那样亮灭变化)。

 大致控制方式:将设备属性文件进行写入操作

echo timer > trigger //将LED触发模式设置为timer

echo none > trigger

//将LED触发模式设置为none

echo 1 > brightness //点亮LED echo 0 > brightness//熄灭LED

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>#define  LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define  LED_ON_OFF "/sys/class/leds/sys-led/brightness"
#define  HELP()  fprintf(stderr, "usage:\n   %s <on|off>\n %s <trigger> <type>\n", argv[0], argv[0])
#define  NONE 0
#define MMC0 1
#define TIMER 2
#define HEARTBEAT 3int msg_handle(char *buf)
{if(!strcmp(buf,"none")){return NONE;}if(!strcmp(buf,"mmc0")){return MMC0;}if(!strcmp(buf,"timer")){return TIMER;}if(!strcmp(buf,"heartbeat")){return HEARTBEAT;} return -1;
}int main(int argc ,char *argv[])
{int fd1 = 0;int fd2 = 0;int ret  = 0;int write_ret = 0;if(argc < 2){HELP();exit(-1);}fd1 = open(LED_TRIGGER,O_RDWR);   //fd1设备文件操作为控制触发方式if(fd1<0){perror("触发模式:");}fd2 =  open(LED_ON_OFF,O_RDWR);  //fd2设备文件用于控制开关if(fd2<0){perror("开关状态:");}if(!strcmp(argv[1],"on")){write(fd1,"none",strlen("none"));write(fd2,"1",1);}else if(!strcmp(argv[1],"off")){write(fd1,"none",strlen("none"));write(fd2,"0",1);}else if(!strcmp(argv[1],"trigger")){if(argc != 3){HELP();exit(-1);}ret = msg_handle(argv[2]);switch (ret){case NONE:break;case MMC0:break;case TIMER:write_ret =  write(fd1,argv[2],strlen(argv[2]));if(write_ret < 0){perror("");}break;case HEARTBEAT:write_ret =  write(fd1,argv[2],strlen(argv[2]));if(write_ret < 0){perror("");}break;default:HELP();break;}}close(fd1);close(fd2);
}

程序中定义了两个宏,LED_TRIGGER和LED_BRIGHTNESS,分别对应/sys/class/leds/sys-led/trigger和/sys/class/leds/sys-led/brightness属性文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode设置vue3代码格式化

vscode设置vue3代码格式化 vscode设置vue3代码格式化 下载插件设置格式化时选用的插件实际使用 使用Prettier默认配置使用Prettier添加自定义配置使用Volar 完整配置文件参考链接 下载插件 可以使用Volar或Prettier 设置格式化时选用的插件 mac&#xff1a;【shift】【op…

【C++】类与对象 I

类与对象 I &#xff1a; 前言&#xff1a;&#xff08;C&#xff09;面向过程 和&#xff08;C&#xff09;面向对象 初步认识前言&#xff1a;类的引入一、类的介绍二、类的定义&#xff08;一&#xff09;class 语法&#xff08;二&#xff09;类的两种定义方式&#xff1a;…

【MySql系列】深入解析数据库索引

写在前面 MySQL索引是数据库中一个关键的概念&#xff0c;它可以极大地提高查询性能&#xff0c;加快数据检索速度。但是&#xff0c;要充分发挥索引的作用&#xff0c;需要深入理解它们的工作原理和使用方式。 在本文中&#xff0c;我们将深入解析MySQL索引&#xff0c;探讨它…

JavaWeb——CSS3的使用

目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素&#xff08;标签&#xff09;选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS&#xff0c;全称为“Cascading Style Sheets”&#xff0c;中文译为“层叠样式…

OpenMediaVault控制台web页面密码重置

要重置 OpenMediaVault&#xff08;OMV&#xff09;Web 控制台的密码&#xff0c;可以使用 omv-firstaid 命令行工具中的相应选项。按照以下步骤进行操作&#xff1a; 以管理员权限登录到 OMV 的命令行界面&#xff08;通过 SSH 或直接登录&#xff09;。 ssh登陆到root用户 运…

【数据仓库】数仓分层方法详解与层次调用规范

文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层&#xff1f;1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…

25.4 MySQL 函数

1. 函数的介绍 1.1 函数简介 在编程中, 函数是一种组织代码的方式, 用于执行特定任务. 它是一段可以被重复使用的代码块, 通常接受一些输入(参数)然后返回一个输出. 函数可以帮助开发者将大型程序分解为更小的, 更易于管理的部分, 提高代码的可读性和可维护性.函数在编程语言…

[01]汇川IMC30G-E系列运动控制卡应用笔记

简介 IMC30G-E系列产品是汇川技术自主研制的高性能EtherCAT网络型运动控制器&#xff08;卡&#xff09;&#xff0c;同时兼容脉冲轴的控制&#xff1b;IMC30G-E支持点位/JOG、插补、多轴同步、高速位置比较输出、PWM等全面的运动控制功能&#xff0c;具备高同步控制精度。 开发…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…

Linux编辑器:vim的简单介绍及使用

目录 1.什么是vim 2.vim的基本概念 3.vim 的基本操作 4. 各模式下的命令集 4.1 正常模式命令集 4.2 末行模式命令集 5.补充 5.1 vim支持多文件编辑 5.2 vim 的配置 1.vim 配置原理 2. 常用简单配置选项&#xff1a; 3. 使用插件 1.什么是vim Vim 是从 vi 发展出…

Easyui DataGrid combobox联动下拉框内容

发票信息下拉框联动&#xff0c;更具不同的发票类型&#xff0c;显示不同的税率 专票 普票 下拉框选择事件 function onSelectType(rec){//选中值if (rec2){//普通发票对应税率pmsPlanList.pmsInvoiceTaxRatepmsPlanList.pmsInvoiceTaxRateT}else {//专用发票对应税率pmsPlan…

nmap原理与使用

kali的命令行中可以直接使用 nmap 命令&#xff0c;打开一个「终端」&#xff0c;输入 nmap 后回车&#xff0c;可以看到 nmap 的版本&#xff0c;证明 nmap 可用。 一、端口扫描 扫描主机的「开放端口」&#xff0c;在nmap后面直接跟主机IP&#xff08;默认扫描1000个端口&am…

SQL使用

--天空会的像哭过&#xff0c;离开你以后 并没有更自由 SQL进行数据的删除 一、删除delete 语法 delete [from] 表名称 where 条件数据删除&#xff0c;不能删除某一列&#xff0c;因为删除是对记录而言 2.1 删除是一条一条删除&#xff0c;每次删除都会将操作写入日志文件 删…

个体诊所电子处方系统设计,诊所电子处方模板,药店电子处方系统,佳易王电子处方管理系统V16.0下载

个体诊所电子处方系统设计&#xff0c;诊所电子处方模板&#xff0c;药店电子处方系统&#xff0c;佳易王电子处方管理系统V16.0下载 软件支持配方模板&#xff0c;病人病历记录查询等&#xff0c;软件打印处方单所用的纸张为 A5纸。软件可以下载试用&#xff0c;点击最下方官网…

C++设计实现日志系统

转载&#xff1a;C设计实现日志系统 - 知乎 (zhihu.com) 日志系统几乎是每一个实际的软件项目从开发、测试到交付&#xff0c;再到后期的维护过程中极为重要的 查看软件代码运行流程、 还原错误现场、 记录运行错误位置及上下文等的重要依据。一个高性能的日志系统&#xff0c…

Windows上基于Tesseract OCR5.0官方语言库的LSTM字库训练

系列文章目录 Tesseract OCR引擎 文章目录 系列文章目录前言一、LSTM字库训练是什么&#xff1f;二、使用步骤1. 环境准备1.1下载Tesseract 程序并安装1.2下载Tesseract 训练字库1.3下载工具jTessBoxEditor 2. LSTM训练2.1 将要训练的图片(jpg/tif)合并成一个文件2.2 生成box文…

未来之路:大模型技术在自动驾驶的应用与影响

本文深入分析了大模型技术在自动驾驶领域的应用和影响&#xff0c;万字长文&#xff0c;慢慢观看~ 文中首先概述了大模型技术的发展历程&#xff0c;自动驾驶模型的迭代路径&#xff0c;以及大模型在自动驾驶行业中的作用。接着&#xff0c;详细介绍了大模型的基本定义、基础功…

springcloud旅游网站源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索景区&#xff0c;轮播图&#xff0c;旅游攻略列表 点击攻…

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

新版本Idea设置启动参数

1.进入配置页面 2.点击下图红框的部分&#xff0c;会看到有很多操作可选 3.选择添加VM参数即可 此时就会多出一个可以输入参数的框了&#xff0c;如下&#xff1a;