代碼框架分析
led-class.c (led 子系統(tǒng)框架的入口)
維護(hù) LED 子系統(tǒng)的所有 LED 設(shè)備,為 LED 設(shè)備提供注冊(cè)操作函數(shù):
led_classdev_register()
devm_led_classdev_register()
注銷(xiāo)操作函數(shù):
led_classdev_unregister()
devm_led_classdev_unregister();
電源管理的休眠和恢復(fù)操作函數(shù):
led_classdev_suspend()
led_classdev_resume();
用戶態(tài)操作接口:brightness 、max_brightness
led-core.c
抽象出 LED 操作邏輯,封裝成函數(shù)導(dǎo)出,供其它文件使用:
led_init_core(): 核心初始化;
led_blink_set(): 設(shè)置led閃爍時(shí)間:
led_blink_set_oneshot() : 閃爍一次
led_stop_software_blink() : led停止閃爍
led_set_brightness() : 設(shè)置led的亮度
led_update_brightness : 更新亮度
led_sysfs_disable : 用戶態(tài)關(guān)閉
led_sysfs enable : 用戶態(tài)打開(kāi)
leds_list : leds鏈表;
leds_list_lock : leds鏈表鎖
led-triggers.c
維護(hù) LED 子系統(tǒng)的所有觸發(fā)器,為觸發(fā)器提供注冊(cè)操作函數(shù):
led_trigger_register()
devm_led_trigger_register()
led_trigger_register_simple()
注銷(xiāo)操作函數(shù):
led_trigger_unregister()
led_trigger_unregister_simple()
以及其它觸發(fā)器相關(guān)的操作函數(shù)
ledtrig-timer.c、ledtrig-xxx.c
以 ledtrig-timer.c 為例
入口函數(shù)調(diào)用 led_trigger_register() 注冊(cè)觸發(fā)器,
注冊(cè)時(shí)候傳入 led_trigger 結(jié)構(gòu)體,里面有 activate 和 deactivate 成員函數(shù)指針,
作用是生成 delay_on 、 delay_off 文件
同時(shí)還提供 delay_on 和 delay_off 的用戶態(tài)操作接口
卸載時(shí),使用 led_trigger_unregister() 注銷(xiāo)觸發(fā)器
leds-gpio.c、leds-xxx.c :
以 leds-gpio.c 為例
在通過(guò)設(shè)備樹(shù)或者其它途徑匹配到設(shè)備信息后,將調(diào)用 probe() 函數(shù),
然后再根據(jù)設(shè)備信息設(shè)置 led_classdev,
最后調(diào)用 devm_led_classdev_register() 注冊(cè) LED 設(shè)備。
led_classdev 結(jié)構(gòu)體代表 led 實(shí)例:
struct led_classdev {
const char *name;//名字
enum led_brightness brightness;//亮度
enum led_brightness max_brightness;//最大亮度
int flags;
/* Lower 16 bits reflect status */
#define LED_SUSPENDED (1 < < 0)
/* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 < < 16)
#define LED_BLINK_ONESHOT (1 < < 17)
#define LED_BLINK_ONESHOT_STOP (1 < < 18)
#define LED_BLINK_INVERT (1 < < 19)
#define LED_SYSFS_DISABLE (1 < < 20)
#define SET_BRIGHTNESS_ASYNC (1 < < 21)
#define SET_BRIGHTNESS_SYNC (1 < < 22)
#define LED_DEV_CAP_FLASH (1 < < 23)
//設(shè)置亮度API
void (*brightness_set)(struct led_classdev *led_cdev,enum led_brightness brightness);
int (*brightness_set_sync)(struct led_classdev *led_cdev,enum led_brightness brightness);
//獲取亮度API
enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);
//閃爍時(shí)點(diǎn)亮和熄滅的時(shí)間設(shè)置
int (*blink_set)(struct led_classdev *led_cdev,unsigned long *delay_on,unsigned long *delay_off);
struct device *dev;
const struct attribute_group **groups;
//leds-list的node
struct list_head node;
//默認(rèn)trigger的名字
const char *default_trigger;
//閃爍的開(kāi)關(guān)時(shí)間
unsigned long blink_delay_on, blink_delay_off;
//閃爍的定時(shí)器鏈表
struct timer_list blink_timer;
//閃爍的亮度
int blink_brightness;
void (*flash_resume)(struct led_classdev *led_cdev);
struct work_struct set_brightness_work;
int delayed_set_value;
#ifdef CONFIG_LEDS_TRIGGERS
//trigger的鎖
struct rw_semaphore trigger_lock;
//led的trigger
struct led_trigger *trigger;
//trigger的鏈表
struct list_head trig_list;
//trigger的數(shù)據(jù)
void *trigger_data;
bool activated;
#endif
struct mutex led_access;
};
led_trigger 結(jié)構(gòu):
struct led_trigger {
/* Trigger Properties */
const char *name;
void (*activate)(struct led_classdev *led_cdev);
void (*deactivate)(struct led_classdev *led_cdev);
/* LEDs under control by this trigger (for simple triggers) */
rwlock_t leddev_list_lock;
struct list_head led_cdevs;
/* Link to next registered trigger */
struct list_head next_trig;
};
trigger 是控制 LED 類(lèi)設(shè)備的算法,這個(gè)算法決定著 LED 什么時(shí)候亮什么時(shí)候暗。
1、點(diǎn)亮 LED
echo 255 > /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/max_brightness
2、閃爍
cat /sys/class/leds/led1/trigger
會(huì)看到 trigger_list
[none] mmc0 mmc1 mmc2 timer
其中的 timer 這個(gè) trigger 是 ledtrig-timer.c 中模塊初始化的時(shí)候注冊(cè)進(jìn)去的
echo timer > /sys/class/leds/led1/trigger
這一句會(huì)調(diào)用
led_trigger_store()- >
led_trigger_set()- >
trigger- >activate(led_cdev);
從而調(diào)用 ledtrig-timer.c 文件里 的timer_trig_activate(),
在 /sys/class/leds/led1/ 下創(chuàng)建 delay_on、delay_off 兩個(gè)文件
echo 100 > /sys/class/leds/led1/delay_on
echo 200 > /sys/class/leds/led1/delay_off
這樣會(huì)閃爍,亮 100ms 滅 200ms
3、關(guān)閉 LED
echo 0 > /sys/class/leds/led1/delay_on
或
echo 0 > /sys/class/leds/led1/brightness
-
led
+關(guān)注
關(guān)注
242文章
23379瀏覽量
663458 -
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210477 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1020瀏覽量
21439
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
linux--LED子系統(tǒng)一文讀懂
![<b class='flag-5'>linux--LED</b><b class='flag-5'>子系統(tǒng)</b>一文讀懂](https://file1.elecfans.com/web2/M00/01/0E/wKgaomaslEaAQXpHAAAjFsz2M6k795.png)
Linux時(shí)間子系統(tǒng)之ARM generic timer驅(qū)動(dòng)代碼分析
輸入子系統(tǒng)的作用與框架
介紹下input子系統(tǒng)
淺析input輸入子系統(tǒng)框架嵌入式Linux驅(qū)動(dòng)
linux I2C子系統(tǒng)的相關(guān)資料分享
Hi3516的SAMGR--系統(tǒng)服務(wù)框架子系統(tǒng)-5-切入小型系統(tǒng)
從misc子系統(tǒng)到3+2+1設(shè)備識(shí)別驅(qū)動(dòng)框架
linux-usb子系統(tǒng)的核心描述
從軟件角度分析linux內(nèi)核USB子系統(tǒng)的熱插拔過(guò)程
Linux內(nèi)核之LED子系統(tǒng)(一)
![<b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(一)](https://file1.elecfans.com/web2/M00/A7/A0/wKgZomUOp0OAQzIPAABTjmtqboY817.jpg)
Linux內(nèi)核之LED子系統(tǒng)(二)
![<b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(二)](https://file1.elecfans.com/web2/M00/A7/A0/wKgZomUOp0OAQzIPAABTjmtqboY817.jpg)
Linux clock子系統(tǒng)是什么
![<b class='flag-5'>Linux</b> clock<b class='flag-5'>子系統(tǒng)</b>是什么](https://file1.elecfans.com/web2/M00/88/EC/wKgZomR3AEiAHXG0AAOHp2Lqrws775.jpg)
評(píng)論