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

embedded/2024/9/24 23:22:37/

目录

一、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.ppmy.cn/embedded/33403.html

相关文章

【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现

文章目录 引入认识 YAML 格式规范定义脱敏规则格式脱敏逻辑实现读取 YAML 配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后 对数据进行脱敏处理递归生成字段对应的键路径脱敏测试 完整工具类 引入 在项目中遇到一个需求&#xff0c;需要对交易接口返回结果中的指定…

第20章 基于风险的测试技术

一、项目实践中的测试实施实践 制定测试计划阶段 1、要测试什么&#xff0c;不要测试什么 内容、目标要达到的质量要求尽量明确让利益相关方都能理解并达成共识 2、如何测试 设计测试确定目标、选取合适的测试设计技术执行测试明确测试工具、确定测试环境、确定测试轮次 …

树莓派4b使用--系统安装和远程控制

目录 一、器件 二、将系统烧录进TF卡 1.安装Raspberry Pi Imager 2.下载img镜像 3.打开Raspberry Pi Imager 4.点击NEXT 5.等待配置完成 三、远程控制 1.先把烧录好的TF卡插入树莓派 2.设置一下电脑的WLAN为共享 3.安装所需的软件 1.安装putty 2.安装VNC Server 3.…

蒙特卡洛电动汽车负荷预测

部分代码: P_load=load(load.txt); P_load=P_load/100000; B=EV_load(958); %每个节点接入1250辆电动汽车 接入位置8 14 29 for i=1:24 [Ploss,V]=IEEE33(B(i),P_load(i)); Ploss_after(i)=Ploss; V_after(i,:)=V; end for i=1:24 [Ploss,V]=test(P_load(i)); Ploss_be…

H2数据库常见问题

H2数据库问题1 [90048][90048] Unsupported database file version or invalid file header in file “C:/Users/admin/Desktop/temp/2024.05.01/springboot-h2-mybatisplus/db/firstDb.mv.db” [90048-220] The write format 2 is smaller than the supported format 3 [2.2.…

【JavaScript】使用 AbortController 对象中断 fetch 的文本流传输

AbortController 正如我们所知道的&#xff0c;fetch 返回一个 promise。JavaScript 通常并没有“中止” promise 的概念。那么我们怎样才能取消一个正在执行的 fetch 呢&#xff1f;例如&#xff0c;如果用户在我们网站上的操作表明不再需要某个执行中的 fetch。 为此有一个…

python执行其他路径下的python文件

要在Python中执行其他路径下的Python文件&#xff0c;可以使用subprocess模块。以下是一个示例代码&#xff1a; import subprocess# 指定要运行的Python脚本的路径 script_path "/path/to/your/script.py"# 使用subprocess.run来执行脚本 result subprocess.run(…

GPS时钟服务器(北斗授时设备)助某数据中心项目部署

GPS时钟服务器&#xff08;北斗授时设备&#xff09;助某数据中心项目部署 GPS时钟服务器&#xff08;北斗授时设备&#xff09;助某数据中心项目部署 1.1 项目概述 本次某数据中心时间同步项目中&#xff0c;设计目标是为了满足该数据中心同一区域数万台设备的时间高精度同步要…