当前位置: 首页 > news >正文

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属性文件

相关文章:

Linux应用层点亮硬件的LED灯

一 应用层操作硬件的两种方法 应用层想要对底层硬件进行操控&#xff0c;通常可以通过两种方式&#xff1a; /dev/目录下的设备文件&#xff08;设备节点&#xff09;&#xff1b;/sys/目录下设备的属性文件。 具体使用哪种方式需要根据不同功能类型设备进行选择&#xff0c;通…...

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…...

[pytorch]设备选择以及卷积神经网络的应用

0.写在前面: 首先这篇文章还没写完,因为今天要尝试对我之前的一个框架做一个简单的更新迭代,所以目前先更新这么多. 1.关于设备的选择 首先,目前的大多数电脑都是自带一些GPU(图形计算单元,在这里被称之为cuda), 需要安装相关的驱动才能正常使用这些设备和调用他们的具体情况…...

API SIX系列-服务搭建(一)

APIsix简介 APISIX是一个微服务API网关&#xff0c;具有高性能、可扩展性等优点。它基于nginx&#xff08;openresty&#xff09;、Lua、etcd实现功能&#xff0c;借鉴了Kong的思路。和传统的API网关相比&#xff0c;APISIX具有较高的性能和较低的资源消耗&#xff0c;并且具有…...

hadoop 大数据环境配置 同步时间 centos服务器时间同步 linux 安装ntp服务更新时间 hadoop(六)

1. 安装ntp软件 yum install -y ntp 2.创建软连接 # 删除之前得时间 sudo rm -rf /etc/localtime;# 更新时区sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime3. 更新时间 # root 权限运行 sudo ntpdate -u ntp.aliyun.com 4. 开机自启&#xff0c;更新时间 …...

基于单片机智能输液器监控系统的设计

**单片机设计介绍&#xff0c; 基于单片机智能输液器监控系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能输液器监控系统可以实现对输液过程的实时监测和控制&#xff0c;以下是一个基本的设计介绍&am…...

Unity解决:没有UnityWebRequest.Result

当我在Unity 2019中使用Unity 2021的代码satable时。 控制台显示 “UnityWebRequest”不包含“result”的定义,并且找不到接受“UnityWebRequest”类型的第一个参数的可访问扩展方法“result”(是否缺少using指令或程序集引用?) 漏洞/问题: if (req.result == UnityWebRe…...

记录Linux的Bug

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…...

优化改进YOLOv5算法之感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等

目录 1 RFAConv原理 1.1 回顾标准卷积 1.2 回顾空间注意力 1.4 创新空间注意力与标准卷积...

【设计原则篇】聊聊里氏替换原则

是什么 子类对象可以替换程序中父类对象出现的任何地方&#xff0c;并且保证原有程序逻辑的正确性不被破坏。 比如我们在实际开发中定义了数据读取的父类&#xff0c;子类可以进行在此功能的拓展、增强但是不能修改原有的内在含义。 里氏替换原则和多态的区别&#xff0c;多态…...

k8s系列-kuboard创建工作负载 docker上传java微服务jar包到仓库的过程

文章目录 docker环境准备docker 镜像相关命令docker 容器相关命令容器和主机之间信息传递 内网中将jar包上传到docker仓库中 docker环境准备 1.查看环境中是否存在docker环境 docker version 2.不存在的话需要创建docker 镜像&#xff08;image&#xff09;&#xff1a; dock…...

基于单片机的塑料厂房气体检测系统设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计实物 四、结论五、 文章目录 概要 本文首先分析了基于单片机的可燃…...

HTTP-FLV详解及分析

文章目录 前言一、HTTP-FLV 简介1、市场上使用 http-flv 的商家2、http-flv、rtmp 和 hls 直播的优缺点3、http-flv 技术实现 二、Nginx 配置 http-flv1、Windows 安装 nginx&#xff0c;已经集成 nginx-http-flv-module2、nginx.conf 配置文件3、运行 nginx 服务器4、ffmpeg 推…...

docker应用实例及dockerfile

实际应用 神经网络项目由x86cpu的linux环境移到arm cpu架构上运行&#xff0c;使用docker进行测试以及环境配置。 docker load -i 镜像压缩文件.tar docker load -i命令用于从一个压缩的镜像存档文件&#xff08;通常是以.tar扩展名结尾&#xff09;中加载镜像到本地Docker引擎…...

【Qt之QWizard】使用1

QWizard使用 描述方法枚举&#xff1a;enum QWizard::WizardButton枚举&#xff1a;enum QWizard::WizardOption枚举&#xff1a;enum QWizard::WizardStyle枚举&#xff1a;enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…...

移植LVGL到单片机的一个demo简单介绍

简介 背景&#xff1a; 本文使用的是主控IC为stm32f103zet6, 显示IC为ST7735s&#xff0c;它是128*160的像素&#xff0c;色深为RGB565颜色。 官方虽然说LVGL移植平台只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面。但我移植到stm32f103c8t6&#xff0c;不管怎么修改配…...

rust_for_linux驱动完整版记录

文章目录 [清华开源操作系统训练营]《Rust fox Linux》课程的练习1-2完整版记录。1. 环境搭建2. 编译rust内核2.1 下载源代码2.2 安装rust支持2.3 检查linux内核是否支持rust2.4 编译linux内核 3. aarch64的qemu环境3.1.下载源代码3.2. 解压编译安装3.3. 配置环境变量3.4.验证 …...

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图&#xff0c;Kotlin&#xff08;6&#xff09; Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09;-CSDN博客文章浏览阅读1.3k次。&#xfeff;&#xfeff;Android Dyna…...

计算机网络课后作业2023秋

计算机网络第三版吴功宜版 课后作业 第一章作业三、计算与问答3.73.8 第二章作业三、计算与问答3.23.53.6 第三章作业三、计算与问答3.13.53.73.8 第四章作业三、计算与问答3.13.2 第五章作业三、计算与问答3.13.33.4VLAN交换机模式模式切换重置交换机VLA&#xff2e;配置命令其…...

阿里云国际站:全球加速GA

文章目录 一、前言 二、阿里云全球加速的概念 三、阿里云全球加速的功能优势 四、阿里云全球加速的原理 五、阿里云全球加速的应用场景 六、写在最后 一、前言 随着互联网的快速发展&#xff0c;网站速度已经成为了用户访问体验的一个重要指标。阿里云加速作为一种新的技…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...