MISC设备驱动框架

MISC设备又称杂项设备,由于一些设备不好分类,所有可以把他们都归到杂项设备里面。字符设备也可以看成一种杂项设备,使用MISC驱动框架时,可以简化字符设备驱动的开发

Misc是Linux驱动开发里的一个子系统,它也遵循了驱动分层的思想,用一个核心层来完成对此类设备IO操作之类的通用操作的封装,用户只需要写简单的驱动实例层并注册设备到该子系统就行了

1.MISC设备简介

Linux内核提供了struct miscdevice来定义杂项设备

  • 可以看到,misc框架其实把字符设备驱动框架和Linux设备驱动模型==封装到了一起==,可以同时向用户层提供I/O操作的接口,并完成驱动和设备的匹配
1
2
3
4
5
6
7
8
9
10
11
struct miscdevice  { 
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const struct attribute_group **groups;
const char *nodename;
umode_t mode;
};

通常至少要定义以下几个成员变量/函数:

  • minor:所有MISC设备的主设备号都为10,所以我们需要提供一个子设备号
  • fops:文件操作集合
  • name:设备名字

2.MISC设备的使用

和普通的字符设备一样,创建了MISC设备实例后,还需要向内核注册/注销,先来回忆下普通的字符设备是怎么做的:

1
2
3
4
5
6
7
8
9
10
11
12
//注册字符设备
alloc_chrdev_region(); /* 申请设备号 */
cdev_init(); /* 初始化 cdev */
cdev_add(); /* 添加 cdev */
class_create(); /* 创建类 */
device_create(); /* 创建设备 */

//注销字符设备
cdev_del(); /* 删除 cdev */
unregister_chrdev_region(); /* 注销设备号 */
device_destroy(); /* 删除设备 */
class_destroy(); /* 删除类 */

MISC设备极大地简化了向内核注册设备这一步骤,只需要调用一个API:

1
2
int misc_register(struct miscdevice *misc)
int misc_deregister(struct miscdevice *misc)
  • 返回值:负数,失败;0,成功