【Linux驱动层】iTOP-RK3568学习之路(四):杂项设备驱动框架

news/2024/10/18 16:49:24/

一、杂项设备驱动简介


在 Linux 中,把无法归类的五花八门的设备定义成杂项设备。相较于字符设备,杂项设备有以下两个优点:

(1)节省主设备号:杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,进而造成了主设备号浪费。当系统中注册了多个 misc 设备驱动时,只需使用子设备号进行区分即可

(2)使用简单:当使用普通的字符设备驱动时,如果开发人员需要导出操作接口给用户空间,就需要注册对应的字符驱动,并创建字符设备 class 从而自动在/dev 下生成设备节点,而 misc驱动只需要将基本信息通过结构体传递给相应处理函数即可。


二、总体框架图


在这里插入图片描述


三、杂项设备相关函数


杂项设备miscdevice 结 构 体

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_DYNAMIC_MINOR,表示自动分配子设备号。
  • name 表示 misc 设备的名字。misc 设备驱动注册成功之后,会在 dev 目录下生成名为 name的设备节点。
  • fops 指向了 file_operations 的结构体,表示字符设备的操作集合。

杂项设备的注册

函数原型:int misc_register(struct miscdevice *misc);
函数作用:基于misc_class构造一个设备,将miscdevice结构挂载到misc_list列表上,并初始化与linux设备模型相关的结构。进而起到杂项设备注册的作用。
参数含义:misc: 杂项设备的结构体指针
函数返回值:申请成功返回 0,申请失败返回负数

杂项设备的卸载

函数原型:int misc_deregister(struct miscdevice *misc);
函数作用:从 mist_list 中删除 miscdevice,进而起到杂项设备卸载的作用。
参数含义:misc: 杂项设备的结构体指针
函数返回值:卸载成功返回 0,申请失败返回负数

四、实例代码


#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <linux/miscdevice.h>static int cdev_test_open(struct inode * inode, struct file * file){printk("This is cdev_test_open!\n");return 0;
}static ssize_t cdev_test_read(struct file * file, char __user *buf, size_t size, loff_t *off){printk("This is cdev_test_read!\n");return 0;
}static ssize_t cdev_test_write(struct file * file, const char __user * buf, size_t size, loff_t *off){printk("This is cdev_test_write!\n");return 0;
}static int cdev_test_release(struct inode * inode, struct file * file){printk("This is cdev_test_release!\n");return 0;
}struct file_operations cdev_test_ops={.owner = THIS_MODULE,    // 文件操作结构体.open = cdev_test_open,.read = cdev_test_read,.write = cdev_test_write,.release = cdev_test_release,
};struct miscdevice misc_dev = {.minor = MISC_DYNAMIC_MINOR,.name = "test",.fops = &cdev_test_ops
};static int chardev_init(void){int ret;     //返回值判断ret = misc_register(&misc_dev);     //注册杂项设备if (ret < 0){printk("misc_register failed\r\n");}printk("misc_register ok\r\n");return 0;
}static void chardev_exit(void){misc_deregister(&misc_dev);  //卸载杂项设备printk("chardev_exit!\n");
}module_init(chardev_init);
module_exit(chardev_exit);MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("ZSY");
MODULE_VERSION("V1.0");




http://www.ppmy.cn/news/1428449.html

相关文章

Spring MVC 国际化

文章目录 国际化基本概念指明&#xff08;并加载&#xff09;资源文件获得 Locale 对象AcceptHeaderLocaleResolverSessionLocaleResolverCookieLocaleResolver 修改 Locale 信息非常规办法常规办法&#xff1a; LocaleChangeInterceptor 拦截器 国际化 基本概念 国际化 是开…

4月21敲一篇猜数字游戏,封装函数,void,无限循环,快去体验体验

今天敲一篇猜数字游戏 目录 今天敲一篇猜数字游戏 1.打开先学goto语句&#xff1a; 2.开干&#xff1a; 首次我们学习随机数&#xff1a; 讲解一下&#xff1a; 改用srand; 加入时间变量&#xff1a; 获取时间&#xff1a;哈​编辑 3.我本来想已近够完美了&#xff0…

【Python基础】MySQL

文章目录 [toc]创建数据库创建数据表数据插入数据查询数据更新 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 创建数据库 import pymysqldef create_database():db pymysql.connect(hostlocalhost, userroot, passwordr…

程序员的成长之路与未来展望

目录 一、可能的收获和体会&#xff1a; 1. 技术技能的增长&#xff1a; 2. 问题解决能力&#xff1a; 3. 持续学习的习惯&#xff1a; 4. 团队合作的经验&#xff1a; 5. 时间管理和组织能力&#xff1a; 6. 面对压力的能力&#xff1a; 7. 理解不同文化的能力&#xf…

【架构-12】JWT和Token

什么是Token? Token的目的是为了减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。 Token是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便将此Token返回给客…

【算法刷题day29】Leetcode:491. 非递减子序列、46. 全排列、47. 全排列 II

文章目录 Leetcode 491. 非递减子序列解题思路代码总结 Leetcode 46. 全排列解题思路代码总结 Leetcode 47. 全排列 II解题思路代码总结 草稿图网站 java的Deque Leetcode 491. 非递减子序列 题目&#xff1a;491. 非递减子序列 解析&#xff1a;代码随想录解析 解题思路 大题…

头歌实训作业答案c++

由于“头歌实训作业答案C”这个表述可能指的是某个特定课程或机构的C编程作业答案&#xff0c;通常这类作业答案不会公开分享&#xff0c;因为这涉及到版权和学术诚信的问题。但我可以提供一些C编程的通用指导和资源&#xff0c;帮助你完成实训作业。 ### C编程基础 1. **变量…

07-ESP timer

ESP32-S3 ESPTIMER 介绍 ESP Timer是ESP32-S3的一个强大功能&#xff0c;它允许创建软件定时器并在超时时调用它们的回调函数。这对于需要执行延迟或周期性操作的用户软件非常有用&#xff0c;例如延迟设备启动/停止或周期性采样传感器数据。 对于需要较好实时性能&#xff…