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_da #endif }; Linux led trigger Interface程序分為兩部分 一部分是把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 裡必須選取 在 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); } ** 備註 **
|
|