当前位置: 首页 > article >正文

Linux 字符设备驱动 之 无法归类的《杂项设备驱动》

学习目标:

了解 杂项设备驱动 和普通字符设备的异同,及杂项设备驱动程序的写法


学习内容:

一、杂项设备驱动的特别之处

        杂项设备(Miscellaneous Devices)是一种通用的设备类型,用于表示那些不适合其他设备类型的设备。这些设备通常是不规则的,没有标准的通信协议或接口。

        在Linux中,把无法归类的设备定义成杂项设备。相对于一般字符设备来说,杂项设备主设备号固定位10。而一般字符设备不管是动态分配还是静态分配设备号,都会一个区别其他类别的唯一主设备号。

        杂项设备也会和一般的字符设备一样在/dev下创建设备节点。只是在编写设备驱动时用的函数大有不同。

二、杂项设备编写

1、miscdevice 结构体

        杂项设备使用结构体miscdevice 描述,该结构体定义在 include/linux/misdevice.h 文件中。如下图所示:

        其中,次设备号minor 一般使用宏 MISC_DYNAMIC_MINOR,表示自动分配次设备号。杂项设备主要依赖次设备号来管理。

#define MISC_DYNAMIC_MINOR 255

name: 就是要告诉系统创建设备节点的名称
fops: 就是系统调用 和 驱动功能的连接桥梁,即包含设备操作的 struct file_operations 结构的指针。

2、杂项设备的注册与卸载

        注册和卸载杂项设备的函数声明在 include/linux/miscdevice.h 中,定义在drivers/char/misc.c 文件中。

注册函数 misc_register :

函数原型:int misc_register(struct miscdevice *misc);
参数:杂项设备的结构体指针
返回值:0:成功,负数:失败

卸载函数 misc_deregister:

函数原型:void misc_deregister(struct miscdevice *misc);
参数:杂项设备的结构体指针

3、代码

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

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

static int my_misc_open(struct inode *inode, struct file *file)
{
        printk("This is my_misc_open\n");
        return 0;
}

static ssize_t my_misc_read(struct file *file, char __user *buf, size_t size, loff_t *off)
{
        printk("This is my_misc_read\n");
        return 0;
}

static ssize_t my_misc_write(struct file *file, const char __user *buf, size_t size, loff_t *off)
{
        printk("copy_from_user kbuf = %s\n", kbuf);
        return 0;
}

static int my_misc_release(struct inode *inode, struct file *file)
{
        printk("This is my_misc_release\n");
        return 0;
}


static struct file_operations my_misc_ops={
        .owner = THIS_MODULE,
        .open = my_misc_open,
        .release = my_misc_release,
        .read = my_misc_read,
        .write = my_misc_write,
};

// 定义杂项设备结构体
struct miscdevice misc_dev={
        .minor = MISC_DYNAMIC_MINOR,
        .name = "my_misc",
        .fops = &my_misc_ops
};

// 驱动入口函数
static int module_misc_init(void)
{
        int ret = 0;

        ret = misc_register(&misc_dev);
        if(ret < 0)
        {
                printk("misc_register failed\n");
                return -1;
        }
        return 0;
}

// 驱动卸载函数
static void module_misc_exit(void)
{
        misc_deregister(&misc_dev);
        printk("misc_deregister test module bye!\n");
}

module_init(module_misc_init);
module_exit(module_misc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("BF");
MODULE_VERSION("V1.0");

编译完成后,加载驱动,我们可以查看设备节点中是否创建了杂项设备my_misc,以及主设备号是不是之前说的10, 如图:


http://www.kler.cn/news/364737.html

相关文章:

  • Unity3D学习FPS游戏(4)重力模拟和角色跳跃
  • 经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法)
  • 浅谈c#编程中的异步编程
  • Pytorch常用函数汇总【持续更新】
  • php命令执行的一些执行函数----以ctfshow靶场为解题思路
  • Docker快速安装Grafana
  • @SpringBootApplication
  • CSS揭秘:7. 伪随机背景
  • Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一)
  • java脚手架系列10-统一缓存、分布式锁
  • 怎么做系统性能优化
  • WPF:Binding数据绑定
  • 接地电阻柜的生产流程
  • java项目之电影评论网站(springboot)
  • 【linux】centos7 安装openjdk-17
  • 笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些
  • 星海智算:【王宝宝-ComfyUI-SD3】无需部署一键启动
  • ARM学习(33)英飞凌(infineon)PSOC 6 板子学习
  • 回归、分类模型的评估指标
  • G1(Garbage First)垃圾回收实战
  • 木木模拟器 MuMuPlayer Pro for Mac 下载安装详细教程(无需激活)
  • 人工智能_机器学习100_PCA数据降维算法_协方差和散度矩阵_深入理解_分析_协方差和散度矩阵计算过程---人工智能工作笔记0225
  • Kubernetes集群搭建容器云需要几台服务器?
  • 两个mp3音频怎么合成一个?音频合成的多个好用方法教程
  • python+大数据+基于热门视频的数据分析研究【内含源码+文档+部署教程】
  • 小程序云数据库通用操作