linux led子系統(二)

2022-04-29 11:24:15 字數 2771 閱讀 9418

對於led子系統中,有那麼多得trigger,下面就來簡單了解下。

1、default-on

static void defon_trig_activate(struct led_classdev *led_cdev)

static struct led_trigger defon_led_trigger = ;

static int __init defon_trig_init(void)

static void __exit defon_trig_exit(void)

default-on主要是設定led為最大亮度。

2、backlight

struct bl_trig_notifier ; 

static struct led_trigger bl_led_trigger =; 

static void bl_trig_activate(structled_classdev *led) 

ret= device_create_file(led->dev, &dev_attr_inverted); 

if(ret) 

gotoerr_invert; 

n->led= led; 

n->brightness= led->brightness; 

n->old_status= unblank; 

n->notifier.notifier_call= fb_notifier_callback; 

ret= fb_register_client(&n->notifier); 

if(ret) 

dev_err(led->dev,"unable to register backlight trigger\n"); 

return; 

err_invert: 

led->trigger_data= null; 

kfree(n); 

}  其中fb_register_client註冊到了framebuffer中的fb_notifier_list中,一旦framebuffer驅動中有事件,就會呼叫核心通知鏈中註冊好的函式fb_notifier_callback。

關於核心通知鏈,這裡就插播一曲來自網路的摘抄了:

大多數核心子系統都是相互獨立的,因此某個子系統可能對其它子系統產生的事件感興趣。為了滿足這個需求,也即是讓某個子系統在發生某個事件時通知其它的子系統,linux核心提供了通知鏈的機制。通知鍊錶只能夠在核心的子系統之間使用,而不能夠在核心與使用者空間之間進行事件的通知。

通知鍊錶是乙個函式鍊錶,鍊錶上的每乙個節點都註冊了乙個函式。當某個事情發生時,鍊錶上所有節點對應的函式就會被執行。所以對於通知鍊錶來說有乙個通知方與乙個接收方。在通知這個事件時所執行的函式由被通知方決定,實際上也即是被通知方註冊了某個函式,在發生某個事件時這些函式就得到執行。其實和系統呼叫signal的思想差不多。

通知鏈技術可以概括為:事件的被通知者將事件發生時應該執行的操作通過函式指標方式儲存在鍊錶(通知鏈)中,然後當事件發生時通知者依次執行鍊錶中每乙個元素的**函式完成通知。

static int fb_notifier_callback(struct notifier_block *p, 

unsignedlong event, void *data) 

else  

n->old_status= new_status; 

break; 

}  return 0; 

}  

如果觸發了fb_event_blank,那麼就執行相應的操作。

3、timer

static structled_trigger timer_led_trigger = ; 

static voidtimer_trig_activate(struct led_classdev *led_cdev) 

當某個led_classdev與之連線後,這個觸發器會在/sys/class/leds//下建立兩個檔案delay_on和delay_off。使用者空間往這兩個檔案中寫入資料後,相應的led會按照設定的高低電平的時間(ms)來閃爍。如果led_classdev註冊了硬體閃爍的介面led_cdev->blink_set就是用硬體控制閃爍,否則用軟體定時器來控制閃爍。

4、heatbeat

static structled_trigger heartbeat_led_trigger = ; 

structheartbeat_trig_data ; 

static voidheartbeat_trig_activate(struct led_classdev *led_cdev) 

設定了heartbeat_data->phase,然後呼叫led_heartbeat_function。

static voidled_heartbeat_function(unsigned long data) 

led_set_brightness(led_cdev,brightness); 

mod_timer(&heartbeat_data->timer,jiffies + delay); 

}  通過定時來實現類似於心跳的led燈。

5、ide-disk

static voidledtrig_ide_timerfunc(unsigned long data) 

else  

}  static int __initledtrig_ide_init(void) 

通過定時器實現類似於硬碟燈的指示。

以上便是led子系統中的trigger的一些簡單介紹。

linux子系統折騰記 (二)

今天一早起床,開啟debian,居然出現 錯誤 0x80070040 不知道是怎麼回事,網上有篇文章詳細介紹了windows linux子系統,打算參考來做做 非常有技術的一篇文章。用wslconfig u debian刪了系統,輸入debian重新安裝。過程倒是很簡單快捷,就是想不到這個子系統那麼...

mmc子系統學習筆記二 關於mmc子系統筆記的說明

mmc子系統是linux裝置驅動中乙個不可缺少的部分,但科技進步,時代發展,現在mmc已經不是從前的mmc card 現在mmc子系統已經衍生到sd,sdio相關的技術了,也就是說mmc子系統已經能夠管理控制sd和sdio相關了,但是由於歷史的原因,仍稱呼為mmc子系統。mmc子系統差異說明 本mm...

輸入子系統

驅動函式操作步驟 在初始化函式中 1.分配乙個input dev結構體 struct input dev buttons dev buttons dev input allocate device 2.設定 2.1 能產生哪類事件 set bit ev key,buttons dev evbit s...