我們在剛開始寫linux裝置驅動程式的時候,很多時候都是利用mknod命令手動建立裝置節點,實際上linux核心為我們提供了一組函式,可以用來在模組載入的時候自動在/dev目錄下建立相應裝置節點,並在解除安裝模組時刪除該節點,當然前提條件是使用者空間移植了udev。
核心中定義了struct class結構體,顧名思義,乙個struct class結構體型別變數對應乙個類,核心同時提供了class_create(…)函式,可以用它來建立乙個類,這個類存放於sysfs下面,一旦建立好了這個類,再呼叫device_create(…)函式來在/dev目錄下建立相應的裝置節點。這樣,載入模組的時候,使用者空間中的udev會自動響應device_create(…)函式,去/sysfs下尋找對應的類從而建立裝置節點。
注意,在2.6較早的核心版本中,device_create(…)函式名稱不同,是class_device_create(…),所以在新的核心中編譯以前的模組程式有時會報錯,就是因為函式名稱不同,而且裡面的引數設定也有一些變化。
struct class和device_create(…) 以及device_create(…)都定義在/include/linux/device.h中,使用的時候一定要包含這個標頭檔案,否則編譯器會報錯。
在2.6.26.6核心版本中,struct class定義在標頭檔案include/linux/device.h中:
struct class
cls->name = name;
cls->owner = owner;
cls->class_release = class_create_release;
retval = class_register(cls);
if (retval)
goto error;
return cls;
error:
kfree(cls);
return err_ptr(retval);
}第乙個引數指定類的所有者是哪個模組,第二個引數指定類名。
在class.c中,還定義了class_destroy(…)函式,用於在模組解除安裝時刪除類。
device_create(…)函式在/drivers/base/core.c中實現:
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, const char *fmt, ...)
第乙個引數指定所要建立的裝置所從屬的類,第二個引數是這個裝置的父裝置,如果沒有就指定為null,第三個引數是裝置號,第四個引數是裝置名稱,第五個引數是從裝置號。
下面以乙個簡單字元裝置驅動來展示如何使用這幾個函式
#include
#include
#include
#include
#include
#include
module_license ("gpl");
int hello_major = 555;
int hello_minor = 0;
int number_of_devices = 1;
struct cdev cdev;
dev_t dev = 0;
struct file_operations hello_fops = ;
static void char_reg_setup_cdev (void)
char_reg_setup_cdev ();
my_class = class_create(this_module, "my_class");
if(is_err(my_class))
device_create( my_class, null, mkdev(hello_major, 0), "hello" "%d", 0 );
printk (kern_info "registered character driver\n");
return 0;
}static void __exit hello_2_exit (void)
module_init (hello_2_init);
module_exit (hello_2_exit);
這樣,模組載入後,就能在/dev目錄下找到hello0這個裝置節點了。
裝置初始化函式巨集
初始化 的記憶體結構 init begin init.text init init.data initdata setup start init.setup setup param initcall start initcall1.init core initcall initcall2.init ...
USB裝置驅動之裝置初始化 裝置列舉
usb裝置從接入hub到正常工作之前,都屬於裝置列舉階段。所謂裝置列舉,就是讓host控制器認識usb裝置,並為其準備資源,建立好主機與裝置間的資料傳遞機制。該階段的工作,是usb通訊協議規定的,所以屬於iso標準流程。裝置列舉階段也對應了usb裝置的五種狀態。裝置列舉階段分為如下8個步驟 獲取裝置...
USB裝置驅動之裝置初始化 裝置列舉
usb裝置從接入hub到正常工作之前,都屬於裝置列舉階段。所謂裝置列舉,就是讓host控制器認識usb裝置,並為其準備資源,建立好主機與裝置間的資料傳遞機制。該階段的工作,是usb通訊協議規定的,所以屬於iso標準流程。裝置列舉階段也對應了usb裝置的五種狀態。裝置列舉階段分為如下8個步驟 獲取裝置...