自动创建设备节点
在成功加载驱动模块之后,还需要使用 mknod命令创建设备节点,才能在/dev目录下创建对应的设备文件。自动创建设备节点的功能需要依赖 mdev 设备管理机制,在使用 buildroot 构建 rootfs 的时候,会默认构建 mdev 的功能,mdev 机制不做深究。对于驱动代码编写来说,一般在驱动注册成功后添加自动创建设备节点的相关代码。
class 类
首先需要创建一个 class 类,在Linux系统中,类是一个用于组织设备驱动程序的层次结构。每个设备都属于一个特定的类,而设备驱动程序则与类相关联。Linux系统中有许多预定义的类,每个类都有其特定的设备类型。其中一些常见的类包括:
/dev/tty:该类包含终端设备,例如控制台、串口、终端仿真器等。
/dev/input:该类包含输入设备,例如鼠标、键盘、触摸屏等。
/dev/sda:该类包含磁盘设备,例如硬盘、固态硬盘、U盘等。
/dev/video:该类包含视频设备,例如摄像头、视频采集卡等。
/dev/net:该类包含网络设备,例如以太网卡、无线网卡等。
类层次结构允许Linux系统在设备驱动程序之上建立更高层次的抽象,从而使不同类型的设备能够使用相同的接口和API。例如,一个应用程序可以使用统一的API来访问不同类型的输入设备,而不需要了解具体的设备类型或驱动程序实现。这提高了系统的可移植性和灵活性。
class 是个结构体,定义在文件 include/linux/device.h 中,宏 class_create用来创建一个类,内容如下
#define class_create(owner, name) \({ \static struct lock_class_key __key; \__class_create(owner, name, &__key); \})struct class *__class_create(struct module *owner, const char *name,struct lock_class_key *key)…
存在两个参数,解释如下:
owner 指向将拥有这个结构类的模块的指针,一般为 THIS_MODULE;
name 类名字
返回值是个指向结构体 class的指针,也就是创建的类。
驱动卸载的时候需要删除掉类,类的删除函数是 void class_destroy(struct class *cls),参数 cls 就指向要删除的类。
创建设备
创建完类之后,还需要在这个类下创建一个设备,使用 device_create 函数在指定类下创建设备device_create 函数在drivers/base/core.c中,原型如下:
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
可变参数函数,参数解释如下
class 设备要创建在哪个类下面
parent 父设备,一般为NULL
devt 设备号
drvdata 设备可能会使用的一些数据,一般为NULL
fmt 设备名字,如果设置fmt=xxx,就会创建/dev/xxx的设备文件
返回值为创建好的设备。
卸载驱动的时候需要删除device_create创建的设备,设备删除的函数为device_destroy,,函数原型如下:
void device_destroy(struct class *class, dev_t devt)
class 指向要删除的设备指针
devt 要删除的设备号
用法举例
static int __init chrdevTest_init(void)
{.../*创建 class 类*/g_ChrDevBase_t.class = class_create(THIS_MODULE, g_ChrDevBase_t.devName);if(g_ChrDevBase_t.class == NULL){printk("Created Class Failed\r\n");}else{printk("Created Class Success\r\n");}/*创建设备*/g_ChrDevBase_t.device = device_create(g_ChrDevBase_t.class, NULL,g_ChrDevBase_t.devid, NULL, DEVICE_NAME);if(g_ChrDevBase_t.device == NULL){printk("Created Device Failed\r\n");}else{printk("Created Device Success\r\n");}return 0;
}static void __exit chrdevTest_exit(void)
{...device_destroy(g_ChrDevBase_t.class, g_ChrDevBase_t.devid);class_destroy(g_ChrDevBase_t.class);printk("unregister\r\n");
}
相关文章:
自动创建设备节点
在成功加载驱动模块之后,还需要使用 mknod命令创建设备节点,才能在/dev目录下创建对应的设备文件。自动创建设备节点的功能需要依赖 mdev 设备管理机制,在使用 buildroot 构建 rootfs 的时候,会默认构建 mdev 的功能,m…...
JavaWeb ( 六 ) JSP
2.4.JSP JSP (Java Server Pages) : 一种在服务器端生成动态页面的技术,本质上就是Servlet。将HTML代码嵌入到Java代码中, 通过Java逻辑控制HTML代码的结构从而生成页面。在MVC中通常担任视图层(view),负责信息的展示与收集。 2…...
2023世界超高清视频产业发展大会博冠8K明星展品介绍
2023世界超高清视频产业发展大会博冠8K明星展品介绍: 一、博冠8K全画幅摄像机B1 这是一款面向广电应用的机型,可适配外场ENG制作轻量化需求,应用于8K单边机位、新闻、专题的拍摄工作,也可应用于体育转播、文艺节目等特殊机位及各…...
Map接口以及Collections工具类
文章目录 1.Map接口概述1.1 Map的实现类的结构1.2 Map中存储的key-value结构的理解1.3 HashMap的底层实现原理(以JDK7为例)1.4 Map接口的常用方法1.5 TreeMap1.6 Map实现类之五: Properties 1.Collections工具类1.1方法1.1.1 排序操作(均为static方法)1.1.2 查找、替换 1.Map接…...
SOA协议DDS和Some/IP对比
SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术,所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为:Scalable service-Oriented MiddlewarE over IP,是一种面向服务…...
Sass使用
前言: 这份记录,主要是记录学习sass的学习记录,用于记录一些本人认为可能以后会用到的比较常用的一些知识点,更详细的请看sass官网 功能1-嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的…...
超大excel文件读,避免内存溢出
excel40M,但是用传统的读取excel方法,会报内存溢出的错误。 所以采用了下面的方式,能解决此问题: maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><ve…...
第0章 学习之前的准备
突然想写点关于linux的东西,一是将自己几十年来零碎的知识作以串联,二是能为正在学习路上的新手作些指引。而恰好作者的孩子是一位初一的学生,我写的这些东西也正是我手把手教授他的,现在分享出来并且命名为《linux中学教程》&…...
数组排序sort()方法
sort() 方法对数组的项目进行排序。 排序顺序可以是按字母或数字,也可以是升序(向上)或降序(向下)。 默认情况下,sort() 方法将按字母和升序将值作为字符串进行排序。 一、语法 array.sort(compareFunct…...
【.NET AI Books 前言】Azure OpenAI Service 入门
本书是为 .NET 开发者而写的,让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中,作为开发者你可能将面临几种改变: GPT 模型到来后,如何去架构好企业解决方案…...
散列查找实验(开散列) 题目编号:583
题目描述 请设计一个整型开散列表,散列函数为除留余数法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,输出查找结果采用头插法。 输入描…...
Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...
Go type关键字定义新类型和类型别名的区别
type关键字再定义类型和类型别名有很大的区别,前者是新定义一个数据类型,后者是对类型的重命名。 type NewString stringtype OldString stringtype NewString string声明了一个NewString类型,和string具有完全一致的数据结构,确…...
Neural Network学习笔记2
torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…...
用@Value注解为bean的属性赋值
1.Value注解 Value注解的源码,如下所示 Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface Value {String value(); }从Value注解的源码中…...
拨云见日:深入理解 HTML 解析器与有限状态机
文章目录 参考描述状态机状态机有限状态机与无限状态机有限状态机与自动售货机无限状态机与计算器 HTML 解析器HTML 解析器HTML 与有限状态机 HTML 解析器的常见状态初始状态DOCTYPE 状态注释状态标签状态开始标签状态属性状态属性名状态属性值状态 结束标签状态自闭和标签状态…...
Java线程池及其实现原理
线程池概述 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机…...
进程替换函数组介绍exec*
目录 前述 execl execlp execle execv execvp execvpe 前述 介绍后缀的意义: l (list):表示参数采用列表。 v(vector):参数同数组表示。 p(path):自…...
欧科云链OKLink:2023年4月安全事件盘点
一、基本信息 2023年4月安全事件共造约6000万美金的损失,与上个月相比,损失金额有所降落,但安全事件数量依旧不减。其中,Yearn Finance因参数配置错误,导致了1000多万美金的损失。同时,有一些已经出现过的…...
KubeVirt备份与还原方案【翻译】
KubeVirt备份与还原方案【翻译】 ref:https://github.com/kubevirt/kubevirt/blob/main/docs/backup-restore-integration.md 备份 为所有必需的k8s资源构建依赖关系图冻结应用程序pvc数据快照解冻应用程序将所有必需的k8s资源定义拷贝到一个共享的存储位置(可选…...
使用PyQt5设计一款简单的计算器
目录 一、环境配置: 二、代码实现 三、主程序 四、总结 本文使用PyQt5设计一款简单的计算器,可以通过界面交互实现加减乘除的功能,希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。…...
Htop使用说明
目录 引言 什么是htop htop安装 htop界面介绍 htop功能介绍 引言 我们使用服务器的时候常常需要关注下自己的程序资源占用情况,htop就是一种互动式的进程查查看器,整齐用下来感觉比top的逼格高,造作可视化都更方便些,我觉得还…...
PostgreSQL Linux安装
安装依赖: sudo yum -y install readline-devel zlib-devel 安装Postgres: ssh hadoophadoop001 #下载Postgres wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz tar -zxvf postgresql-14.2.tar.gz -C /data #编译前准备 /dat…...
亚商投资顾问 早餐FM/0509车辆电动化
01/亚商投资顾问 早间导读 1.上交所拟于5月11日举办“发现央企投资价值,促进央企估值回归”交流会 2.监管部门十方面举措加强房地产经纪行业管理 3.广东:推动城市公共服务及货运配送车辆电动化替代 4.昆山两楼盘因大幅降价被暂停网签:降幅…...
AI绘画天花板——Midjourney注册使用保姆级教程(5月5日验证有效)
大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我,备注:aigc,拉你进群。 现在市面上AI绘图大概有三大阵营:Midjourney、Stable Diffusion,还有一个就是OpenAI实…...
学习笔记(2)项目结构描述 - manifest.json和pages.json
目录 1,manifest.json2,pages.json2.1,pages2.2,globalStyle2.3,tabBar 1,manifest.json 官方详情 uni-app 的 appid 由 DCloud 云端分配,主要用于 DCloud 相关的云服务,请勿自行修…...
vector、deque、list相关知识点
vector erase返回迭代器指向删除元素后的元素insert返回迭代器指插入的元素reserve只给容器底层开指定大小内存空间,并不添加新元素 deque 底层数据结构 动态开辟的二维数组,一维数组从2开始,以2倍方式扩容,每次扩容和&#x…...
多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比
多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比 目录 多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 多维时序 …...
设计模式——适配器模式(类适配器、对象适配器)
是什么? 我们平时的有线耳机接口分为USB的和Type-C的接口,但是手机的耳机插口却只有一个,像华为的耳机插口现在基本都是Type-c的,那如果我们现在只有USB接口的耳机怎么办呢,这个时候就需要使用到一个转换器,…...
iOS开发多target
场景 背景:设想一下有一个场景,一个业务分为多种身份,他们大部分功能是相同的,但是也有自己的差异性。这种情况,想要构建出不同身份的APP。你会怎么做??? 当然,你可以拷贝一份代码出来,给项目重新命名。这样做的好处是,他们互相不会冲突,不用去关心是否有逻辑的冲…...
wordpress tag 排序/网店运营流程步骤
文章目录函数式编程foreach遍历简化函数定义映射(map)扁平化映射(flatMap)过滤(filter)排序sorted(默认排序)sortBy(指定字段排序)sortWith(自定义…...
网站 建设ppt模板/关键词搜索排名工具
最近的工作我在做一个有关于消息发送和接受封装工作。大概流程是这样的,消息中间件是采用rabbitmq,为了保证消息的绝对无丢失,我们需要在发送和接受前对消息进行DB落地。在发送前我会先进行DB的插入,单表插入,所以在性…...
建设公司建站系统/seo搜索引擎优化薪资水平
SAP锁机制一、SAP为什么要设置锁: 1,保持数据的一致性 如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系 统中,需要检查还有没有空座位,当检查的时…...
谁给个国外的黄色网站/如何建立公司网站网页
作者 | CDA数据分析师来源 | CDA数据分析研究院本文涉及到的开发环境:操作系统 Windows 10数据库 MySQL 8.0Python 3.7.2 pip 19.0.3两种方法进行数据库的连接分别是PyMySQL和mysql.connector步骤:连接数据库生成游标对象执行SQL语句关闭游标关闭连接PyM…...
卫龙的网站做的污污分/it培训班出来工作有人要么
无论是大龄儿童,还是带娃的老母亲每次在宜家的儿童区带着嫌弃又难以抗拒的心情选了又选最终开开心心带走一个“丑娃娃”(口嫌体正直!)emmm,如果这还不算什么接着看!掉威亚的大象(怎么想的&#…...
坑梓网站建设咨询/新疆头条今日头条新闻
方法一:删除注册表选项,变为评估模式 1.windowR打开管理 2.输入regedit后回车,则就会打开注册表编辑器 3.里面有一个cacaheId然后删掉,果断的删掉,然后重新打开即可 方法二:删除动态库文件 4.找到Beyo…...