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

一、杂项设备驱动简介


在 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.mzph.cn/news/828392.shtml

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

相关文章

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Golang | Leetcode Golang题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; func rotate(matrix [][]int) {n : len(matrix)// 水平翻转for i : 0; i < n/2; i {matrix[i], matrix[n-1-i] matrix[n-1-i], matrix[i]}// 主对角线翻转for i : 0; i < n; i {for j : 0; j < i; j {matrix[i][j], matrix[j][i]…

Nuxt3项目如何通过开启ssr让网页实现seo自由!

nuxt.config开启ssr # nuxt.config.tsexport default defineNuxtConfig({// 是否开启SSRssr: true }) 终端运行 npm run generate generate 预渲染应用程序的每个路由&#xff0c;并将结果存储为纯HTML文件。 "scripts": {"generate": "nuxt genera…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段&#xff1a;创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说&#xff0c;发布版本的创建都需要一定的时间&#xff0c;其具体过程因各公司或组…

C++ Qt QMainWindow实现无边框窗口自定义标题栏可拖拽移动拉伸改变窗口大小

本篇博客介绍C Qt QMainWindow实现无边框窗口&#xff0c;适用于win10/win11系统。 QMainWindow相对于QWidget多了dockedwidget功能&#xff0c;跟多人可能更喜欢用QMainWindow做主窗口&#xff0c;如果不需要dockedwidget功能&#xff0c;QMainWindow与QWidget做主窗口基本无…

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

2024最新版JavaScript逆向爬虫教程-------基础篇之深入JavaScript运行原理以及内存管理

目录 一、JavaScript运行原理1.1 前端需要掌握的三大技术1.2 为什么要学习JavaScript1.3 浏览器的工作原理1.4 浏览器的内核1.5 浏览器渲染过程1.6 认识JavaScript引擎1.7 V8引擎以及JavaScript的执行过程1.8 V8引擎执行过程 二、JavaScript的执行过程2.1 初始化全局对象2.2 执…

【3】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 变量的类型 primitive 主数据引用 变量 primitive主…

OriginPro作图之箱线图

前言 箱线图(Box-plot) 又称为盒须图、盒式图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。 本文将结合实例阐述其意义和绘图过程。 箱线图简介 箱线图(Boxplot) 也称箱须图( Box-whisker Plot)&#xff0c;是利用数据中的五个统计量…

ffmpeg的安装以及使用

1.FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等。视频处理&#xff1a;FFmpeg 可以进行视频编码、解…

ArcGIS无法开始编辑TIN!开始编辑TIN显示灰色

ArcGIS无法开始编辑TIN&#xff01;开始编辑TIN显示灰色&#xff1f; 解决方案&#xff01; 1、确认自定义——扩展模块中空间分析、3D分析模块勾选。 2、确认以上后&#xff0c;还是不能编辑的话&#xff0c;我们可以调出 3D分析分析工具条&#xff0c;你就会发现。TIN编辑工…

Window + Ubuntu 双系统无Ubuntu Bios 启动项

文章目录 安装硬盘位置不重要&#xff01;&#xff01;&#xff01;&#xff08;但是我安装在了第二张HDD&#xff09;问题是多盘分位置会导致磁盘主分区变成了简单卷 Bios Ubuntu 启动项修复参考Ubuntu安装U盘进入Try Ubuntu 使用Terminal修复完提示Disable Secure Boot进入Te…

【存储】cosbench对象存储测试工具

目录 简略说明 原理 用法 详细说明 简介 用法 一 安装 二 简单验证 三 编写配置文件 四 提交配置文件下IO 五 测试结果查看 结果概览 查看详情 每秒钟的io情况查看 工作负载配置 参数配置&#xff08;controller和driver&#xff09; 查看错误的方法和错误记录 查看错误的方法 …

【匹配】匈牙利匹配算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 匈牙利匹配算法 1. 正文 1.1 基础概念 二分图 顶点分为两个集合&#xff0c;集合间顶点相连&#xff0c;集合内点不相连 匹配 一个匹配就是一个边的…

彻底解决SimpleDateFormat的线程不安全问题

重现SimpleDateFormat类的线程安全问题 在Java中&#xff0c;SimpleDateFormat是一个非常常用的类&#xff0c;它用于将日期转换成需要的格式或者将文本日期转换为Date对象。然而&#xff0c;在多线程环境下使用SimpleDateFormat可能会遇到一些意想不到的问题。下面通过一个例…

CentOS7配置NFS文件共享

环境准备 准备3个linux服务器&#xff1a; 192.168.137.120&#xff08;nfs server端&#xff09; 192.168.137.121 192.168.137.122 安装nfs-utils工具 # 在3个节点上都执行 yum install nfs-utils -y服务端配置 # 在120上执行 systemctl enable nfs-server systemctl sta…

Oracle Linux 8.8 一键安装 Oracle 11GR2 RAC(231017)

前言 Oracle 一键安装脚本&#xff0c;演示 Oracle Linux 8.8 一键安装 Oracle 11GR2 RAC&#xff08;231017&#xff09;过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&…

Scala OOP

前序 1、Scala 为纯粹OOP1.1、不支持基本类型&#xff1a;一切皆为对象 Byte,Int,... 1.2、不支持静态关键字&#xff1a;static1.3、支持类型推断&#xff0c;和类型预定&#xff0c;动静结合 类 /*关键字&#xff1a;class创建对象&#xff1a;new内含&#xff1a;成员变量…

linux下查看网络路由信息,找到请求过多的IP

netstat -nat|awk {print} |awk -F : {print$1} |sort|uniq -c |sort -n 命令netstat -nat|awk {print} |awk -F : {print$1} |sort|uniq -c |sort -n是用于分析网络连接状态的管道命令序列。下面逐个解释每个命令及其作用&#xff1a; netstat -nat: netstat 是一个用于显示…