色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux Led子系統代碼框架分析

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:嵌入式Linux系統開 ? 2023-07-20 10:36 ? 次閱讀

代碼框架分析

led-class.c (led 子系統框架的入口)

維護 LED 子系統的所有 LED 設備,為 LED 設備提供注冊操作函數: 

led_classdev_register()
devm_led_classdev_register()

注銷操作函數:
led_classdev_unregister()
devm_led_classdev_unregister();

電源管理的休眠和恢復操作函數: 
led_classdev_suspend()
led_classdev_resume();

用戶態操作接口:brightness 、max_brightness

led-core.c

抽象出 LED 操作邏輯,封裝成函數導出,供其它文件使用:

led_init_core(): 核心初始化;
led_blink_set(): 設置led閃爍時間:
led_blink_set_oneshot() : 閃爍一次
led_stop_software_blink() : led停止閃爍
led_set_brightness() : 設置led的亮度
led_update_brightness : 更新亮度
led_sysfs_disable : 用戶態關閉
led_sysfs enable : 用戶態打開
leds_list : leds鏈表;
leds_list_lock : leds鏈表鎖

led-triggers.c

維護 LED 子系統的所有觸發器,為觸發器提供注冊操作函數: 

led_trigger_register()
devm_led_trigger_register()
led_trigger_register_simple()

注銷操作函數: 

led_trigger_unregister()
led_trigger_unregister_simple()

以及其它觸發器相關的操作函數

ledtrig-timer.c、ledtrig-xxx.c

ledtrig-timer.c 為例

入口函數調用 led_trigger_register() 注冊觸發器,
注冊時候傳入 led_trigger 結構體,里面有 activatedeactivate 成員函數指針,
作用是生成 delay_ondelay_off 文件

同時還提供 delay_ondelay_off 的用戶態操作接口
卸載時,使用 led_trigger_unregister() 注銷觸發器

leds-gpio.c、leds-xxx.c :

leds-gpio.c 為例

在通過設備樹或者其它途徑匹配到設備信息后,將調用 probe() 函數,
然后再根據設備信息設置 led_classdev,
最后調用 devm_led_classdev_register() 注冊 LED 設備。

led_classdev 結構體代表 led 實例:

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)

//設置亮度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);

//閃爍時點亮和熄滅的時間設置
 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;
//默認trigger的名字
 const char  *default_trigger;
//閃爍的開關時間
 unsigned long   blink_delay_on, blink_delay_off;
//閃爍的定時器鏈表
 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的數據
 void   *trigger_data;
 bool   activated;
#endif
 struct mutex  led_access;
};

led_trigger 結構:

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 類設備的算法,這個算法決定著 LED 什么時候亮什么時候暗。

1、點亮 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

會看到 trigger_list
[none] mmc0 mmc1 mmc2 timer
其中的 timer 這個 trigger 是 ledtrig-timer.c 中模塊初始化的時候注冊進去的

echo timer > /sys/class/leds/led1/trigger
這一句會調用
led_trigger_store()- >
   led_trigger_set()- >
     trigger- >activate(led_cdev);
從而調用 ledtrig-timer.c 文件里 的timer_trig_activate(),
在 /sys/class/leds/led1/ 下創建 delay_on、delay_off 兩個文件

echo 100 > /sys/class/leds/led1/delay_on
echo 200 > /sys/class/leds/led1/delay_off
這樣會閃爍,亮 100ms 滅 200ms

3、關閉 LED

echo 0 > /sys/class/leds/led1/delay_on
或
echo 0 > /sys/class/leds/led1/brightness
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    242

    文章

    23252

    瀏覽量

    660580
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209330
  • 系統
    +關注

    關注

    1

    文章

    1014

    瀏覽量

    21332
收藏 人收藏

    評論

    相關推薦

    Linux LED子系統詳解

    Linux LED子系統詳解
    的頭像 發表于 06-10 10:37 ?1539次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>LED</b><b class='flag-5'>子系統</b>詳解

    linux--LED子系統一文讀懂

    Linux內核中,LED子系統扮演著控制LED燈的核心角色,它通過一套規范化的驅動架構,簡化了LED驅動程序的開發流程,讓開發者能夠更專注
    的頭像 發表于 08-02 16:09 ?2470次閱讀
    <b class='flag-5'>linux--LED</b><b class='flag-5'>子系統</b>一文讀懂

    Linux時間子系統之ARM generic timer驅動代碼分析

    郭健? Linux時間子系統之ARM generic timer驅動代碼分析
    發表于 07-17 09:30

    輸入子系統的作用與框架

    了一個底層驅動(成為serio)的集合,支持對串口和鍵盤控制器等硬件輸入的訪問  輸入子系統使得應用編程人員和驅動編程人員編程的時候變得簡單統一。3、輸入子系統框架linux輸入
    發表于 10-19 17:13

    介紹下input子系統

    文章目錄前言input子系統按鍵檢測C代碼微信公眾號前言這是前3篇:嵌入式Linux i.MX開發板嵌入式Linux NFS嵌入式Linux
    發表于 11-04 08:14

    淺析input輸入子系統框架嵌入式Linux驅動

    )------USB鍵盤驅動程序嵌入式Linux驅動筆記(五)------學習platform設備驅動嵌入式Linux驅動筆記(六)------淺析input輸入子系統框架嵌入式
    發表于 11-05 06:47

    linux I2C子系統的相關資料分享

    文章目錄linux I2C子系統框架在設備樹中添加從設備信息,mpu5060I2C driver 程序的編寫mpu6050 I2C程序具體實現linux I2C
    發表于 02-10 06:06

    Hi3516的SAMGR--系統服務框架子系統-5-切入小型系統

    簡直是皮毛而已,真的詳細說起來,需要單獨的篇章,下一篇就從它開始。主要的分析工作,還是在 samgr_lite 目錄內,在一頭扎進去之前,最好先回顧一下《Hi3861的SAMGR--系統服務框架子系統-1
    發表于 04-20 10:27

    從misc子系統到3+2+1設備識別驅動框架

    misc子系統Linux中是一個非常簡單的子系統,但是其清晰的框架結構非常適合用來研究設備識別模型。
    發表于 05-10 10:48 ?695次閱讀

    輸入子系統的作用與框架資料匯總

    輸入子系統的作用與框架資料匯總
    發表于 10-15 09:09 ?3次下載

    linux-usb子系統的核心描述

    本文將描述linux-usb子系統的核心,主要分析其核心的初始化流程,文中源碼基于內核版本:4.1.15。
    的頭像 發表于 01-14 09:37 ?2709次閱讀

    從軟件角度分析linux內核USB子系統的熱插拔過程

    本文從軟件角度分析linux內核USB子系統的熱插拔過程,以實際分析思路和過程行文,基于linux內核版本:4.19.4,記錄
    的頭像 發表于 01-15 09:28 ?5620次閱讀

    Linux內核之LED子系統(一)

    Linux內核的LED子系統是一種重要的框架,用于管理和控制設備上的LED指示燈。在嵌入式系統
    發表于 10-02 16:53 ?1324次閱讀
    <b class='flag-5'>Linux</b>內核之<b class='flag-5'>LED</b><b class='flag-5'>子系統</b>(一)

    Linux內核之LED子系統(二)

    這里說一說LED子系統的一些核心源代碼文件,是如何實現LED子系統
    發表于 10-02 16:55 ?930次閱讀
    <b class='flag-5'>Linux</b>內核之<b class='flag-5'>LED</b><b class='flag-5'>子系統</b>(二)

    Linux clock子系統是什么

    clock子系統 Linux的時鐘子系統由CCF(common clock framework)框架管理, CCF向上給用戶提供了通用的時鐘接口,向下給驅動開發者提供硬件操作的接口 。
    的頭像 發表于 09-27 14:25 ?829次閱讀
    <b class='flag-5'>Linux</b> clock<b class='flag-5'>子系統</b>是什么
    主站蜘蛛池模板: yellow日本动漫高清| 涩涩网站在线看| 狠狠色欧美亚洲狠狠色www| 澳大利亚剧满足在线观看| 最近日本字幕免费高清| 亚洲视频欧美在线专区| 亚洲高清视频在线观看| 午夜国产精品视频| 同桌上课把奶露出来给我玩| 日本人吃奶玩奶虐乳| 热99re久久精品国产首页| 秋霞电影网视频一区二区三区 | 亚洲人成在线播放网站岛国| 息与子在线交尾中文字幕| 污到湿的爽文免费阅读| 天天干夜夜曰| 午夜免费无码福利视频麻豆| 污漫日本E同人| 学生无码AV一区二区三区| 午夜宅宅伦电影网| 亚洲AV久久久噜噜噜噜| 亚洲AV人无码综合在线观看蜜桃| 小荡娃奶真大| 亚洲国产cao| 一本到2v不卡区| 在线电台收听| 91精品一区二区三区在线观看| 91麻豆久久| 超碰97人人做人人爱少妇| 国产Av男人的天堂精品良久| 国产精品亚洲高清一区二区| 黑色丝袜美女被网站| 久久免费看少妇高潮A片JA| 美女MM131爽爽爽| 欧美精品3atv一区二区三区| 日本漂亮妈妈7观整有限中| 少妇无码吹潮久久精品AV| 亚洲AV无码乱码国产精品品麻豆 | 久热这里只有精品99国产6| 免费看黄软件| 日韩精品亚洲专区在线影院|