Linux驱动开发——(十)MISC设备驱动

目录

一、MISC驱动介绍

1.1 miscdevice结构体

1.2 misc_register函数

1.3 misc_deregister函数

二、驱动代码

2.1 框架代码流程

2.2 完整框架代码


一、MISC驱动介绍

MISC驱动(杂项驱动),当板子上的某些外设无法进行分类的时候就可以使用MISC驱动。

MISC驱动最简单的字符设备驱动,通常嵌套在platform总线驱动中,实现复杂的驱动。随着Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC设备驱动用于解决此问题。

所有的MISC设备驱动的主设备号为10,不同的设备使用不同的从设备号。

1.1 miscdevice结构体

MISC设备会自动创建cdev,不需要手动创建,因此采用MISC设备驱动可以简化字符设备驱动的编写。miscdevice结构体定义在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; 
};

定义一个MISC设备以后需要设置minor、name和fops这三个成员变量。

minor:子设备号, MISC设备的主设备号固定为10,但子设备号需要用户指定。Linux系统已经预定义了一些MISC设备的子设备号,定义在include/linux/miscdevice.h文件中:

#define PSMOUSE_MINOR 1 
#define MS_BUSMOUSE_MINOR 2 /* unused */ 
#define ATIXL_BUSMOUSE_MINOR 3 /* unused */ 
/*#define AMIGAMOUSE_MINOR 4 FIXME OBSOLETE */ 
#define ATARIMOUSE_MINOR 5 /* unused */ 
#define SUN_MOUSE_MINOR 6 /* unused */ 
...... 
#define MISC_DYNAMIC_MINOR 255

name:此MISC设备名字,当此设备注册成功以后就会在/dev目录下生成一个名为name的设备文件。

fops:字符设备的操作集合,MISC设备驱动需要使用用户提供的fops操作集合。

1.2 misc_register函数

当设置好miscdevice结构体后需要使用misc_register函数向系统中注册一个MISC设备

int misc_register(struct miscdevice * misc)

misc:要注册的MISC设备。
返回值:负数即失败;0即成功。

使用misc_register函数可以完成以下代码功能:

alloc_chrdev_region(); /* 申请设备号 */ 
cdev_init(); /* 初始化cdev */ 
cdev_add(); /* 添加cdev */ 
class_create(); /* 创建类 */ 
device_create(); /* 创建设备 */

1.3 misc_deregister函数

需要卸载设备驱动模块时调用misc_deregister函数注销MISC设备

int misc_deregister(struct miscdevice *misc) 

misc:要注销 MISC设备。
返回值:负数即失败;0即成功。

使用misc_deregister函数可以完成以下代码功能:

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

二、驱动代码

2.1 框架代码流程

先定义宏:

#define XXX_NAME		"miscxxx"	/* 名字 	*/
#define XXX_MINOR		144			/* 子设备号 */

再完善fops,然后将minor、namefops这三个成员变量设置进miscdevice结构体中:

static struct file_operations xxx_fops = { .owner = THIS_MODULE,
};static struct miscdevice xxx_miscdev = { .minor = XXX_MINOR, .name = XXX_NAME, .fops = &xxx_fops, 
};

在probe函数中注册misc设备驱动

static int miscxxx_probe(struct platform_device *dev) {int ret = 0;/* 注册misc设备驱动 */ ret = misc_register(&xxx_miscdev); if(ret < 0){ printk("misc device register failed!\r\n"); return -EFAULT; } return 0; 
}

在remove函数中注销misc设备驱动

static int miscxxx_remove(struct platform_device *dev) /* 注销misc设备驱动 */ misc_deregister(&xxx_miscdev); return 0; 
}

2.2 完整框架代码

如下:

#define XXX_NAME		"miscxxx"	/* 名字 	*/
#define XXX_MINOR		144			/* 子设备号 */static struct file_operations xxx_fops = { .owner = THIS_MODULE,
};static struct miscdevice xxx_miscdev = { .minor = XXX_MINOR, .name = XXX_NAME, .fops = &xxx_fops, 
};static int miscxxx_probe(struct platform_device *dev) {int ret = 0;/* 注册misc设备驱动 */ ret = misc_register(&xxx_miscdev); if(ret < 0){ printk("misc device register failed!\r\n"); return -EFAULT; } return 0; 
}static int miscxxx_remove(struct platform_device *dev) /* 注销misc设备驱动 */ misc_deregister(&xxx_miscdev); return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一算法

问题 等待登机的你看着眼前有老有小长长的队伍十分无聊&#xff0c;你突然 想要知道&#xff0c;是否存在两个年龄相仿的乘客。每个乘客的年龄用 1个0 到 36500 的整数表示&#xff0c;两个乘客的年龄相差 365 以内 就认为是相仿的。 具体来说&#xff0c;你有一个长度为 n 的…

c#使用Elastic.Clients.Elasticsearch 库进行ElasticSearch的增删改查操作,根据变量动态构建查询条件。

实体类Shop结构: public class Shop {public string UUID { set; get; }public string ItemType { set; get; }public long ItemId { set; get; }public string ItemName { set; get; }public long Gold { set; get; }public long Number { set; get; }public string Data { s…

进程控制【Linux】

文章目录 进程终止进程等待 创建一批子进程 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define N 5void runChild() {int cnt 10;while (cnt ! 0){printf("i am a child : %d , ppid:%d\n", getpid(), getppid());sleep(1);c…

【后端】RabbitMQ的常见使用问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、RabbitMQ 常见问题二、RabbitMQ 常见报错三、总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很…

HCIP第一节

一。网络类型&#xff1a; 1.点到点&#xff1a;在一个网络内只能存在两个物理节点 MA&#xff08;BMN,NBMN)-多路访问&#xff1a;在一个网段内物理节点的数量不受限制&#xff08;在一个网段内可以放置多个物理节点&#xff0c;同时该范围内可以实施广播泛洪机制&#xff0…

【YOLO改进】换遍IoU损失函数之Innerciou Loss(基于MMYOLO)

替换Inner CIoU损失函数(基于MMYOLO) 由于MMYOLO中没有实现Inner CIoU损失函数&#xff0c;所以需要在mmyolo/models/iou_loss.py中添加Inner CIoU的计算和对应的iou_mode&#xff0c;修改完以后在终端运行 python setup.py install 再在配置文件中进行修改即可。修改例子如…

IoTDB 入门教程⑥——数据库SQL操作 | 数据库管理和数据读写

文章目录 一、前文二、数据库管理2.1 创建数据库2.2 查询数据库2.3 删除数据库 三、数据读写3.1 查询数据3.2 新增数据3.3 修改数据3.4 删除数据 四、参考 一、前文 IoTDB入门教程——导读 本博文主要讲述数据库管理和数据读写 二、数据库管理 2.1 创建数据库 CREATE DATABASE…

数据结构之链表深度讲解

小伙伴们&#xff0c;大家好呀&#xff0c;上次听我讲完顺序表想必收获不少吧&#xff0c;嘿嘿&#xff0c;这篇文章你也一样可以学到很多&#xff0c;系好安全带&#xff0c;咱们要发车了。 因为有了上一次顺序表的基础&#xff0c;所以这次我们直接进入正题&#xff0c;温馨…

JavaScript 动态网页实例 —— 文字移动

前言 介绍文字使用的特殊效果。本章介绍文字的移动效果,主要包括:文字的垂直滚动、文字的渐隐渐显、文字的闪烁显示、文字的随意拖动、文字的坠落显示、页面内飘动的文字、漫天飞舞的文字、文字的下落效果。对于这些效果,读者只需稍加修改,就可以应用在自己的页面设计中。 …

4.3 JavaScript变量

4.3.1 变量的声明 JavaScript是一种弱类型的脚本语言&#xff0c;无论是数字、文本还是其他内容&#xff0c;统一使用关键词var加上变量名称进行声明&#xff0c;其中关键词var来源于英文单词variable&#xff08;变量&#xff09;的前三个字母。 可以在声明变量的同时对其指定…

多线程与信号量简介

信号量与 PV 操作 计算机中信号量的本质是整数&#xff0c;数值表示可用的资源数量 P 操作 (Passeren > 通过, 原子操作) 若信号量 0&#xff0c;当前任务阻塞 (进入信号量等待队列)若信号量 > 0&#xff0c;则&#xff1a;将信号量数值减一&#xff0c;当前任务继续执…

你知道什么是防抖和节流吗?

目录 1 先举个例子 2 使用场景 3 代码实现 3.1 防抖的实现 3.2 节流的实现 1 先举个例子 防抖&#xff0c;更像是坐电梯&#xff0c;早上眼看9点了&#xff0c;都着急坐电梯上去打卡&#xff0c;但眼看电梯要关了&#xff0c;进来一个人&#xff0c;等几秒&#xff0c;…

uniapp乡村社区户籍问外来人员管理系统 微信小程序python+java+node.js+php

基于微信小程序的外来人员管理系统项目的概述设计分析&#xff0c;主要内容有的私教预约平台系统平台的具体分析&#xff0c;进行数据库的是设计&#xff0c;数据采用MySQL数据库&#xff0c;并且对于系统的设计采用比较人性化的操作设计&#xff0c;对于系统出现的错误信息可以…

YOLO的版本及进阶历史

YOLO&#xff08;You Only Look Once&#xff09;系列算法是目标检测领域的重要进展&#xff0c;以其速度快和性能优异而著称。以下是YOLO系列的版本及进阶历史的概述&#xff1a; 1. YOLOv1&#xff1a;由Joseph Redmon等人在2016年提出&#xff0c;是YOLO系列的开山之作。它…

信创 | 信创产业人才需求与培养机制:优化策略与实践探索

信创产业的人才需求与培养机制面临着多方面的挑战和机遇。首先&#xff0c;信创产业的快速发展带来了巨大的人才需求&#xff0c;但目前人才培养供给与企业发展需求之间存在不匹配的问题。这种不匹配主要表现在课程体系不健全、产教融合不够深入、校企联动性不足以及职业培训市…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

学习java中的final关键字,常量和抽象类

1.final的特点 final关键字是最终的意思&#xff0c;可以用来修饰类&#xff0c;方法和变量。 修饰类&#xff1a;该类就被称为最终类&#xff0c;特点是不能被继承。比如方法类。 修饰方法&#xff1a;该方法就被成为最终方法&#xff0c;特点是本能被重写。 修饰变量&…

HTMLElement对象

HTMLElement对象 任何HTML元素都继承于HTMLElement对象&#xff0c;一些元素直接实现这个接口&#xff0c;而另一些元素通过多层继承来实现它。 属性 从其父元素Element继承属性&#xff0c;并从DocumentAndElementEventHandlers、ElementCSSInlineStyle、GlobalEventHandle…

第16章 基于结构的测试技术(白盒测试技术)

一、静态测试技术 &#xff08;一&#xff09;概述 不运行程序代码的情况下&#xff0c;通过质量准则或其他准则对测试项目进行检查的测试类型&#xff0c;人工或工具检查。 1、代码检查 2、编码规则检查 3、静态分析 静态分析概述 不需要执行程序 控制流分析 通过生成…

短视频矩阵系统源码==3年源头开发

一 短视频矩阵系统具备以下特点: 1.内容管理功能:用户可以在系统中多账号托管 一次性上传、编辑和发布多个短视频平台的内容&#xff0c;无需在每个平台上重复操作&#xff0c;从而提高工作效率并保持内容的一致性和高质量 2.批量剪辑视频:系统支持上传批量素材管理剪辑 视频…