日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

初探linux子系统集之led子系统(一)【转】

發布時間:2025/6/15 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初探linux子系统集之led子系统(一)【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載自:http://blog.csdn.net/eastmoon502136/article/details/37569789

?就像學編程第一個范例helloworld一樣,學嵌入式,單片機、fpga之類的第一個范例就是點亮一盞燈。對于龐大的Linux系統,當然可以編寫一個字符設備驅動來實現我們需要的led燈,也可以直接利用gpio口,應用程序來拉高拉低管腳控制。不過,既然linux系統自己本來就帶有led子系統,那么就可以好好利用之。好處不用多說了,主要對于應用層來說,不同平臺都用linux的led子系統,那么應用程序不用做任何的改變,就可以在新的平臺上運行,可移植性好。

???????? linux的led子系統的源碼路徑:

?

[html]?view plaincopy
  • Include/Linux/leds.h??
  • drivers/leds??
  • ?

    ?

    ???????? 首先看一下led子系統中的主要文件:

    ?

    [html]?view plaincopy
  • #?LED?Core??
  • obj-$(CONFIG_NEW_LEDS)????????????????????????+=led-core.o??
  • obj-$(CONFIG_LEDS_CLASS)?????????????????+=?led-class.o??
  • obj-$(CONFIG_LEDS_TRIGGERS)??????????????+=led-triggers.o??
  • ???
  • #?LED?PlatformDrivers??
  • obj-$(CONFIG_LEDS_GPIO)????????????????????????+=?leds-gpio.o??
  • ???
  • #?LED?Triggers??
  • obj-$(CONFIG_LEDS_TRIGGER_TIMER)?+=ledtrig-timer.o??
  • obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)??????+=ledtrig-ide-disk.o??
  • obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)?+=ledtrig-heartbeat.o??
  • obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT)?+=ledtrig-backlight.o??
  • obj-$(CONFIG_LEDS_TRIGGER_GPIO)??????????????+=ledtrig-gpio.o??
  • obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)????????+=?ledtrig-default-on.o??
  • ?

    ?

    主要由leds.h、led-core.c、led-class.c、led-triggers.c,其中led-triggers又分為了timer、ide-disk、heartbeat、backlight、gpio、default-on等算法。

    ?

    例子程序是leds-gpio,接下去會主要分析這個驅動實現。

    ?

    首先簡單看一下主要的文件

    ?

    Leds.h

    ?

    [html]?view plaincopy
  • 1、enum?led_brightness{??
  • ?????????LED_OFF???????????=?0,??
  • ?????????LED_HALF?????????=?127,??
  • ?????????LED_FULL?????????=?255,??
  • };??
  • ?

    ?

    Led的亮度,分為三等級,關、中間、最亮。

    ?

    ?

    [html]?view plaincopy
  • 2、struct?led_classdev{??
  • ?????????constchar??????????????????*name;???//?Led的名字??
  • ?????????int???????????????????????brightness;???//led亮度??
  • ?????????int???????????????????????max_brightness;?//led最大亮度??
  • ?????????int???????????????????????flags;??
  • ???
  • ?????????/*Lower?16?bits?reflect?status?*/??
  • #define?LED_SUSPENDED??????????????????(1?<<?0)??
  • ?????????/*Upper?16?bits?reflect?control?information?*/??
  • #define?LED_CORE_SUSPENDRESUME???(1?<<?16)??
  • ???
  • ?????????/*Set?LED?brightness?level?*/??
  • ?????????/*Must?not?sleep,?use?a?workqueue?if?needed?*/??
  • ?????????void???????????(*brightness_set)(struct?led_classdev*led_cdev,??
  • ?????????????????????????????????????????????????enum?led_brightness?brightness);???//亮度設置函數指針??
  • ?????????/*Get?LED?brightness?level?*/??
  • ?????????enumled_brightness?(*brightness_get)(struct?led_classdev?*led_cdev);?//獲取亮度函數指針??
  • ???
  • ?????????int??????????????(*blink_set)(struct?led_classdev*led_cdev,??
  • ??????????????????????????????????????????unsigned?long?*delay_on,??
  • ??????????????????????????????????????????unsigned?long?*delay_off);??//閃爍時點亮和熄滅的時間設置??
  • ???
  • ?????????structdevice?????????????*dev;??
  • ?????????structlist_head????????node;????????????????????????//leds-list的node??
  • ?????????constchar??????????????????*default_trigger;?????//默認trigger的名字??
  • ???
  • ?????????unsignedlong???????????blink_delay_on,blink_delay_off;???//閃爍的開關時間??
  • ?????????structtimer_list???????blink_timer;????????????????????//閃爍的定時器鏈表??
  • ?????????int???????????????????????blink_brightness;???????????????????//閃爍的亮度??
  • ???
  • #ifdef?CONFIG_LEDS_TRIGGERS??
  • ?????????/*Protects?the?trigger?data?below?*/??
  • ?????????structrw_semaphore??????trigger_lock;???????????????//trigger的鎖??
  • ???
  • ?????????structled_trigger????*trigger;??????????????????????//led的trigger??
  • ?????????structlist_head????????trig_list;?????????????????????//trigger的鏈表??
  • ?????????void????????????????????*trigger_data;?????????????????????//trigger的數據??
  • #endif??
  • };??
  • ?

    ?

    ?

    [html]?view plaincopy
  • 3、struct?led_trigger?{??
  • ?????????/*Trigger?Properties?*/??
  • ?????????constchar????????*name;???????????//trigger的名字??
  • ?????????void???????????(*activate)(struct?led_classdev*led_cdev);???//激活trigger??
  • ?????????void???????????(*deactivate)(struct?led_classdev*led_cdev);????
  • ???
  • ?????????/*LEDs?under?control?by?this?trigger?(for?simple?triggers)?*/??
  • ?????????rwlock_t???leddev_list_lock;??
  • ?????????structlist_head??led_cdevs;?????????????????????//led設備的鏈表??
  • ???
  • ?????????/*Link?to?next?registered?trigger?*/??
  • ?????????structlist_head??next_trig;??
  • };??
  • ?

    ?

    [html]?view plaincopy
  • 4、/*?For?the?leds-gpiodriver?*/??
  • struct?gpio_led?{??
  • ?????????constchar?*name;??????????????//led的名字??
  • ?????????constchar?*default_trigger;????????????//默認的trigger??
  • ?????????unsigned?????????gpio;????????????????????????????//gpio口??
  • ?????????unsigned??active_low?:?1;?????????
  • ?????????unsigned??retain_state_suspended?:?1;??
  • ?????????unsigned??default_state?:?2;??
  • ?????????/*default_state?should?be?one?of?LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP)?*/??
  • };??
  • ???
  • ?

    ?

    [html]?view plaincopy
  • 5、structgpio_led_platform_data?{??
  • ?????????int???????????num_leds;?????????????led的個數??
  • ?????????conststruct?gpio_led?*leds;???????led結構體??
  • ???
  • #define?GPIO_LED_NO_BLINK_LOW???????0???????/*No?blink?GPIO?state?low?*/??
  • #define?GPIO_LED_NO_BLINK_HIGH??????1???????/*No?blink?GPIO?state?high?*/??
  • #define?GPIO_LED_BLINK?????????????????2???????/*?Please,?blink?*/??
  • ?????????int??????????????(*gpio_blink_set)(unsigned?gpio,int?state,??
  • ???????????????????????????????????????????????unsignedlong?*delay_on,??
  • ???????????????????????????????????????????????unsignedlong?*delay_off);??
  • };??
  • ???


  • ?

    led-core.c

    ?

    [html]?view plaincopy
  • DECLARE_RWSEM(leds_list_lock);??
  • EXPORT_SYMBOL_GPL(leds_list_lock);??
  • ???
  • LIST_HEAD(leds_list);??
  • EXPORT_SYMBOL_GPL(leds_list);??
  • ?

    ?

    主要是聲明了leds的鏈表和鎖。

    ?

    Led-class.c

    1、? leds_init

    主要是創建leds_class,賦值suspend和resume以及dev_attrs。

    led_class_attrs

    ?

    [html]?view plaincopy
  • static??struct?device_attribute?led_class_attrs[]?=?{??
  • ?????????__ATTR(brightness,0644,?led_brightness_show,?led_brightness_store),??
  • ?????????__ATTR(max_brightness,0444,?led_max_brightness_show,?NULL),??
  • #ifdef?CONFIG_LEDS_TRIGGERS??
  • ?????????__ATTR(trigger,0644,?led_trigger_show,?led_trigger_store),??
  • #endif??
  • ?????????__ATTR_NULL,??
  • };??
  • ?

    ?

    2、led_classdev_register

    ???????? 創建classdev設備,也即Leds_class類中實例化一個對象,類似于c++的new一個對象,leds有很多種,而這里是注冊一個特定的led,內核中的面向對象思想也極其豐富。

    ???????? 加到leds_list鏈表中,初始化blinktimer,指定blink_timer的function和data,設置trigger,然后一個新的led設備就注冊好了,就可以使用了。

    ?

    led-triggers.c

    1、led_trigger_register

    ???????? 掃描trigger鏈表中是否有同名的trigger,接著把當前trigger加入到鏈表中,如果led_classdev中有默認的trigger,那么就設置這個默認的。

    ?

    好了,簡單看了下led子系統中比較重要的結構體和函數,那么接下去就可以通過leds-gpio這個驅動來進一步了解led子系統了。

    總結

    以上是生活随笔為你收集整理的初探linux子系统集之led子系统(一)【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。