關於驅動模組自動建立裝置節點

2021-10-04 15:59:09 字數 3082 閱讀 6507

linux 2.6 引入了動態裝置管理, 用udev作為裝置管理器(應用在x86), 相比之前的靜態裝置管理,在使用上更加方便靈活。

udev根據sysfs系統提供的裝置資訊實現對/dev目錄下裝置節點的動態管理,包括裝置節點的建立、刪除等

引入udev自動建立裝置節點後,比如在我們使用的insmod led_drv.ko時候,udev自動幫我們在/dev目錄下建立裝置節點;

使用rmmod led_drv時候,udev自動幫我們在/dev目錄下刪除裝置節點;

這裡並不需要我們再人為的mknod /dev/led_dev c 239 0來生成為該裝置在/dev目錄下建立裝置檔案了。

如要編寫乙個能夠使用udev管理的裝置驅動,需要在驅動**中呼叫class_create()為裝置建立乙個class 類,再呼叫device_create()為每個裝置建立對應的裝置即可,從此告別需要繁瑣的mknod ....

裝置類的申請等都在初始化函式中完成,故取前面的led_dev.c**中的初始化函式來解析

static struct class  *led_class;

static struct device *led_dev_device;

......

...//入口函式

static int __init gec6818_led_init(void)

//字元裝置的初始化 void cdev_init(struct cdev *cdev, const struct file_operations *fops)

cdev_init(&led_cdev, &led_fops);

//將裝置加入到核心 int cdev_add(struct cdev *p, dev_t dev, unsigned count)

ret = cdev_add(&led_cdev, led_dev_num, 1);

if(ret < 0)

led_class=class_create(this_module, "myled"); //這裡的「myled」會顯示在/sys/class目錄當中

if (is_err(led_class)) //判斷當前指標是否為錯誤碼指標,大於0為錯誤碼指標

led_dev_device = device_create(led_class, null, led_dev_num, null, "myled");//這裡的「myled」是裝置的名字,如果建立成功,就可以在/dev目錄看到該裝置的名字

if (is_err(led_dev_device)) //建立裝置失敗

printk("<3>""device num: %d\n", major(led_dev_num));

printk("<3>""device last num: %d\n", minor(led_dev_num));

return 0;

err_device_create:

class_destroy(led_class); //建立led類失敗,釋放記憶體資源

err_class_create:

cdev_del(&led_cdev); //從系統刪除字元裝置

err_cdev_add:

unregister_chrdev_region(led_dev_num, 1); //登出裝置號

return ret;

}

**原型:

引數作用

owner

class的所有者,預設寫this_module

name

自定義class的名字,會顯示在/sys/class目錄當中

返回值成功:就返回建立好的class指標,失敗:就返回錯誤碼指標

裝置的建立 device_create() 標頭檔案: #include

**原型:

引數作用

class

建立device是屬於哪個類

parent

預設為null

devt

裝置號,裝置號必須正確,因為這個函式會在/dev目錄下幫我們自動建立裝置檔案

drvdata

預設為null

fmt裝置的名字,如果建立成功,就可以在/dev目錄看到該裝置的名字

返回值成功:就返回建立好的裝置指標,失敗:就返回錯誤碼指標

類的銷毀 class_destroy() 標頭檔案: #include

**原型:

引數作用

class

建立device是屬於哪個類

裝置的銷毀 device_destroy() 標頭檔案: #include

**原型:

引數作用

class

建立device是屬於哪個類

devt

裝置號

錯誤碼指標的判斷

static inline long __must_check is_err(const void *ptr)

將錯誤碼指標轉換為數值(即錯誤碼)

static inline long __must_check ptr_err(const void *ptr)

我的githu

4412驅動 led驅動 自動建立裝置節點

驅動 include include include include file operations include include request mem region include include class create device create define devname ldm st...

linux字元裝置驅動中自動建立裝置節點

簡述 1 裝置號 驅動等概念性問題 2 裝置號的自動分配和手動指定 3 mknode手動建立節點。編碼實現 1 核心點 要使的驅動能夠在載入時自動完成裝置節點的註冊,主要流程如下 驅動載入時完成如下工作 分配裝置號 註冊字元裝置 動態建立裝置節點。驅動解除安裝時完成如下工作 刪除裝置節點 取消字元裝...

嵌入式裝置驅動 自動建立裝置節點

主要用到的四個方法在linux device.h定義 建立類和釋放類的函式 建立成後將建立 sys class name資料夾 extern struct class class create struct module owner,const char name extern void class...