i.MX6ULL终结者Linux MISC驱动misc设备驱动简介

本文介绍了Linux MISC驱动的原理和使用,指出 misc 设备驱动主设备号固定为10,通过从设备号区分不同设备。在使用misc驱动时,系统会自动创建cdev,简化了字符设备驱动的编写过程。文章详细阐述了miscdevice结构体的定义、子设备号的选择、设备名称和操作集合(fops)的设置,以及misc_register和misc_deregister函数在设备注册和注销中的作用。
摘要由CSDN通过智能技术生成

所有的misc设备驱动的主设备号都为10,不同的设备使用不同的从设备号。当使用misc设备驱动时,misc设备会自动创建cdev,不用像以前一样需要手动创建,因此采用misc设备驱动可以简化字符设备驱动的编写。
misc设备用miscdevice结构体表示,具体定义在include/linux/miscdevice.h 中,内容如下:

57 struct miscdevice { 
58         int minor; /* 子设备号 */ 
59         const char *name; /* 设备名字 */ 
60         const struct file_operations *fops; /* 设备操作集 */ 
61         struct list_head list; 
62         struct device *parent; 
63         struct device *this_device; 
64         const struct attribute_group **groups; 
65         const char *nodename; 
66         umode_t mode; 
67 };

当我们创建一个misc设备的miscdevice结构体时,需要我们指定minor、name和fops这三个成员变量。minor表示子设备号,需要用户设置,在Linux内核中有一些预定义的misc设备的子设备号,定义在include/linux/miscdevice.h 文件中,如下所示:

13 #define    PSMOUSE_MINOR          1 
14 #define    MS_BUSMOUSE_MINOR  2 /* unused */ 
15 #define    ATIXL_BUSMOUSE_MINOR   3 /* unused */ 
16 /*#define  AMIGAMOUSE_MINOR       4 FIXME OBSOLETE */ 
17 #define    ATARIMOUSE_MINOR       5 /* unused */ 
18 #define    SUN_MOUSE_MINOR        6 /* unused */ 
...... 
52 #define    MISC_DYNAMIC_MINOR     255

我们设置子设备号时要注意不要重复使用其他设备的子设备号。可以从这些预定义的子设备号中选择一个,也可以自定义。
name就是这个misc设备的名字,当设备注册成功后,会在/dev目录下自动生成一个名为name的设备文件。fops就是这个misc设备的操作集合。
当创建好miscdevice结构体后,使用misc_register 函数向系统中注册一个misc设备,函数原型如下:
int misc_register(struct miscdevice * misc)
参数misc就是之前创建好的miscdevice结构体。成功返回0,失败返回负数。

在创建字符设备驱动时,我们会使用下面几个函数完成设备的创建:

1 alloc_chrdev_region();    /* 申请设备号 */ 
2 cdev_init();            /* 初始化 cdev */ 
3 cdev_add();             /* 添加 cdev */ 
4 class_create();         /* 创建类 */ 
5 device_create();        /* 创建设备 */

现在只需要一个misc_register 函数就可以替代上面这几个函数。
在设备驱动的卸载函数中,使用misc_deregister 函数来注销掉misc设备。函数原型如下:
int misc_deregister(struct miscdevice *misc)
参数misc就是要注销的miscdevice结构体。
同样的misc_deregister 函数用来代替下面这几个字符设备的注销函数:

1 cdev_del(); 					/* 删除 cdev */ 
2 unregister_chrdev_region();	 /* 注销设备号 */ 
3 device_destroy(); 				/* 删除设备 */ 
4 class_destroy();				 /* 删除类 */ 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值