在前三篇裡學習了linux平台裝置和驅動的一些知識後,這篇就說一下驅動程式是怎麼自動生成裝置檔案。
寫過linux驅動的可能都知道,linux裡有一類裝置叫做混雜裝置,而且還可以發現註冊這一類裝置後是不用手動去生成裝置檔案的。好吧,由這類裝置的註冊函式入手,從而去了解是怎樣自動生成裝置檔案的。看看混雜裝置註冊函式在/drivers/char/misc.c裡的定義:
1int misc_register(struct miscdevice *misc)215
}1617if (misc->minor ==misc_dynamic_minor)
23 misc->minor = dynamic_minors - i - 1;24
set_bit(i, misc_minors);25}
26//
misc_major = 10
27 dev = mkdev(misc_major, misc->minor);
2829 misc->this_device = device_create(misc_class, misc->parent, dev,
30 misc, "
%s", misc->name);
31if (is_err(misc->this_device))
3839
/*40
* add it to the front, so that later devices can "override"
41* earlier defaults
42*/
43 list_add(&misc->list, &misc_list);
44out
:45 mutex_unlock(&misc_mtx);
46return
err;
47 }
第17~25行的作用是分配乙個還沒用過的次裝置號(混雜裝置的主裝置號都是一樣的);第27行,生成乙個裝置號(由主裝置號和次裝置號組成)。第29行,自動生成裝置檔案的「玄機」就在裡面,看它在drivers/base/core.c裡的定義:
1struct device *device_create(struct
class *class, struct device *parent,
2 dev_t devt, void *drvdata, const
char *fmt, ...)
3
關鍵看第8行device_create_vargs()的定義:
1struct device *device_create_vargs(struct
class *class, struct device *parent,
2 dev_t devt, void *drvdata, const
char *fmt,
3va_list args)416
17 dev->devt =devt;
18 dev->class = class
;19 dev->parent =parent;
20 dev->release =device_create_release;
21dev_set_drvdata(dev, drvdata);
2223 retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
24if
(retval)
25goto
error;
2627 retval =device_register(dev);
28if
(retval)
29goto
error;
3031
return
dev;
3233
error:
34put_device(dev);
35return
err_ptr(retval);
36 }
第17~21行,很明顯,就是設定device變數的一些成員的值;第27行,怎麼樣,很眼熟是吧,前面已經分析過了,這裡就不再累述。
下面總結一下在編寫驅動程式時怎麼讓核心幫我們自動生成裝置檔案,其實也就是多呼叫2個函式:
1. class_create()
該函式在include/linux/device.h裡定義。
2. 上面所說的device_create()
關鍵在於把class_create()函式的返回值作為device_create()函式第乙個引數的值,其他引數的含義都很好明白。
linux驅動學習
1.在dev目錄下用ls l檢視字元裝置,輸出第一列為c的的標識的裝置,其中有主裝置號,和次裝置號 裝置檔案對應裝置驅動,linux將每個裝置對映成為乙個檔案,如果訪問檔案,那麼對應的訪問就是相應的io驅動程式,檔案和驅動主要是通過主裝置號聯絡起來的,次裝置號就是反應了具體是那個裝置 核心中 dev...
Linux驅動學習
1.make時使用make arch arm cross compile arm linux gnueabihf 命令而不是make命令 2.編譯.c檔案使用arm linux gnueabihf gcc o c生產可執行檔案 3.cat proc devices 只顯示驅動的主裝置號,且是分類顯示...
linux驅動學習
驅動學習筆記 1模組載入函式 模組載入的是觸發,載入完畢後就解除安裝 static int init mymodule init void module init mymodule init 2模組解除安裝函式 模組被關閉時觸發,或者系統被關閉時觸發 static void exit mymodul...