久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux led 子系統(tǒng)

 guitarhua 2012-03-12
linux led 子系統(tǒng)
2011-01-12 10:19

轉(zhuǎn)自:http://lhsblog01.blog.163.com/blog/static/1020045192010221103155591/

linux 驅(qū)動(dòng) 2010-03-21 22:31:55 閱讀132 評(píng)論0   字號(hào): 訂閱

1:有兩個(gè)主要結(jié)構(gòu):
struct led_classdev,
struct led_trigger,(其實(shí)就是sysfs,class文件中的一個(gè)屬性,?)
2:全局結(jié)構(gòu):(系統(tǒng)核心結(jié)構(gòu))
LIST_HEAD(leds_list); 所有的led設(shè)備,。
static LIST_HEAD(trigger_list); 所有的trigger成員鏈表。
DECLARE_RWSEM(leds_list_lock);
3: 
led子系統(tǒng)實(shí)現(xiàn)(class):
生成系統(tǒng)全局類變量:
static struct class *leds_class;
提供led_classdev注冊(cè),,注銷函數(shù)
設(shè)置led的設(shè)備屬性文件:(brightness與 trigger)
led子系統(tǒng)實(shí)現(xiàn)(trigger)
提供注冊(cè),,注銷trigger函數(shù),即在全局變量(trigger_list)上的操作,。及屬性操作函數(shù):led_trigger_show, led_trigger_store
4:led_trigger注冊(cè)過(guò)程:
添加到全局鏈表中,,同時(shí)遍歷全局leds_list,設(shè)置以這個(gè)trigger為trigger的led.
5:led_classdev注冊(cè)過(guò)程:
生成sysfs文件,,(關(guān)聯(lián)trigger)設(shè)置trigger,添加到leds_list中
6: led_classdev與 led_trigger的關(guān)聯(lián),。
在設(shè)置led platformdata時(shí),就設(shè)置好對(duì)應(yīng)的 led_trigger,。(char * name)
向系統(tǒng)注冊(cè)led_trigger:
在另外的包含這個(gè)trigger的模塊的 module_init中向系統(tǒng)注冊(cè),。 led_trigger_register_simple("nand-disk", &nand_led_trigger);

struct list_head trig_list;
void *trigger_data;
#endif
};

Linux led trigger Interface

223人閱讀 評(píng)論(0) 收藏 舉報(bào)

程序分為兩部分

一部分是把led設(shè)備注冊(cè)到trigger上。如果linux已經(jīng)為led開(kāi)啟觸發(fā)功能,。那么在led設(shè)備的創(chuàng)建后,,需要把ed設(shè)備注冊(cè)到trigger上。

 

一部分是觸發(fā)種類(trigger)的注冊(cè),。

 

led設(shè)備注冊(cè)到trigger上:

trigger鏈表上搜索與led設(shè)備def_trigger名字相同的trigger項(xiàng),。

如果搜索到了,那么把led設(shè)備鏈接到trigger項(xiàng)的led_cdevs為表頭的鏈表上,。如果沒(méi)有搜索到,,那么暫時(shí)不注冊(cè)。

 

 

觸發(fā)種類(trigger)的注冊(cè):

首先申請(qǐng)一個(gè)trigger,,在trigger_list這個(gè)鏈表上搜索是否已經(jīng)注冊(cè)過(guò)該trigger,。如果注冊(cè)過(guò),直接返回,,并報(bào)錯(cuò),。如果沒(méi)有注冊(cè)過(guò),把這個(gè)trigger加到trigger_list鏈表中完成注冊(cè),??紤]先前可能已經(jīng)有很多的led設(shè)備想注冊(cè)到這個(gè)trigger上,。所以還需要遍歷leds_list鏈表(led設(shè)備鏈表)。把需要注冊(cè)到這個(gè)trigger上的led設(shè)備進(jìn)行注冊(cè),。

 

Simple LED Tigger Interface

 

led_trigger_event完成了對(duì)trigger的響應(yīng)。把trigger->led_cdevs所有注冊(cè)過(guò)的設(shè)備激活,。進(jìn)行相應(yīng)的led操作,。


在 menuconfig 裡必須選取
Device Driver --->
[*] LED Support --->
[*] LED Trigger support

在 LED 設(shè)定的 struct 中,有一個(gè)變數(shù)為 def_trigger
表示控制 led 的名稱

static struct s3c24xx_led_platdata smdk_pdata_led_blue = {
.gpio = S3C2410_GPB1,
.flags = S3C24XX_LEDF_TRISTATE,
.name = "led-blue",
.def_trigger = "nand-disk",
}

表示控制 LED 藍(lán)燈的名稱是 "nand-disk"


在 linxu/drivers/mtd/nand/nand_base.c
註冊(cè): led_trigger_register_simple("nand-disk", &nand_led_trigger);
取消註冊(cè): led_trigger_unregister_simple(nand_led_trigger);
控制: led_trigger_event(nand_led_trigger, LED_FULL);

現(xiàn)在 只要對(duì) nand flash 操作,,藍(lán)燈就會(huì)亮

在 linux/drivers/leds/leds-s3c24xx.c 中

會(huì)呼叫
static void s3c24xx_led_set(struct led_classdev *led_cdev, enum led_brightness value)
{
struct s3c24xx_gpio_led *led = to_gpio(led_cdev);
struct s3c24xx_led_platdata *pd = led->pdata;

/* there will be a short delay between setting the output and
* going from output to input when using tristate. */

s3c2410_gpio_setpin(pd->gpio, (value ? 1 : 0) ^(pd->flags & S3C24XX_LEDF_ACTLOW));

if (pd->flags & S3C24XX_LEDF_TRISTATE)
s3c2410_gpio_cfgpin(pd->gpio,value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT);
}

** 備註 **
  1. #define DEFINE_LED_TRIGGER(x) static struct led_trigger *x;
    定義在 linxu/include/linux/leds.h
  2. led brightness 是濠洨的 (只有亮跟不亮)
  3. LED 相關(guān)設(shè)定可以參考 LED Driver 筆記

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多