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

ops/2025/2/19 16:34:11/

目录

一、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/ops/37816.html

相关文章

WebGL是啥

WebGL&#xff08;全写为Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScript绑定&#xff0c;WebGL可以为HTML5 Canvas提供硬件3D加速渲染。这样&…

202209青少年软件编程(Python) 等级考试试卷(一级)

第 1 题 【单选题】 表达式 len(“学史明理增信 , 读史终生受益”) > len(" reading history will benefit you ") 的结果是? ( ) A :0 B :True C :False D :1 正确答案:C 试题解析: 第 2 题 【单选题】 在 turtle 画图中, 常常使用 turtle.color(co…

SpringBoot camunda

1&#xff1a;默认排他网关&#xff0c;表达式 Type:expression:${number%2000} 2: service task (系统自动执行用的最多):常用Delegate expression ${testGateWay} 举例&#xff1a; Component("testGateWay") public class TestGateWay implements JavaDelegate {…

连接和使用vCenter Server嵌入式vPostgres数据库

vCenter Server 早期支持内嵌(embedded)和外部(external)数据库,内嵌数据库就是vPostgres,基于VMware Postgres数据库(PostgreSQL数据库),外部数据库用的多的是Oracle数据库和SQL Server数据库。因为早期使用内嵌的PostgreSQL数据库只能用于小型环境,比如仅支持几十台…

小家电水箱检测液位有哪些方法

如今&#xff0c;随着智能化的不断发展&#xff0c;越来越多智能家电走进我们的生活&#xff0c;智能家电中都有一个重要的功能&#xff0c;那就是液位检测&#xff0c;这个功能可以直接影响用户体验&#xff0c;那么小家电水位检测液位方法有哪些&#xff1f; 光电一体式液位…

如何利用AI提高生产效率

如何利用AI提高生产效率 1. 国外知名AI ​ 当提到各大厂家的AI名称时&#xff0c;我认为您可能指的是这些公司自己开发的人工智能平台或工具。以下是一些知名公司的AI名称: Google: TensorFlow、Google Cloud AIAmazon: Amazon Web Services (AWS) AI、Amazon RekognitionMi…

ES集群搭建、身份认证配置

虚机搭建 添加es用户 elasticsearch 默认不允许root用户启动&#xff0c;所以需要创建es用户 useradd elasticsearch passwd elasticsearch解压安装包 #解压es tar -xvzf elasticsearch-7.14.2-linux-x86_64.tar.gz将文件夹赋予es用户权限 #将文件夹赋予es用户权限 sudo c…

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案&#xff0c;旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台&#xff0c;现在已经开源&#xff0c;并在国际物联网领域受到广泛关注。 功能描述 多协…