SAM9X60 curiosity开发板,SYSFS文件系统控制板载三色Led

news/2024/7/5 3:17:08

驱动位于\buildroot-external-microchip\build\linux-custom\drivers\leds

开发板使用sam9x60_curiosity

应用层控制外设的两种不同的方式;

在 Linux 系统下,一切皆文件!

方法一:驱动层设备文件控制外设

包括字符设备文件和块设备文件,设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/ 目录下,我们也把/dev 目录下的文件称为设备节点。

方法二:sysfs文件系统控制外设

sysfs 是一个基于内存的文件系统,同 devfs 、 proc 文件系统一样,称为虚拟文件系统;它的 作用是将内核信息以文件的方式提供给应用层使用。

sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。

sysfs 文件系统挂载在 /sys 目录下,

block块设备的存放目录,这是一个过时的接口,按照sysfs的设计理念,系统所有的设备都存放在/sys/devides目录下,所以/sys/block目录下的文件通常是链接到/sys/devices目录下的文件
bus这是系统中的所有设备按照总线类型分类放置的目录结构,/sys/devices 目录下每一种设备都是挂在某种总线下的,譬如 i2c 设备挂在 I2C 总线下。同样,/sys/bus 目录下的文件通常也是链接到了/sys/devices 目录。
class这是系统中的所有设备按照其功能分类放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。按照设备的功能划分组织在/sys/class 目录下,譬如/sys/class/leds目录中存放了所有的 LED 设备,/sys/class/input 目录中存放了所有的输入类设备。
dev这是按照设备号的方式放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。该目录下有很多以主设备号:次设备号 (major:minor) 命名的文件,这些文件都是链接文件,链接到/sys/devices 目录下对应的设备。
devices这是系统中所有设备存放的目录,也就是系统中的所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。
firmware描述了内核中的固件。
fs用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。
kernel这里是内核中所有可调参数的位置。
module包含当前系统中已加载的模块,包括编译到内核和编译成模块(.ko)的驱动
power这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。

上表显示的便是 sysfs 文件系统中的目录,包括 block 、 bus 、 class 、 dev 、 devices 、 firmware 、 fs 、 kernel 、 modules、 power 等,每个目录下又有许多文件或子目录,对这些目录的说明如所示:

Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念; Linux 针对各种常见的设备进行分类,譬如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备、 PWM 设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架,这个就叫做设备驱动框架。设备驱动框架为驱动开发和应用层提供了一套统一的接口规范,譬如对 LED 类设备来说,内核提供了 LED 设备驱动框架,驱动工程师编写 LED 驱动时,使用 LED 驱动框架来开发自己的 LED 驱动程序,这样做的好处就在于,能够对上层应用层提供统一、标准化的接口、同时又降低了驱动开发工程师的难度。

编写 LED 驱动程序并不仅仅只能使用内核设计的 LED 设备驱动框架,不用内核的 LED 驱动框架也是可以开发出 LED 驱动程序的,但如果你这样写,使用这个驱动程序注册的 LED 那就不是标准设备了,因为该驱动程序向应用层提供的接口并不是统一、标准化接口

(杂项类的由来)除此之外,还有很多硬件外设,尤其是嵌入式系统中所使用到的这些硬件外设,它们可能并不属于 Linux 系统所规划的设备分类当中的任何一种设备类型,譬如在 Linux 系统中,有一种设备类型叫杂散 / 杂项类设备(misc device ),大家可以想一想为啥叫杂散类设备,说明这种设备既不属于这种设备类型、又不属于另一种设备类型,无奈只能把它归为杂项类。

进入到 /sys/class/leds 目录下

这里我们主要关注便是 brightness 、 max_brightness 以及 trigger 三个文件,这三个文件都是 LED 设备的属性文件:

⚫ brightness : 翻译过来就是亮度的意思,该属性文件可读可写;所以这个属性文件是用于设置 LED 的亮度等级或者获取当前 LED 的亮度等级,譬如 brightness 等于 0 表示 LED 灭, brightness 为正整数表示 LED 亮,其值越大、 LED 越亮;对于 PWM 控制的 LED 来说,这通常是适用的,因为它存在亮度等级的问题,不同的亮度等级对应不同的占空比,自然 LED 的亮度也是不同的;但对于 GPIO 控制(控制 GPIO 输出高低电平)的 LED 来说,通常不存在亮度等级这样的说法,只有 LED 亮(brightness 等于 0 )和 LED 灭( brightness 为非 0 值的正整数)两种状态, ALPHA/Mini I.MX6U 开发板上的这颗 LED 就是如此,所以自然就不存在亮度等级一说,只有亮和灭两种亮度等级。

⚫ max_brightness : 该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级。

⚫ trigger : 触发模式,该属性文件可读可写,读表示获取 LED 当前的触发模式,写表示设置 LED 的触发模式。不同的触发模式其触发条件不同,LED 设备会根据不同的触发条件自动控制其亮、灭状态,通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式:

  • none(无触发)

  • mmc0(当对 mmc0 设备发起读写操作的时候 LED 会闪烁)

  • timer(LED 会有规律的一亮一灭,被定时器控制住)

  • heartbeat(心跳呼吸模式, LED 模仿人的心跳呼吸那样亮灭变化)。

# cd /sys/
# ls
block     class     devices   fs        module
bus       dev       firmware  kernel    power
# cd class/
# ls
backlight     graphics      mmc_host      rfkill        udc
bdi           i2c-adapter   mtd           rtc           vc
block         i2c-dev       net           scsi_device   video4linux
bluetooth     ieee80211     phy           scsi_disk     vtconsole
devcoredump   input         power_supply  scsi_host     wakeup
devlink       leds          pps           sound         watchdog
dma           mdio_bus      ptp           spi_master
drm           mem           pwm           tty
gpio          misc          regulator     ubi
# cd leds/
# ls
blue    green   mmc0::  red
# cd blue
# ls
brightness      invert          power           trigger
device          max_brightness  subsystem       uevent
# echo 1 > brightness 
# echo 0 > brightness 
# echo 1 > brightness 
# echo timer > trigger 
# echo heartbeat > trigger
# cat brightness 
1
# cat trigger 
none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock [timer] heartbeat gpio cpu cpu0 mmc0

echo timer > trigger 现象


http://lihuaxi.xjx100.cn/news/797761.html

相关文章

明末清初三大思想家

时势造就英雄,乱世孕育思想,明末清初三大思想家,即王夫之、顾炎武、黄宗羲,他们在明末清初社会激烈变革之际,提出了许多人本主义论点,比如反对君主专制,提高商人地位,重实践、轻理论…

【0173】推荐6款最好使用的PostgreSQL GUI工具

文章目录 1. 为什么使用GUI工具?2. PostgreSQL GUI工具2.1 工具一(开源免费)2.1.1 使用教程2.2 工具二(社区免费)2.2.1 使用教程2.3 工具三(开源免费)2.3.1 使用教程2.4 工具四(收费)2.4.1 使用教程2.5 工具五(收费)2.5.1 使用教程2.6 工具六(开源免费)3. PG GUI工…

docker学习(四):DockerFile微服务实战及docker端口映射

文章目录前言1.Dockerfile介绍2.微服务实战案例3.docker端口映射3.1查看docker网络模式命令3.2docker网络模式前言 大家好,这是我学习docker系列的笔记文章,目标是掌握docker,为后续学习K8s做准备。本文记录了springBoot微服务项目通过DockerFile生成镜…

go 调试器 delve(dlv) 的使用(附实例及常用命令解释)

前言 Go 目前的调试器有如下几种: GDB 最早期的调试工具,现在用的很少。LLDB macOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve 专门为 Go 语言打造的调试工具,使用最为广泛。 本篇简单说明如何使用 Del…

logback配置指定某个包下日志单独输入独立文件

在logback-spring.xml配置文件中添加如下配置:<appender name="OPR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/opr.log</file><rollingPolicy class="ch.qos.logback.core.rolling.Size…

Metasploitable靶场

1 基本环境 虚拟机账号密码:msfadmin/msfadmin kali主机IP:192.168.5.136 metasploitable2靶机IP:192.168.5.160 使用浏览器登录靶机: 2 信息收集└─# nmap 192.168.5.16 Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-03 01:30 EST Nmap scan report for 192.168.…

JavaScript高级 ES7-ES13 新特性

1. ES7 1. Array Includes 在ES7之前&#xff0c;如果我们想判断一个数组中是否包含某个元素&#xff0c;需要通过 indexOf 获取结果&#xff0c;并且判断是否为 -1 在ES7中&#xff0c;我们可以通过includes来判断一个数组中是否包含一个指定的元素&#xff0c;根据情况&am…

Qt-源码部分编译-C++

-debug 只编译出 debug 版本&#xff0c;是默认选项&#xff08;相对于 -release 选项&#xff09; -debug-and-release 两种版本都编译 -opensource 使用 opensource 版本的Qt&#xff08;相对于 -commercial 选项&#xff09; -c11 打开 C11 的支持 -shared 使用共享库&#…