以前核心裡對這個函式是這樣定義的 #define init_work(_work, _func, _data),可以理解為init_work會在你定義的_work工作佇列裡面增加乙個工作任務,該任務就是_func。_func這個任務會需要一些資料作為引數,這個引數就是通過_data傳遞的。
而現在看驅動的時候你會發現呼叫init_work的時候是只有兩個引數,去掉了資料的部分。也許你會問怎麼傳遞data呢,等下會講述到。其實現在我對這個理解還是比較模糊,希望各位說說你們的理解,順便也讓我理解更透徹一點。看許多驅動模組的時候會發覺work就是乙個工作佇列,一般是結構體work_struct,主要的目的就是用來處理中斷的。比如在中斷裡面要做很多事,但是比較耗時,這時就可以把耗時的工作放到工作佇列。說白了就是系統延時排程的乙個自定義函式。
現在已goodix的觸控螢幕列舉一下步驟:
1. 在探測函式裡goodix_ts_probe初始化
init_work(&ts->work, goodix_ts_work_func);//struct work_struct work,ts是client私有資料結構體
主要目的就是因為就算沒有中斷,在第一次開機時也有檢測裝置,所以這個任務一開始就執行,只不過到後來中斷發生後就再執行.
2. 現在當然輪到static void goodix_ts_work_func(struct work_struct *work)這個工作任務了
在這個函式裡會有一句:
struct goodix_ts_data *ts = container_of(work, struct goodix_ts_data, work);
這函式的主要目的就是解決前面所說的我們的data跑哪去了,使用container_of這個函式來求出我們的data的指標
3.當然你不能忘記註冊你的中斷函式了
request_irq(client->irq, goodix_ts_irq_handler,pdata->irq_edge ? irq_type_edge_falling : irq_type_edge_rising,client->name, ts);
所以用乙個結構體ts就可以把中斷,任務,裝置名等全部囊括進來
我理解就差不多是這樣的。希望大叔級任務指出不正之處。
對INIT WORK的理解
以前核心裡對這個函式是這樣定義的 define init work work,func,data 可以理解為init work會在你定義的 work工作佇列裡面增加乙個工作任務,該任務就是 func。func這個任務會需要一些資料作為引數,這個引數就是通過 data傳遞的。而現在看驅動的時候你會發現...
對INIT WORK的理解
以前核心裡對這個函式是這樣定義的 define init work work,func,data 可以理解為init work會在你定義的 work工作佇列裡面增加乙個工作任務,該任務就是 func。func這個任務會需要一些資料作為引數,這個引數就是通過 data傳遞的。而現在看驅動的時候你會發現...
INIT WORK的暫時理解
scsih fw event add insert and queue up fw event ioc per adapter object fw event object describing the event context this function will acquire ioc fw ...