混杂设备 注册杂项字符设备,该类设备使用同一个主设备号10 杂项字符设备使用的数据结构 struct miscdevice { int minor; const char *name; struct file_operations *fops; struct list_head list; struct device *dev; struct class_device *class; char devfs_name[64]; }; Linux 内核使用misc_register 函数来注册一个混杂设备驱动。 Int misc_register(struct miscdevice *misc) Linux 内核使用misc_deregister 函数来卸载一个混杂设备驱动。 Int misc_deregister(struct miscdevice *misc) 杂项设备(misc device) 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux/miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主设备号10 ,一起归于misc device,其实misc_register就是用主设备号10调用register_chrdev()的。也就是说,misc设备其实也就是特殊的字符设备。 misc_device是特殊的字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_create()或者device_create()。
字符设备(char device) 使用 register_chrdev(LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时,如果有多个设备使用该函数注册驱动程序,LED_MAJOR不能相同,否则几个设备都无法注册(我已验证)。如果模块使用该方式注册并且LED_MAJOR为0(自动分配主设备号),使用insmod命令加载模块时会在终端显示分配的主设备号和次设备号,在/dev目录下建立该节点,比如设备leds,如果加载该模块时分配的主设备号和次设备号为253和0,则建立节点:mknod leds c 253 0。使用register_chrdev (LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时都要手动建立节点,否则在应用程序无法打开该设备。
------------------------------------------------------ #include <linux/miscdevice.h> //struct miscdevice #include <linux/fs.h> //struct file_operations
#define KDA_MINOR 44
static int kda_open(struct inode *inode, struct file *file) { printk("%s, %d/n", __FUNCTION__, __LINE__);; return 0; }
static struct file_operations kda_fops = { .owner = THIS_MODULE, .open = kda_open, };
static struct miscdevice kda_dev = { KDA_MINOR, "kda", &kda_fops };
static int __init hello_init(void) { int err;
printk("<1>Hello world 1./n");
err = misc_register(&kda_dev); if (err) { printk("envctrl: Unable to get misc minor %d/n", kda_dev.minor); }
return 0; }
static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbye world 1./n"); misc_deregister(&kda_dev); }
module_init(hello_init); module_exit(hello_exit);
MODULE_LICENSE("GPL"); MODULE_AUTHOR("zengxiaolong "); MODULE_DESCRIPTION("A sample driver"); MODULE_SUPPORTED_DEVICE("testdevice");
注: 1. 上面的代码可以自动生成设备节点,但是该节点在/dev/misc目录下,而不在/dev目录下
|