14.点亮 LED 灯

news2024/9/29 17:25:44

14.点亮 LED 灯

  • 1. 应用层操控硬件的两种方式
    • 1.1 sysfs 文件系统
    • 1.2 sysfs 与 /sys
    • 1.3 总结
  • 2. LED 硬件控制方式
  • 3. 编写 LED 应用程序
  • 4. 在开发板上测试

1. 应用层操控硬件的两种方式

应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现,设备文件,包括字符设备文件和块设备文件,其实设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。
设备文件通常在 /dev/ 目录下,我们也把 /dev 目录下的文件称为设备节点。设备节点并不是操控硬件设备的唯一途径,除此之外,我们还可以通过 sysfs 文件系统对硬件设备进行操控

1.1 sysfs 文件系统

sysfs 是一个基于内存的文件系统,称为虚拟文件系统。将内核信息以文件的方式提供给应用层使用。 可以产生一个包含所有系统硬件层次的视图。
在这里插入图片描述

1.2 sysfs 与 /sys

sysfs 文件系统挂载在 /sys 目录下,cd /sys,然后列出所有文件,可以发现以下文件:

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

1.3 总结

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

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

2. LED 硬件控制方式

在这里插入图片描述
主要关注以下三个文件:

  • brigntness: 亮度等级,该属性文件可读可写
  • max_brightness: 最大亮度等级,该文件只能读
  • trigger: 触发模式,可读可写
    在这里插入图片描述
    [] 括起来的内容表示触发模式,none 表示无触发,常用的触发模式有 none、mmc0(对 mmc0 发起读写操作时)、timer(定时器控制)、heartbeat(心跳呼吸模式)
    所以我们可以通过命令行控制 LED:
echo heartbeat > trigger  // 将触发模式设置为 heartbeat
echo 1 > brightnell		  // 点亮 LED

命令 cat 读取以及 echo 写入到属性文件中的格式都是字符串形式,所以使用 write() 和 read() 格式也是字符串形式

3. 编写 LED 应用程序

#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);
}

然后使用交叉编译工具进行编译,这里不详细说明交叉编译工具的安装。

4. 在开发板上测试

将生成的文件拷贝到开发板根目录下,使用不同的命令行参数就可以测试

./test on  # 点亮LED
./test off # 熄灭
./test trigger heartbeat # 修改触发方式

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

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

相关文章

python基础——锁

进程锁 (互斥锁) 进程锁的引入&#xff1a; 模拟抢票程序&#xff1a; from multiprocessing import Process import json import time def show_ticket(i):with open("./tickets.txt",mode"r",encoding"utf-8") as file:ticket json.load(f…

2024.1.22力扣每日一题——最大交换

2024.1.22 题目来源我的题解方法一 暴力法方法一 哈希表贪心方法三 贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;670 我的题解 方法一 暴力法 直接暴力对数字中的每两个位置进行交换&#xff0c;然后记录交换后生成数字的最大值 时间复杂度&#xff1a;O( log ⁡…

下拉回显问题案例大全

下拉回显问题案例大全 一、原生js案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>下拉框数据回…

13. 高级IO

13. 高级IO 1. 非阻塞 IO1.1 阻塞 IO 与非阻塞 IO 读文件 2. IO 多路复用2.1 何为 IO 多路复用2.2 select()2.3 poll()2.3.1 struct pollfd2.3.2 poll() 返回值2.3.3 示例 3. 异步 IO3.1 O_ASYNC3.2 设置异步 IO 事件的接收进程3.3 示例 4. 优化异步 IO4.1 使用实时信号替换默认…

android:persistent和android:priority的区别,对进程优先级有什么影响?

前言&#xff1a;写的apk因为系统busy给我kill了&#xff0c;(adj 900): kill all background&#xff0c;在AndroidManifest.xml添加android:persistent"true"后&#xff0c;被甲方要求不能这样做&#xff0c;还是得从adj改&#xff0c;把 priority改成1000 android…

ES6.8.6 为索引映射(Mapping)创建自定义分词器,测试分词匹配效果

文章目录 环境创建索引&#xff1a;配置自定义分词器、字段指定分词器自定义分词器参数说明创建索引&#xff1a;custom_analyzer_comment 使用索引中自定义的分词器进行分词分析自定义分词器my_custom_analyzer分词测试&#xff1a;测试中文停用词、英文字母转小写测试敏感词替…

C++1.0

思维导图 提示输入一个字符串&#xff0c;统计该字符中大写&#xff0c;小写字母个数&#xff0c;数字个数&#xff0c;空格个数以及特殊字符个数&#xff0c;要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {cout << "请输入一…

红包六(CTFshow)

jar的逆向&#xff0c;第一次接触 jd逆向工具反编译jar文件 可以直接丢进去看&#xff0c;也可以用jd反汇编工具看 这里提示flag不在这里分析一下这段代码 1. 引入必要的库: java.util.Base64: 用于处理 Base64 编码和解码。java.util.Scanner: 用于从用户输入中读取文本。…

EasyExcel实现下载模板

实体类&#xff1a; package com.aicut.monitor.domain;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.s…

浙大AIF发布年度报告:PaaS是金融机构数智化创新“加速器”

“云原生技术体系日趋成熟&#xff0c;云原生分布式PaaS平台对金融业‘用云价值’发挥三个关键作用——提升多云协同效率、降低数字化门槛和新领域试错成本&#xff0c;正成为中国金融机构数字化转型的加速器。”1月25日&#xff0c;浙江大学国际联合商学院院长、金融科技研究院…

2000-2022年中国对225个国家地区进出口数据

2000-2022年中国对225个国家地区进出口数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;UN Comtrade联合国贸易数据 3、指标&#xff1a;、年份、年份、报告国家编码、报告国家ISO编码、报告国家、进出口类别编码、进出口类别&#xff08;import进口/export出口&am…

目标检测数据集 - 人脑肿瘤检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;人脑肿瘤检测数据集&#xff0c;真实 CT 场景高质量图片数据&#xff0c;涉及人脑 CT 图片数据集丰富&#xff1b;适用实际项目应用&#xff1a;CT 图片场景下人脑肿瘤检测项目&#xff0c;以及作为通用人脑检测数据集场景数据的补充&#xff1b;标注说明…

HTML 炫酷进度条

下面是代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>Light Loader - CodePen</title><style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr…

docker(第二部分)

来自尚硅谷杨哥 少一点胡思乱想&#xff0c;心中无女人&#xff0c;编码自然神&#xff0c;忘掉心上人&#xff0c;抬手灭红尘。人间清醒&#xff0c;赚钱第一。好好学习&#xff0c;天天向上。听懂六六六。 7.Dokcer容器数据卷 1,&#xff09;坑&#xff1a;容器卷记得加入 …

【并发编程】顺序控制交替输出abc

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳重求进&#xff0c;晒太阳 必须先2后1打印 用synchronized package aaa;public class Test2 {static Boolean hasExecutorfalse;public static void main(String[] args) …

TS基础知识点快速回顾(上)

基础介绍 什么是 TypeScript&#xff1f; TypeScript&#xff0c;简称 ts&#xff0c;是微软开发的一种静态的编程语言&#xff0c;它是 JavaScript 的超集。 那么它有什么特别之处呢? js 有的 ts 都有&#xff0c;所有js 代码都可以在 ts 里面运行。ts 支持类型支持&#…

华清远见作业第三十三天——C++(第二天)

思维导图&#xff1a; 题目&#xff1a; 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数&#xff1a; 初始化函数&#xff1a;void init(int w, int h) 更改宽度的函数&#xff1a;set_w(int w) 更改高度的函数…

优思学院|如何将AI人工智能融入精益六西格玛?

在当前的制造和服务运营中&#xff0c;许多流程都在一定程度上重复进行&#xff0c;这为实验、学习和持续改进其底层流程提供了机会。直到最近&#xff0c;这些流程的改进大多由人类专家执行。然而&#xff0c;随着包括生成型AI在内的人工智能工具的出现&#xff0c;这一切都在…

阅读go语言工具源码系列之gopacket(谷歌出品)----第一集 DLL的go封装

gopacket项目是google出品的golang第三方库&#xff0c;项目源码地址google/gopacket: Provides packet processing capabilities for Go (github.com) gopacket核心是对经典的抓包工具libpcap(linux平台)和npcap(windows平台)的go封装&#xff0c;提供了更方便的go语言操作接…

JavaScript DOM之Cookie详解

cookie有的地方习惯使用复数形式的cookies&#xff0c;指的是网站为了识别用户的身份或者进行一些必要数据的缓存而使用的技术&#xff0c;它的数据是存在用户的终端上&#xff0c;也就是在浏览器上的。 一、什么是cookie 随着互联网的不断发展各种基于互联网的服务系统逐渐多…