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

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

框架所處的位置,正如上圖所示,由下往上看:
LEDLED進行統一管理,提供注冊,注銷,管理LED等相關接口,起到呈上啟下的作用,方便上層調用。sysfs文件系統中對應的文件節點,能夠直接控制LED的亮滅。?
了解完LED子系統框架之后,我們來分析一下其相關的目錄結構!
ketnel
│???└──?driver
│???│???└──?leds
│???│???│???├──?Makefile
│???│???│???├──?led-core.c
│???│???│???├──?led-gpio.c
│???│???│???├──?led-class.c
│???│???│???├──?led-triggers.c
│???│???│???├──?......
│???│???│???└──?trigger
│???│???│???│???├──?ledtrig-cpu.c
│???│???│???│???├──?ledtrig-heartbeat.c
│???│???│???│???├──?.......
上面即為LED子系統的目錄結構,其主要核心文件有:
led-gpio.c:硬件驅動層實現,直接控制硬件設備,并且將其操作硬件設備的接口,注冊進入LED驅動框架led-core.c:核心層實現,抽象軟件實現的相關功能,如閃爍,亮度設置等等,并管理LED設備led-class.c:完成邏輯設備的注冊以及相應屬性文件的添加led-triggers.c:LED觸發功能的抽象,提供注冊接口以及閃爍功能控制ledtrig-cpu.c:將LED作為CPU燈ledtrig-heartbeat.c:將LED作為心跳燈?
在上面,我們了解了Linux下LED子系統相關的幾個重要文件,那么該子系統在嵌入式設備的sysfs中的呈現方式又是如何的呢?
?
我們如果在內核中打開了LED子系統目錄下的Makefile文件,也就是kernel/drivers/leds/Makefile,我們看到
#?SPDX-License-Identifier:?GPL-2.0
#?LED?Core
obj-$(CONFIG_NEW_LEDS)???+=?led-core.o
obj-$(CONFIG_LEDS_CLASS)??+=?led-class.o
obj-$(CONFIG_LEDS_CLASS_FLASH)?+=?led-class-flash.o
obj-$(CONFIG_LEDS_TRIGGERS)??+=?led-triggers.o
......
我們必須在內核的配置中,通過 make menuconfig打開LED的相關配置,才支持LED相關功能。
?
我們在開發板中輸入ls /sys/class/leds/,可以查看LED子系統生成的文件信息。
| /sys/class/leds下的目錄 | 對應的LED燈設備 |
|---|---|
| cpu | 開發板的心跳燈 |
| red | Pro開發板RGB燈的紅色 |
| green | Pro開發板RGB燈的綠色 |
| blue | Pro開發板RGB燈的藍色 |
| mmc0: | SD卡指示燈(出廠鏡像默認沒有啟用) |
根據打開配置的不同,生成不同的文件節點
查看一下CPU節點的信息
#在開發板上有cpu目錄,可在開發板上執行如下命令查看
ls?/sys/class/leds/cpu

相關屬性文件有:brightness、max_brightness、trigger等
max_brightness文件:表示LED燈的最大亮度值。brightness文件:表示當前LED燈的亮度值,它的可取 值范圍為[0~max_brightness],一些LED設備不支持多級亮度,直接以非0值來 表示LED為點亮狀態,0值表示滅狀態。trigger文件:則指示了LED燈的觸發方式,查看該文件的內容時,該文件會 列出它的所有可用觸方式,而當前使用的觸發方式會以“[]”符號括起。常見的觸 發方式如下表所示:
| 觸發方式 | 說明 |
|---|---|
| none | 無觸發方式 |
| disk-activity | 硬盤活動 |
| nand-disk | nand flash活動 |
| mtd | mtd設備活動 |
| timer | 定時器 |
| heartbeat | 系統心跳 |
?
好啦,本篇主要介紹了LED子系統框架,下面我們來回顧一下:
LED底層硬件的操作方法Linux下LED子系統驅動框架以及每層含義Linux和sysfs的文件分布?

