日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux字符驱动之自动创建设备节点

發布時間:2023/11/30 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux字符驱动之自动创建设备节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一節中,我們是手工創建設備節點,大家肯定也會覺得這樣做太麻煩了。

上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104302700

問:能不能讓系統自動創建設備節點?

答:可以,linux有udev、mdev的機制,而我們的ARM開發板上移植的busybox有mdev機制,那么就使用mdev機制來自動創建設備節點。

問:文件系統里,在哪里設置了mdev機制?

答:在etc/init.d/rcS文件里有一句:

echo /sbin/mdev > /proc/sys/kernel/hotplug

問:在驅動程序里面如何編寫程序,讓系統自動創建設備節點?

答:首先創建一個class類,然后在class類下,創建一個class_device,即類下面創建類的設備。

?

詳細請參考驅動源碼:

#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/arch/regs-gpio.h> #include <asm/hardware.h>static struct class *firstdrv_class; static struct class_device *firstdrv_class_dev;int major; static int first_drv_open(struct inode * inode, struct file * filp) {printk("first_drv_open\n");return 0; } static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos) {printk("first_drv_write\n");return 0; }/* File operations struct for character device */ static const struct file_operations first_drv_fops = {.owner = THIS_MODULE,.open = first_drv_open,.write = first_drv_write, };/* 驅動入口函數 */ static int first_drv_init(void) {/* 主設備號設置為0表示由系統自動分配主設備號 */major = register_chrdev(0, "first_drv", &first_drv_fops);/* 創建firstdrv類 */firstdrv_class = class_create(THIS_MODULE, "firstdrv"); //創建一個“類”/* 在firstdrv類下創建xxx設備,供應用程序打開設備*//* 在“類”里面創建設備* MKDEV(major, 0)指定主設備號為major,次設備號為0(這里的major必須和register_chrdev返回的一致,不然會出錯)*/firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");return 0; }/* 驅動出口函數 */ static void first_drv_exit(void) {unregister_chrdev(major, "first_drv");device_unregister(firstdrv_class_dev); //卸載類下的設備class_destroy(firstdrv_class); //卸載類 }module_init(first_drv_init); //用于修飾入口函數 module_exit(first_drv_exit); //用于修飾出口函數 MODULE_AUTHOR("LWJ"); MODULE_DESCRIPTION("Just for Demon"); MODULE_LICENSE("GPL"); //遵循GPL協議

測試程序和Makefile沒有修改,故再不貼。

上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104302700

測試步驟:

[WJ2440]# ls Qt driver_test lib root udisk TQLedtest etc linuxrc sbin usr app_test first_drv.ko mnt sddisk var bin first_test opt sys web dev home proc tmp [WJ2440]# ls -l /dev/xxx //還沒有設備節點 ls: /dev/xxx: No such file or directory [WJ2440]# insmod first_drv.ko //裝上我們寫的驅動后,會自動生成設備節點/dev/xxx [WJ2440]# lsmod first_drv 1912 0 - Live 0xbf000000 [WJ2440]# ls -l /dev/xxx //查看生成的設備節點 crw-rw---- 1 root root 252, 0 Jan 1 23:17 /dev/xxx [WJ2440]# cat proc/devices Character devices:1 mem4 /dev/vc/04 tty5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound29 fb81 video4linux89 i2c90 mtd 116 alsa 128 ptm 136 pts 180 usb 188 ttyUSB 189 usb_device 204 tq2440_serial 252 first_drv 253 usb_endpoint 254 rtcBlock devices: 259 blkext7 loop8 sd31 mtdblock65 sd66 sd67 sd68 sd69 sd70 sd71 sd 128 sd 129 sd 130 sd 131 sd 132 sd 133 sd 134 sd 135 sd 179 mmc [WJ2440]# cd /sys/class/ //打開/sys/class可以看到我們生成的firstdrv類 [WJ2440]# ls bdi i2c-adapter misc scsi_device usb_endpoint block i2c-dev mmc_host scsi_disk usb_host firmware ieee80211 mtd scsi_host vc firstdrv input net sound video4linux graphics mem rtc tty vtconsole [WJ2440]# cd firstdrv/ //firstdrv類里面有我們的xxx設備 [WJ2440]# ls xxx [WJ2440]# cd xxx/ [WJ2440]# ls dev subsystem uevent [WJ2440]# cat dev //主設備號252,次設備號0 252:0 [WJ2440]# cat uevent MAJOR=252 MINOR=0 [WJ2440]# cd / [WJ2440]# ./first_test //有了設備節點便能夠運行我們的程序了 first_drv_open first_drv_write [WJ2440]#

?

本文參考于:

https://blog.csdn.net/lwj103862095/article/details/17470573?

總結

以上是生活随笔為你收集整理的linux字符驱动之自动创建设备节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。