[国嵌攻略][118][混杂设备模型]
混杂设备概念
在linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链,对设备访问时内核根据次设备号查找到相应的混杂设备。
设备描述
Linux中使用struct miscdevice来描述一个混杂设备。
struct miscdevice{
int minor; //次设备号
const char *name; //设备名
const struct file_operations *fops; //文件操作
struct list_head list;
struct device *parent;
struct device *this_device;
};
设备注册
Linux系统中使用misc_register函数来注册一个混杂设备驱动。
int misc_register(struct miscdevice (misc)
混杂设备驱动
1.初始化miscdevivce
1.1.minor
1.2.name
1.3.fops
2.注册miscdevice
2.1.misc_register
头文件
<linux/miscdevice.h>
struct miscdevice //混杂设备描述
misc_register() //混杂设备注册
misc_deregister() //混杂设备注销
keydev.c
/******************************************************************** *头文件 *********************************************************************/ #include <linux/init.h> #include <linux/module.h> #include <linux/miscdevice.h> /******************************************************************** *设备方法 *********************************************************************/ //打开设备 int key_open(struct inode *node, struct file *filp){ return 0; } //关闭设备 int key_close(struct inode *node, struct file *filp){ return 0; } //设备方法 struct file_operations key_fops = { .open = key_open, .release = key_close }; /******************************************************************** *模块安装 *********************************************************************/ struct miscdevice misdev = { .minor = 200, //次设备号 .name = "mykey", //设备名称 .fops = &key_fops //设备方法 }; //安装模块 static int led_init(){ //注册混杂设备 misc_register(&misdev); return 0; } //卸载模块 static void led_exit(){ //注销混杂设备 misc_deregister(&misdev); } /******************************************************************** *模块声明 *********************************************************************/ MODULE_LICENSE("GPL"); MODULE_AUTHOR("D"); MODULE_DESCRIPTION(""); MODULE_VERSION("v1.0"); module_init(key_init); module_exit(key_exit);