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設備文件。
?
總結
以上是生活随笔為你收集整理的linux驱动:自动创建设备节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arm架构的安卓模拟器_armv8.3(
- 下一篇: 利用DNS实现SQL注入带外查询(OOB