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

linux应用编程(点亮LED)

目录

一、应用层操控硬件的两种方式

二、标准接口与非标准接口

三、LED 硬件控制方式

四、编写 LED 应用程序


一、应用层操控硬件的两种方式

Linux 系统下,一切皆文件!

  • 应用层通过对设备文件的 I/O 操作来操控硬件设备。设备文件通常在/dev/目录下,我们也把/dev 目录下的文件称为设备节点。
  • 应用层通过 sysfs 文件系统对硬件设备进行操控。建议看一下sysfs那一篇文章。

二、标准接口与非标准接口

Linux 针对各种常见的设备进行分类,譬如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备、 PWM 设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架, 这个就叫做设备驱动框架

设备驱动框架为驱动开发和应用层提供了一套统一的接口规范。例如使用 LED 驱动框架来开发自己的 LED 驱动程序,能够对上层应用层提供统一、标准化的接口、 同时又降低了驱动开发工程师的难度。

不用内核的 LED 驱动框架也是可以开发出 LED 驱动程序,驱动程序注册的 LED 那就不是标准设备,向应用层提供的接口并不是统一、 标准化接口。

三、LED 硬件控制方式

进入 “/sys/class/leds/sys-led” 目录下:

  • brightness:该属性文件可读可写; 用于设置 LED的亮度等级或者获取当前 LED 的亮度等级 brightness 等于 0 表示 LED 灭, brightness 为正整数表示 LED 亮,其值越大、 LED 越亮; 对于 PWM 控制的 LED 来说, 这通常是适用的。对于 GPIO控制的 LED 来说,只有 LED 亮和灭(brightness 为非 0 值的正整数)两种状态。
  • max_brightness: 该属性文件只能被读取,用于获取 LED 设备的最大亮度等级。
  • trigger: 触发模式,该属性文件读写LED 当前的触发模式。 通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式:

方括号([heartbeat])括起来的表示当前 LED 对应的触发模式, none 表示无触发,常用的触发模式包括 none(无触发)、 mmc0(当对 mmc0 设备发起读写操作的时候 LED 会闪烁)、 timer(LED 会有规律的一亮一灭,被定时器控制住)、 heartbeat(心跳呼吸模式, LED 模仿人的心跳呼吸那样亮灭变化)。

echo 命令进行控制:

echo timer > trigger //将 LED 触发模式设置为 timer
echo none > trigger //将 LED 触发模式设置为 none
echo 1 > brightness //点亮 LED echo 0 > brightness//熄灭 LED

四、编写 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);
	}
	

	if (!strcmp(argv[1], "on") || !strcmp(argv[1], "NO"))
	{
		write(fd1, "none", 4);
		write(fd2, "1", 1);
	}
	else if (!strcmp(argv[1], "off") || !strcmp(argv[1], "OFF"))
	{
		write(fd1, "none", 4);
		write(fd2, "0", 1);
	}
	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();
	}

	return 0;
}

在ubuntu下使用交叉编译器编译程序:

之后再用过nfs发送到开发板上,也可通过其他方式。

运行程序如下:


http://www.kler.cn/a/447239.html

相关文章:

  • 靜態IP與DHCP的區別和用法
  • Linux系统的阻塞方式和非阻塞方式是什么意思?
  • 在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题
  • 常用Python自动化测试框架有哪些?
  • 如何使用 WebAssembly 扩展后端应用
  • [数据结构] 链表
  • VSCode 中 Git 功能比较:内置 Git、GitLens 与 Git History 插件
  • 腾讯游戏安全移动赛题Tencent2016A
  • gesp(二级)(8)洛谷:B3866:[GESP202309 二级] 数字黑洞
  • 云手机测评:云端赋能的智能移动新势力
  • 解决vscode ssh远程连接服务器一直卡在下载 vscode server问题
  • 5G 模组 初始化状态检测
  • 深耕灾备国产化,YashanDB与鼎甲科技联合推出“流式备份”解决方案
  • 黄历宜忌算法 API:黄道吉日 PHP 计算方法
  • ELK系列-(五)指标收集-MetricBeat(下)
  • 部署 K8s 1.28.2(一主两从)-亲测无坑
  • 基础设施即代码初探-开发Terraform Provider管理私有云MySQL实例
  • 探索计算机存储层次体系:从寄存器到磁带
  • 6_HTML5 SVG (2) --[HTML5 API 学习之旅]
  • 周末紫蓬山行车见闻
  • UE5 移植Editor或Developer模块到Runtime
  • 强光防卫电筒TX-8610
  • Matlab个性化绘图第5期—三维分层柱状图
  • 播放端标注叠加方案
  • 高并发服务器实现总结目录
  • VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)