00 Linux leds子系統分析

2021-10-01 06:14:22 字數 1180 閱讀 8873

1.簡介

linux版本:linux-4.15

leds子系統主要是通過 /sys/class/leds/ 下面檔案給使用者空間提供功能:開啟關閉led,使led閃爍,利用系統事件使led亮滅

對應的檔案節點是:brightness blink trigger

涉及主要檔案在drivers/leds/的 led-class.c led-core.c 資料結構標頭檔案:include/linux/leds.h

2.註冊乙個led裝置流程

int devm_of_led_classdev_register(struct device *parent,

struct device_node *np,

struct led_classdev *led_cdev)

其中重要的是led_cdev這個引數,這個引數我們傳入了這個led裝置設定brightness和blink的方法和其它的一下屬性。

struct led_classdev 結構如下:

struct led_classdev ;
其中設定亮度:     brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness);這個函式不能睡眠。

brightness_set_blocking這個版本的函式可以睡眠。

閃爍功能是.blink_set函式實現的

3. leds核心層實現細節

在led-class.c檔案中,開機時呼叫了leds_init函式。這個函式 

static int __init leds_init(void)

這個函式通過class_create註冊了leds這個class,所以我們在/sys/class下面能看見leds這個目錄。這裡有個class : leds_class

當我們通過前面註冊驅動時會通過它關聯到我們註冊的class

leds_class->dev_groups = led_groups;這句話將我們leds下面的檔案操作關聯起來了。其中就有brightness_show,brightness_store通過他們可以檢視和設定亮度,同理還有blink節點。

framebuffer 子系統分析

fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...

framebuffer 子系統分析

come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...