在驅動模組初始化函式中實現裝置節

2021-06-19 19:23:44 字數 2145 閱讀 9881

我們在剛開始寫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個步驟 獲取裝置...