[国嵌攻略][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);
原文地址:https://www.cnblogs.com/d442130165/p/5253298.html