1. 程式人生 > >linux驅動:自動建立裝置節點

linux驅動:自動建立裝置節點

在載入驅動模組後,就要自己使用mknod建立裝置節點,這樣雖然是可行的,但是比較麻煩。我們可以在__init()函式裡面新增一些函式,自動建立裝置節點。建立裝置節點使用了兩個函式 class_create()和device_create(),當然在__exit()函式裡,要使用class_destory()和device_desotry()登出建立的裝置節點。

1. 函式說明

struct device *device_create(struct class *class, struct device *parent,
dev_t devt, const char *fmt, ...)

struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)

在驅動用加入對udev的支援主要做的就是:在驅動初始化的程式碼裡呼叫class_create(...)為該裝置建立一個class,再為每個裝置呼叫device_create(...)( 在2.6較早的核心中用class_device_create)建立對應的裝置。

核心中定義的struct class結構體,顧名思義,一個struct class結構體型別變數對應一個類,核心同時提供了class_create(…)函式,可以用它來建立一個類,這個類存放於sysfs下面,一旦建立好了這個類,再呼叫 device_create(…)函式來在/dev目錄下建立相應的裝置節點。這樣,載入模組的時候,使用者空間中的udev會自動響應 device_create(…)函式,去/sysfs下尋找對應的類從而建立裝置節點。

2. 具體用法

需要包含標頭檔案 #include <linux/device.h>    

static int led_init()
{

    major = register_chrdev(0, "led_drv", &led_fops);
    led_drv_class = class_create("THIS_MODULE", "led_drv");
    device_create(led_drv_class, NULL, MKDEV(major, 0), NULL, "myled");

    return 0;

}



static void led_exit()
{

    unregister_chrdev(major, "led_drv");
    device_destroy(led_drv_class, MKDEV(major, 0));
    class_destroy(led_drv_class);

}

在驅動初始化的程式碼裡呼叫class_create為該裝置建立一個class,再為每個裝置呼叫 device_create建立對應的裝置。

載入模組後,會自動在/dev/下建立myled裝置檔案。