【应用开发一】LED开发

文章目录

  • 1应用层控制外设的两种方式
  • 2 sysfs和/sys关系
  • 3 LED控制方式
    • 3.1 基本情况
    • 3.2 LED属性文件介绍
    • 3.3 命令行属性测试
    • 3.4 led程序
    • 3.5 开发板上测试

1应用层控制外设的两种方式

  1. 使用设备文件控制
    在Linux系统下,一切皆是文件。应用层控制底层硬件同样也是通过文件IO的方式。设备文件可以理解为硬件层向应用层提供的接口。应用层通过对设备文件IO的操作来操控硬件设备。设备文件通常在/dev/目录下,所以/dev目录下的文件成为设备节点。
  2. 使用sysfs文件系统
    还有一种方式是通过sysfs文件系统控制。sysfs文件系统是基于内存的文件系统,也是一种虚拟文件系统,他的作用是将内核信息已文件形式提供给应用层使用。他的主要功能是对系统设备进行管理,产生一个包含所有硬件层次的试图。
    sysfs提供可一种机制,可以显示的描述内核对象、对象属性以及对象间关系,用来导出内核对象的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。内核对象、对象属性以及对象间关系在用户空间sysfs中的表现如下表:
    内核中的组成要素sysfs中的表现
    内核对象(硬件设备)目录
    对象属性(设备属性)文件
    对象关系链接文件
  3. 总结
    应用层对底层硬件控制的两种方式:
    • /dev/目录下的设备文件(设备节点)
    • /sys/目录下设备的属性文件
      具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些文件只能通过sysfs方式进行操控。通常情况下,一般简单的设备会是用sysfs方式操作,例如led、GPIO等。对于复杂的文件,例如LCD、触摸屏、摄像头等,需要使用设备节点操作。

2 sysfs和/sys关系

sysfs文件系统挂载在/sys 目录下。sysfs文件系统中的目录包括block、bus、dev、devices、firmware、fs、kernel、modules、power等,每个目录下有许多文件或者子目录,对于这些目录的说’‘明如下所示(/sys目录下内容):
在这里插入图片描述

  1. devices
    系统中所有设备存放目录,sysfs管理设备的最重要的目录结构。
    在这里插入图片描述

  2. block
    块设备的存放目录,过时的接口,该目录下的文件通常是连接到’/sys/devices’目录下的文件。
    在这里插入图片描述

  3. bus
    所有设备按总线类型分类放置的目录结构,'/sys/devices’目录下的每种设备都是挂载在某种总线下的,例如i2c总线,同样,该目录下的文件也是链接到’sys/devices’目录下的。
    在这里插入图片描述

  4. class
    所有设备按照其功能分类放置的目录结构,例如led设备。'/sys/class/input’目录存放着所有输入类设备。
    在这里插入图片描述

  5. dev
    按照设备号的方式放置目录结构,该目录下有很多以主设备号:次设备号命令的文件,这些文件都是链接文件,连接到’/sys/devices’目录下。
    在这里插入图片描述

  6. firmware
    描述内核中的固件
    在这里插入图片描述

  7. fs
    描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。
    在这里插入图片描述

  8. kernel
    内核中所有的可调参的位置
    在这里插入图片描述

  9. module
    系统中所有模块信息
    在这里插入图片描述

  10. power
    系统中电源选项,有一些属性可以用于控制整个系统的电源状态
    在这里插入图片描述

系统中所有设备都会在/sys/devices中体现出来,是sysfs文件系统最重要的目录结构。

3 LED控制方式

3.1 基本情况

硬件情况:使用底板上的DS0 led(用户可以控制的唯一LED)
开发板启动方式:emmc启动
mmc中的系统:正点原子的系统
交叉编译器:arm-linux-guneabihf-

控制方式:sysfs文件系统
控制目录:/sys/class/led

3.2 LED属性文件介绍

进入到/sys/class/led目录下,该目录中存放着所有的LED设备,目录如下图所示:
在这里插入图片描述

可以看到该目录中有一个sys-led的文件夹,这个就是底板上LED的设备文件,该目录下文件如下图所示:
在这里插入图片描述

这里主要关注brightness、max_brightness以及trigger三个文件,这三个都是LED的属性文件。

  • brightness:亮度
    可读可写,设置led的亮度等级,
    0:灭
    正整数:pwm控制的led:值越大,led越亮
    GPIO控制的led:亮
  • max_brightness:最大亮度等级
    只读文件
  • trigger:触发模式
    可读可写,设置当前LED触发模式,读表示获取当前触发模式,写表示设置当前触发模式。
    触发模式:方括号[ ]括起来的表示当前触发模式
    • none:无触发
    • mmc0:对mmc0设备读写时led会闪烁
    • timer:有一定规律的亮灭,定时器控制
    • heartbeat:心跳呼吸模式

通常系统启动之后,都会将板子上的一颗led设置为heartbeat触发模式,表示系统正在正常运行。

3.3 命令行属性测试

通过echo命令进行LED控制

echo timer > trigger		// 将led触发模式设置为定时触发
echo none > trigger			// 将led触发模式设置为无触发模式
echo 1 > brightness			// 点亮led

3.4 led程序

gitee: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 fd_trigger, fd_brightness;

    /* 判断输入参数个数 */
    if( argc < 2 ) {
        USAGE();
        exit(-1);
    }

    /* 打开文件 */
    fd_trigger = open(LED_TRIGGER, O_RDWR);
    if (fd_trigger < 0 ) {
        perror("open trigger error");
        exit(-1);
    }

    fd_brightness = open(LED_BRIGHTNESS, O_RDWR);
    if (fd_brightness < 0 ) {
        perror("open brightness error");
        exit(-1);
    }

    /* 判断输入参数 */
    if ( !strcmp(argv[1],"on") ) {
        write(fd_trigger, "none", 4);
        write(fd_brightness, "1", 1);
    } else if ( !strcmp(argv[1], "off") ) {
        write(fd_trigger, "none", 4);
        write(fd_brightness, "0", 1);
    } else if ( !strcmp(argv[1], "trigger")) {
        if ( argc != 3 ) {
            USAGE();
            exit(-1);
        }

        if ( write(fd_trigger, argv[2], strlen(argv[2]) ) < 0 ) {
            perror("set trigger faile");
        }
    } else {
        USAGE();
    }

    close(fd_trigger);
    close(fd_brightness);

    exit(0);
}

因为是运行在I.MX6ULL平台上,所以要是用交叉编译器编译,makefile文件内容如下:

TARGET ?= led				# 目标文件
CROSS_COMPILE ?= arm-linux-gnueabihf-		# 交叉编译器

CC = $(CROSS_COMPILE)gcc		
LD = $(CROSS_COMPILE)ld		

src = led.c		# 源码文件

$(TARGET):$(src)
	$(CC) -o $@ $<


.PHONY: clean			# 伪目标

# 清除工程
clean:
	rm -rf *.o $(TARGET)

3.5 开发板上测试

将编译好的二进制文件使用scp命令发送到开发板上。在开发板中执行下面命令,观察led变化。二进制文件一定要有可执行权限。

./led on					// 亮
./led off					// 灭
./led trigger heartbeat 	// 呼吸模式	

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS开发 - 日志打印

在程序开发过程中&#xff0c;日志输出是不可或缺的一部分。能有效的记录和分析日志数据&#xff0c;使开发人员可以更好地了解程序的运行状况、解决问题、优化性能并满足合规性要求等。 当程序出现错误或异常时&#xff0c;日志记录输出可以帮助开发人员快速定位问题发生的位置…

Docker 从入门到精通(大全)

一、概述 1.1 基本概念 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。…

基于CRITIC-TOPSIS法的各地区评价

1.CRITIC-TOPSIS法原理 1.1 基本理论 CRITIC-TOPSIS法是一种结合CRITIC&#xff08;Criteria Importance Through Intercriteria Correlation&#xff09;法和TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;法的综合评价方法…

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…

【ONLYOFFICE8.1桌面编辑器】强势来袭—— 一款全面的办公软件套件

在日常工作和学习中&#xff0c;我们经常需要处理各种文档、表格和演示文稿。一款功能强大、易于使用的办公软件成为我们提高工作效率、便捷沟通和展示想法的得力助手。 而ONLYOFFICE 8.1桌面编辑器正是一款全面、高效的办公软件&#xff0c;集合了Word、PPT、Excel的功能&…

ubuntu的不同python版本的pip安装及管理

ubuntu的不同python版本的pip安装及管理_ubuntu 安装两个pip-CSDN博客https://blog.csdn.net/qq_32277533/article/details/106770850

抖音直播违规规定有哪些?(直播违禁词汇总表)

全民直播的同时也有不少新手直播玩家处处碰壁,直播间没人气,直播不知道说什么甚至直播间被封。 收到直播封禁通知的朋友,轻者封禁直播账号两三天,严重着可能永久封禁直播间! 今天我们重点来说说直播间被封是怎么回事?如何避免抖音直播间被封?抖音直播间违规规定有哪些?抖音…

[spring] Spring MVC Thymeleaf(下)

[spring] Spring MVC & Thymeleaf&#xff08;下&#xff09; 上篇笔记讲了一下怎么使用 thymeleaf 作为 HTML 模板&#xff0c;与 Spring MVC 进行沟通&#xff0c;这里主要说一下验证的部分 常用表单验证 一些 Spring MVC 内置的常用验证注解如下&#xff1a; Annota…

Redis 7.x 系列【6】数据类型之字符串(String)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 GETSET2.6 STRLEN2.7 SETEX2.8…

8.12 矢量图层面要素单一符号使用七(随机标记填充)

文章目录 前言随机标记填充&#xff08;Random Marker Fill&#xff09;QGis设置面符号为随机标记填充&#xff08;Random Marker Fill&#xff09;二次开发代码实现随机标记填充&#xff08;Random Marker Fill&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中使用随…

解决node: bad option: -V

出现这个问题是由于我们的不当操作造成的&#xff0c;v是需要小写的&#xff0c;看下图 node --version node -v

KT6368A-sop8蓝牙主机芯片获取电动车胎压传感器数据功能

KT6368A蓝牙芯片新增主机模式&#xff0c;扫描周边的胎压传感器&#xff0c;这里扮演的角色就是观察者。因为测试胎压传感器&#xff0c;发现它的广播模式可发现&#xff0c;不可连接 胎压传感器部分的手册说明如下&#xff0c;关于蓝牙部分的协议 实际蓝牙芯片收到的数据&…

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

【激光雷达使用记录】—— 如何在ubuntu中利用ros自带的rviz工具实时可视化雷达点云的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、查看雷达数据的 frame_id1. 查看雷达数据的话题2. 查看数据的frame_id 二、可视化雷达数据总结 前言 RViz&#xff08;ROS Visualization&#xff09;是机…

Etsy店铺销量持续增长?揭秘我的稳定运营秘诀

一、什么是Esty&#xff1f; 今天的这篇文章应该是很多Etsy的卖家都十分关心的。相信了解过Etsy平台的家人们都知道&#xff0c;Etsy主要是一个专注于手工制品、古董和创意商品的电子商务平台&#xff0c;更是全球利润最高的跨境电商平台。利润高就会吸引更多的人前来注册店铺…

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

数字化转型第三步:数字化业务创新与发展,提升收入和利润

引言&#xff1a;之前笔者的文章发布了企业数字化转型业务部分&#xff0c;如【开源节流】如何通过数字化转型增强盈利能力&#xff1f;企业供应链数字化转型如何做&#xff1f;让企业盈利能力增强再飞一会 【财务数字化转型之底座】集团企业财务数据中台系统建设方案 等文章&a…

Win10可用的VC6.0绿色版及辅助插件assist_X

VC6.0&#xff0c;作为微软的经典开发工具&#xff0c;承载着无数开发者的青春与回忆。它曾是Windows平台上软件开发的重要基石&#xff0c;为开发者们提供了稳定且强大的编程环境&#xff0c;尤其是其MFC&#xff08;Microsoft Foundation Classes&#xff09;库&#xff0c;为…

构建实用的Flutter文件列表:从简到繁的完美演进

前言&#xff1a;为什么我们需要文件列表&#xff1f; 在现代科技发展迅速的时代&#xff0c;我们的电脑、手机、平板等设备里积累了大量的文件&#xff0c;这些文件可能是我们的照片、文档、音频、视频等等。然而&#xff0c;当文件数量增多时&#xff0c;我们如何快速地找到…