linux裝置驅動之led子系統《一》

2021-07-10 21:53:57 字數 3172 閱讀 6806

資料結構

/include/linux/leds.h

enum

led_brightness;

led_classdev代表led的例項:

struct

led_classdev

;觸發器的結構體

#define trig_name_max 50

struct

led_trigger

;平台裝置相關的led資料結構

struct led_info ;

struct led_platform_data ;

平台裝置相關的gpio led資料結構

struct gpio_led ;

struct gpio_led_platform_data ;

led_classdev介面分析/driver/rtc/led-class.c

註冊struct led_classdev:

intled_classdev_register(struct device *parent, struct led_classdev *led_cdev)

export_symbol_gpl(led_classdev_register);

登出struct led_classdev:

void led_classdev_unregister(struct led_classdev *led_cdev);

登出所做的工作和註冊相反。

將led掛起:將led的flag設為led_suspended,關閉led.

void led_classdev_suspend(struct led_classdev *led_cdev)

從掛起中恢復:

void led_classdev_resume(struct led_classdev *led_cdev)

sysfs中的屬性檔案:

/driver/rtc/led-class.c會首先建立乙個leds類,生成/sys/class/leds目錄。

在led_classdev_register中生成了兩個sysfs屬性檔案,它們使用的屬性引數如下:

static device_attr(

brightness

, 0644, led_brightness_show, led_brightness_store);

static device_attr(

trigger

, 0644, led_trigger_show, led_trigger_store);

led_brightness_show和led_brightness_store分別負責顯示和設定亮度,使用者控制項通過

/sys/class/leds//brightness檢視和設定亮度就是和這兩個函式互動的。

led_trigger_show用於讀取當前觸發器的名字,led_trigger_store用於指定觸發器的名字,

它會尋找所有已註冊的觸發器,找到同名的並設定為當前led的觸發器。

/sys/class/leds//trigger用於使用者空間檢視和設定觸發器。

led_classdev全域性鍊錶:

led_classdev_register註冊的struct led_classdev會被加入leds_list鍊錶,這個鍊錶定義在driver/leds/led-core.c。

led_trigger介面分析/driver/leds/led-triggers.c

註冊觸發器

int led_trigger_register(struct led_trigger *trigger);

這個函式註冊的trigger會被加入全域性鍊錶

trigger_list,這個煉表頭是在/driver/leds/led-triggers.c定義的。

此外,這個函式還會遍歷所有的已註冊的

led_classdev,如果有哪個led_classdev的預設觸發器和自己同名,則

呼叫led_trigger_set將自己設為那個led的觸發器。

led_classdev註冊的時候也會呼叫led_trigger_set_default來遍歷所有已註冊的觸發器,找到和led_classdev.default_trigger同名的觸發器則將它設為自己的觸發器。

登出觸發器

void led_trigger_unregister(struct led_trigger *trigger);

這個函式做和註冊相反的工作,並把所有和自己建立連線的led的led_classdev.trigger設為null。

設定觸發器上所有的led為某個亮度

void led_trigger_event(struct led_trigger *trigger, enum led_brightness brightness);

註冊觸發器的簡單方法

指定乙個名字就可以註冊乙個觸發器,註冊的觸發器通過**tp返回,但是這樣註冊的觸發器沒有active和deactivede。

void led_trigger_register_******(const char *name, struct led_trigger **tp);

相對應的登出函式為:

void led_trigger_unregister_******(struct led_trigger *trigger);

觸發器和led的連線

void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger);//建立連線。建立連線的時候會呼叫觸發器的

activate方法

void led_trigger_remove(struct led_classdev *led_cdev);//取消連線。取消連線的時候會呼叫

觸發器的

de activate方法

void led_trigger_set_default(struct led_classdev *led_cdev);//在所有已註冊的觸發器中尋找led_cdev的預設觸發器並呼叫

led_trigger_set建立連線

最後總結一下led、led_classdev、led_trigger的關係:

也就是說trigger好比是控制led類裝置的演算法,這個演算法決定著led什麼時候亮什麼時候暗。led trigger類裝置可以是現實的硬體裝置,比如ide硬碟,也可以是系統心跳等事件。

字元裝置驅動之LED 混雜裝置驅動(misc)

misc led.c include include include include include include include include include include include static volatile unsigned long gpfcon volatile unsig...

linux驅動之 led驅動

練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...

linux裝置驅動(一) 字元裝置之led驅動

我的板子上有4個led,對應的gpio口是gpb5,gpb6,gpb8,gpb10 io對映用的是靜態對映的方式,靜態對映的內容再arch arm mach s3c2410 mach smdk2410.c中,如果每記錯就是這個路徑 linux核心對著個soc支援還是很好的,硬體資源都已標頭檔案的方式...