1、前言
我們學(xué)習(xí)嵌入式,無論是C51、STM32或者是ARM,都是從點燈開始的,點燈在嵌入式中的地位等同于Hello World在各大語言中的地位!
雖然LED功能簡單,但是其麻雀雖小,五臟俱全,在學(xué)習(xí)Linux驅(qū)動開發(fā)的過程中,學(xué)習(xí)LED子系統(tǒng),往往也能夠起到牽一發(fā)而動全身的作用,也更有益于大家熟悉驅(qū)動開發(fā)的框架!
2、LED裸機處理
我們在學(xué)習(xí)Linux驅(qū)動框架的時候,第一步要做的就是去掉子系統(tǒng)的面紗,先弄明白裸機處理的流程!

有嵌入式經(jīng)驗的朋友,對LED的裸機在清楚不過了,上面是LED的硬件電路,通常一端接到VCC,一端接到GPIO,當(dāng)GPIO拉低時,LED亮;當(dāng)GPIO拉高時,LED滅。
在這里裸機我們不過多了解了,目的在于窺探LED子系統(tǒng)。
3、LED子系統(tǒng)框架
框架是什么?
框架是一個規(guī)范,為我們開發(fā)者增加限制的同時,也是為了更好的開發(fā)新的程序,新的功能,其目的主要是:將不變的成分剝離開來,固化進框架,讓開發(fā)者做最少的事情!

框架所處的位置,正如上圖所示,由下往上看:
Hardware:我們的硬件設(shè)備,指的是LED
硬件驅(qū)動層:是直接操作硬件的實現(xiàn),用于驅(qū)動硬件,實現(xiàn)相應(yīng)的功能,并且將硬件設(shè)備注冊進框架之中。
核心層:將LED進行統(tǒng)一管理,向下提供注冊接口,向上提供統(tǒng)一訪問接口,方便用戶訪問
用戶層:用戶通過指定的文件節(jié)點,能夠直接控制LED的亮滅。?
4、LED子系統(tǒng)目錄結(jié)構(gòu)及核心文件
了解完LED子系統(tǒng)框架之后,我們來分析一下其相關(guān)的目錄結(jié)構(gòu)!
ketnel
│?? └── driver
│?? │?? └── leds
│?? │?? │?? ├──Makefile
│?? │?? │?? ├──led-core.c
│?? │?? │?? ├──led-gpio.c
│?? │?? │?? ├──led-class.c
│?? │?? │?? ├──led-triggers.c
│?? │?? │?? ├──......
│?? │?? │?? └── trigger
│?? │?? │?? │?? ├── ledtrig-cpu.c
│?? │?? │?? │?? ├── ledtrig-heartbeat.c
│?? │?? │?? │?? ├── .......
上面即為LED子系統(tǒng)的目錄結(jié)構(gòu),其主要核心文件有:
led-gpio.c:直接控制硬件設(shè)備,并且將其硬件設(shè)備注冊進入LED驅(qū)動框架
led-core.c:核心層實現(xiàn),抽象軟件實現(xiàn)的相關(guān)功能,如閃爍,亮度設(shè)置等等,并管理LED設(shè)備
led-class.c:定義用戶訪問的相關(guān)接口
led-triggers.c:LED出發(fā)功能的抽象
ledtrig-cpu.c:將LED作為CPU燈
ledtrig-heartbeat.c:將LED作為心跳燈
5、sysfs目錄結(jié)構(gòu)
在上面,我們了解了Linux下LED子系統(tǒng)相關(guān)的幾個重要文件,那么該子系統(tǒng)在嵌入式設(shè)備的sysfs中的具體表現(xiàn)又是如何的呢?
5.1 確保LED子系統(tǒng)打開
我們?nèi)绻趦?nèi)核中打開了LED子系統(tǒng)目錄下的Makefile文件,也就是kernel/drivers/leds/Makefile,我們看到
# SPDX-License-Identifier: GPL-2.0# LED Coreobj-$(CONFIG_NEW_LEDS)+= led-core.oobj-$(CONFIG_LEDS_CLASS)+= led-class.oobj-$(CONFIG_LEDS_CLASS_FLASH)+= led-class-flash.oobj-$(CONFIG_LEDS_TRIGGERS)+= led-triggers.o
我們必須在內(nèi)核的配置中,通過 make menuconfig打開LED的相關(guān)配置,才支持LED相關(guān)功能。?
5.2 查看sysfs文件結(jié)構(gòu)
我們在開發(fā)板中輸入ls /sys/class/leds/,可以查看LED子系統(tǒng)生成的文件信息。

根據(jù)打開配置的不同,生成不同的文件節(jié)點
?
查看一下CPU節(jié)點的信息
#在開發(fā)板上有cpu目錄,可在開發(fā)板上執(zhí)行如下命令查看
ls?/sys/class/leds/cpu

相關(guān)屬性文件有:brightness、max_brightness、trigger等
max_brightness文件:表示LED燈的最大亮度值。
brightness文件:表示當(dāng)前LED燈的亮度值,它的可取 值范圍為[0~max_brightness],一些LED設(shè)備不支持多級亮度,直接以非0值來 表示LED為點亮狀態(tài),0值表示滅狀態(tài)。
trigger文件:則指示了LED燈的觸發(fā)方式,查看該文件的內(nèi)容時,該文件會 列出它的所有可用觸方式,而當(dāng)前使用的觸發(fā)方式會以“[]”符號括起。
常見的觸 發(fā)方式如下表所示:

作者:_嵌入式藝術(shù)_
來源:面包板社區(qū)
https://mbb.eet-china.com/blog/4040659-441318.html
本文為面包板社區(qū)原創(chuàng)打賞文章,點擊閱讀原文,發(fā)表原創(chuàng)文章,獲得打賞獎勵!
↓↓ 點擊閱讀原文,參加活動