简介

杂项设备是字符设备的一种

杂项设备自动生成设备节点(/dev/目录下的文件叫设备节点)

系统中的杂项设备可以通过cat /proc/misc来查看

杂项设备的主设备号是相同的,均为10,次设备号不同。主设备号相同就可以节省内核的资源。

设备号简介

设备号包括主设备号和次设备号。

cat /proc/devices可以查看主设备号

杂项设备结构体

//在kernel/include/linux/miscdevice.h头文件中
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;
};
//file_operations结构体里会有一些像read/write的成员,是应用层在操作设备节点read/write时会操作的。

extern int misc_register(struct miscdevice *misc);  //注册杂项设备
extern void misc_deregister(struct miscdevice *misc); //注销杂项设备

注册杂项设备的流程

  1. 填充miscdevice结构体
  2. 填充file_operations结构体
  3. 注册杂项设备并生成设备节点

代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>

struct file_operations misc_fops = {
    .owner = THIS_MODULE
};

struct miscdevice misc_dev = {
    .minor = MISC_DYNAMIC_MINOR,    //自动分配从设备号
    .name  = "hello_misc",          //设备节点名
    .fops  = &misc_fops             //文件操作集
};

static int misc_init(void){
    printk("misc enter!\n");

    int ret = misc_register(&misc_dev);   //注册杂项设备
    if(ret < 0){
        printk("misc regist failed\n"); //注册失败
        return -1;
    }

    printk("misc regist succeed\n");
    return 0;
}

static void misc_exit(void){
    printk("misc exit!\n");
    misc_deregister(&misc_dev);     //卸载杂项设备
}

module_init(misc_init);  //模块入口,加载驱动时执行参数内的函数
module_exit(misc_exit);  //模块出口,卸载模块时执行参数内的函数

MODULE_LICENSE("Dual BSD/GPL"); //遵循BSD和GPL开源许可
MODULE_AUTHOR("TAXUE");  //模块作者

加载.ko文件后,在/dev/目录下可以找到代码中定义的设备节点名(即miscdevice结构体的name成员)。

内容为讯为4412开发板教程的学习笔记