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
裝置號
錯誤碼指標的判斷我的githu將錯誤碼指標轉換為數值(即錯誤碼)static inline long __must_check is_err(const void *ptr)
static inline long __must_check ptr_err(const void *ptr)
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...