資料結構
/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支援還是很好的,硬體資源都已標頭檔案的方式...