itop-3568 开发板系统编程学习笔记(18)LED 应用编程

news2024/11/17 3:56:21

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记

文章目录

  • 应用层操作 LED 的两种方式
  • sysfs 方式控制 LED
    • 控制方法
    • 原理简介
  • 编写 LED 应用程序

应用层操作 LED 的两种方式

应用层操作底层硬件有两种方法,分别是:

  1. 通过 /dev 目录下的设备节点来控制设备
  2. 通过 sysfs 文件系统控制设备

这两种方法之前的笔记都有提及,第一种方法是直接写 led 的驱动,定义一个新的字符设备或者杂项设备,然后在应用层操作 /dev 下的设备节点;第二种方法使用了 sysfs 文件系统,部分简单设备(如 LED、GPIO)的驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,用户可以直接在用户层访问和修改这些设备的属性数据。

sysfs 方式控制 LED

控制方法

下面介绍如何使用 sysfs 方式控制 LED,在命令行终端进入 /sys/class/leds 目录,

在这里插入图片描述

该目录下的 work 即为 iTOP-3568 开发板上的 LED 接口,这是一个目录文件,进入该目录,会出现多个文件,

在这里插入图片描述

brightness 表示 LED 的亮度,可取范围为 0 ~ max_brightness(不过 iTOP-3568 的 LED 不支持亮度调节,brightness 非 0 表示灯亮,0 表示灯灭)
max_brightness 即 LED 设备最大亮度,该属性只读
trigger 表示 LED 灯的触发方式,可取值包括:none(无触发)、disk-activity(硬盘活动触发)、nand-disk(nand flash 活动触发)、mdt(mtd 设备活动触发)、timer(定时器触发)和 heartbeat(系统心跳触发)

亮灯操作:

echo 1 > brightness

灭灯操作:

echo 0 > birghtness

让 LED 闪烁:

echo tiemr > trigger

虽然上面提到 trigger 可以有很多种类型,但我所用的开发板系统只支持 none 和 timer 两种触发方式。


原理简介

sysfs 下的 LED 设备在内核中属于 LED 子系统驱动框架,LED 子系统实际就是一个 leds 类,用户层可以通过 sysfs 文件系统对 LED 进行控制。

LED 子系统驱动源码在 kernel/drivers/leds/ 目录下的 led-gpio.c 中( led-class.c 和 led-core.c 两个文件也很重要),要让系统支持 LED 子系统,需要在内核配置中打开这三个文件的编译,在 kernel/drivers/leds/Makefile 中可以查看这三个文件的配置名:

在这里插入图片描述

然后在内核配置中将它们打开(其中 CONFIG_NEW_LEDS 在打开 LED Support 后就固定打开了,即第一行 LED Support)

在这里插入图片描述

以下是 CONFIG_LEDS_GPIO 的帮助信息,

在这里插入图片描述

从上面的帮助信息,我们可以得知:向 sysfs 添加 leds 设备的前提是平台设备文件或者设备树里有 leds 的配置信息。

iTOP-3568 使用的是设备树,打开相应的设备树文件,可以看到 leds 节点,LED 子设备的匹配值为 "gpio-leds"(在 led-gpio.c 中定义了 compatible 属性),节点 leds 下的 work 子节点对应的便是开发板 sysfs 下的 work 目录,该节点下定义了 gpios 等属性。

在这里插入图片描述

根据原理图可以得知:iTOP-3568 开发板的 LED 对应的 IO 接口为 GPIO0_B7,与设备树里的 gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;对应。设备树里的 gpio 属性是 sysfs 点灯的关键。

在这里插入图片描述

LED 子系统的驱动和设备配置完成后,我们就能在开发板 /sys/class/leds 目录下操作 LED 设备了。

编写 LED 应用程序

上面只提到了如何在命令行操作 LED,下面介绍一下如何在应用程序中操作 /sys/class/leds 下的 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_BRIGHTNESS "/sys/class/leds/work/brightness"
#define LED_TRIGGER    "/sys/class/leds/work/trigger"

int main(int argc, char** argv)
{
	int fd1, fd2;
	int ret = 0;
	
	// 判断输入的参数
	if(argc != 3)
	{
		printf("The right format: ./app <LED_BRIGHTNESS> <LED_TRIGGER>\n");
		return 0;
	}
	
	// 打开 LED_BRIGHTNESS 文件
	fd1 = open(LED_BRIGHTNESS, O_RDWR);
	if(fd1 < 0)
	{
		printf("%s open failed.\n", LED_BRIGHTNESS);
		return 0;
	}
	printf("%s open successfully.\n", LED_BRIGHTNESS);
	
	// 打开 LED_TRIGGER 文件
	fd2 = open(LED_TRIGGER, O_RDWR);
	if(fd2 < 0)
	{
		printf("%s open failed.\n", LED_TRIGGER);
		return 0;
	}
	printf("%s open successfully.\n", LED_TRIGGER);

	// 操作 LED 亮灭
	if(!strcmp(argv[1], "on"))
	{
		write(fd1, "1", 1);
	}
	else if(!strcmp(argv[1], "off"))
	{
		write(fd1, "0", 1);
	}
	else // 无效参数
	{
		printf("ERROR: LED_BRIGHTNESS is invalid.\n");
	}
	
	// 操作 LED 触发方式
	if(!strcmp(argv[2], "none"))
	{
		write(fd2, "none", 4);
	}
	else if(!strcmp(argv[2], "timer"))
	{
		write(fd2, "timer", 5);
	}
	else // 无效参数
	{
		printf("ERROR: LED_TRIGGER is invalid.\n");
	}

	// 关闭设备文件
	close(fd1);
	close(fd2);
	return 0;
}

测试结果:

在这里插入图片描述

此时开发板上的 LED 开始规律性闪烁(实物就不展示了)。

个人认为,操作 sysfs 最简单的方式应该是直接使用系统调用,如 system("echo 1 > /sys/class/leds/work/brightness");

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

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

相关文章

数据治理与数据中台架构

随着工业 4.0 时代的到来&#xff0c;传统行业的数字化转型是大势所趋&#xff1b;将数据提高到数据要素层面&#xff0c;让传统的技术在新的场景下发挥出新的作用&#xff0c;是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年&#xff0c;聚焦于传统数据建模和数据…

PostgreSQL中的复制延迟

PostgreSQL是一个流行的开源关系数据库管理系统&#xff0c;PostgreSQL中可能遇到的一个常见问题是复制延迟。 在这篇博客中&#xff0c;我们将讨论什么是复制延迟&#xff0c;它为什么会发生&#xff0c;以及如何在PostgreSQL中减轻它。 什么是复制延迟&#xff1f; 复制延迟…

Flink系列-9、Flink DataStream的输入数据集Data Source

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 addSource方…

【A component required a bean of type ‘xxx‘ that could not be found.】

在学谷粒商城项目的时候出现了以下问题&#xff1a; *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…

React-Router详解

React-Router详解 简介React-Router React-Router是一款用于构建单页面应用&#xff08;SPA&#xff09;中处理路由的JavaScript库。在现代的Web应用中&#xff0c;SPA已经成为了一种常见的应用架构模式&#xff0c;它允许在不刷新整个页面的情况下进行交互式的用户体验。而Re…

GPT能给审计带来什么

ChatGPT的出现&#xff0c;让人工智能再次站在了聚光灯下&#xff0c;引发持续性的热议和关注。GPT模型作为重要的支撑&#xff0c;国内外近段时间密集性地发布了众多的大语言模型&#xff0c;OpenAI推出GPT-4、谷歌推出LaMDA和PaLM等大模型、Meta推出开源大模型LLaMA&#xff…

2023-04-23 学习记录--C/C++-邂逅C/C++(中)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 上一篇&#xff1a;邂逅C/C&#xff08;上&#xff09; 一、if语句 ⭐️ &#xff08;一&#xff09;、格式 &#x1f36d; if…

6.1 欧拉方法与改进欧拉方法

6.1.1 欧拉方法 欧拉方法是一种数值解常微分方程&#xff08;ODE&#xff09;的方法&#xff0c;可以用于近似求解给定的初值问题。它是以欧拉命名的瑞士数学家莱昂哈德欧拉所发明的&#xff0c;因此得名。 欧拉方法的基本思路是将连续的常微分方程转化为离散的形式。具体而言…

全功能药效团图谱(Full-feature pharmacophore map)是什么?怎么绘制?

药效团和全功能药效团图谱是什么&#xff1f; 药效团是指与靶点相互作用并导致生物活性的化学基团或者分子结构片段。【药效团通常包括氢键受体/供体、疏水部位、离子化部位等关键成分】 "全功能药效团图谱" &#xff08;Full-feature pharmacophore map&#xff0…

.net6 core web项目发布部署到Linux,以守护进程服务的形式部署启动,nginx实现转发

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…

toRef

toRef就是把什么东西变成ref 用这个页面来讲解 改成这样就用不了&#xff0c;失去了响应的功能 为什么会这样&#xff1f; 看这个页面&#xff0c;其实这个Proxy的实现就响应式的原理&#xff0c;但是let namep.name实际上就是let name张三&#xff0c;只是把这个值给了name&…

Android 日志框架使用

在实际开发中&#xff0c;经常会遇到需要打印日志并保存到文件中&#xff0c;便于后面取日志分析代码运行情况&#xff0c;当然如果只是打印日志不需要记录文件&#xff0c;使用android自带的log工具就完全够了&#xff0c; Log打印日志会记录到系统日志中&#xff0c;可以取出…

光敏电阻传感器模块资料

实物项目案例 实物图&#xff1a; PCB图&#xff1a; 原理图&#xff1a; 用途&#xff1a; 光线亮度检测,光线亮度传感器&#xff0c;智能小车寻光模块 模块特色&#xff1a; 1、采用灵敏型光敏电阻传感器 2、比较器输出&#xff0c;信号干净&#xff0c;波形好&#x…

【Leetcode】10. 正则表达式匹配

10. 正则表达式匹配&#xff08;困难&#xff09; 题解 如果从左向右进行匹配的话&#xff0c;需要考虑字符后是否有 * 。 因此选择从右向左扫描更为简单。 *前面肯定有一个字符&#xff0c;它像是一个拷贝器&#xff0c;能够复制前面的单个字符&#xff0c;甚至也可以把这个…

Java 1.8新特性

接口的默认方法 Java 8允许给接口添加一个非抽象的方法实现&#xff0c;只需要使用default关键字即可&#xff0c;这个特征又叫做扩展方法 interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);} }Formula接口在拥有calculate方法之…

【Linux初阶】进程的相关概念 | 进程管理 查看进程 获取进程标识符 fork进程创建

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程的概念&#xff0c;进程管理初识&#xff08;描述、管理进程&#xff09;&#xff0c;查看进程的基础方法…

【Nav2】ROS2 Eloquent中使用robot_state_publisher发布松灵Scout mini的urdf

【背景】 本来打算把ROS1版本的松灵Scout mini 模型描述文件直接移植到ROS2的工作空间里去&#xff0c;用robot_state_publisher加载出来&#xff0c;结果行不通&#xff1b;于是找到了ROS2版本的Scout mini 模型描述&#xff0c;结果因为我用的是 Eloquent 版本&#xff0c;而…

MobTech MobPush|A/B测试提升运营决策

在实际推送过程中&#xff0c;我们常常有这样的困惑&#xff1a; 我们如何确定哪种推送内容更能吸引用户&#xff1f; 我们如何衡量推送效果的提升程度&#xff1f; 我们如何优化推送方案&#xff0c;实现更高的ROI&#xff1f; 为了解决这些困惑&#xff0c;我们需要一种科…

碳中和成“必答题”,宁德时代创造产业“零碳”新维度

文 | 智能相对论 作者 | leo陈 2021年&#xff0c;麻省理工学院的教授索尔格里菲斯出版了《零碳未来》一书&#xff0c;这本著作总结了数十年的研究经验和数据&#xff0c;紧迫地提出&#xff0c;我们需要可以利用现有技术和资源快速应对气候变化的“零碳行动方案”。 既要保…

Netty时间轮源码解析

Netty主要应用用于网络通信&#xff0c;Netty还有一个非常重要的应用领域&#xff0c;即时通信系统IM, 在IM聊天系统中&#xff0c;有成千上万条条链路&#xff0c; Netty是如何管理这些链路的呢 &#xff1f; Netty还有一套自带的心跳检测机制&#xff0c;这套检测机制的原理是…