当前位置: 首页 > news >正文

驱动代码编写(一)

驱动程序的作用

驱动程序是指与硬件设备和操作系统进行通信的软件。它的主要功能有以下几个方面:

  1. 提供硬件支持:驱动程序允许操作系统与硬件设备进行通信,以便正确地操作和控制硬件设备。它可以向操作系统提供有关硬件设备的各种信息,如设备类型、特性和功能。

  2. 硬件操作与控制:驱动程序可以向硬件设备发送指令和控制信号,以执行特定的操作和控制。例如,打印机驱动程序可以向打印机发送打印任务,并控制打印机的打印速度、纸张尺寸等。

  3. 设备管理:驱动程序可以提供设备管理功能,例如检测和识别新连接的设备,配置设备参数和设置选项,以及与其他设备进行协调和通信。

  4. 系统性能优化:驱动程序可以通过优化硬件设备的操作和与操作系统的通信来提高系统性能。它可以提供更高效的数据传输、更低的延迟和更好的资源利用。

  5. 错误处理和故障排除:驱动程序可以检测和处理硬件设备的错误和故障,并提供相应的错误处理和故障排除功能。它可以显示错误信息、尝试修复问题或建议用户采取适当的措施。

总的来说,驱动程序的功能是使操作系统能够与硬件设备进行有效的通信和控制,以便实现各种设备操作和管理功能,并提供系统性能优化和故障排除等服务。

驱动的框架

 入口(安装):资源的申请

出口(卸载):资源的释放

许可证GPLLinux系统是开源的,写一个模块需要开源,所以需要写许可协议

Linux内核许可规则 — The Linux Kernel documentationicon-default.png?t=N7T8https://docs.kernel.org/6.2/translations/zh_CN/process/license-rules.html

驱动代码框架

#include <linux/init.h>
#include <linux/module.h>//申请资源
//static - 限定作用域,延长生命周期
//存储类型 数据类型 指定存放内存区域 函数名(形参)
static int __init hello_init(void)
{return 0;
}//释放资源
static void __exit hello_exit(void)
{
}module_init(hello_init);    //入口:申请资源   本质-回调一个自己写的函数
module_exit(hello_exit);    //出口:释放资源
MODULE_LICENSE("GPL");      //许可证:公共许可协议(开源协议)

注释

module_init(X):入口;X为自己写的函数的函数名

它的作用是申请资源,也就是说,当你执行安装驱动的时候,他会立马执行你写的init函数中的相关功能。

module_exit(X):出口;X为自己写的函数的函数名

它的作用是释放资源,即当你卸载驱动的时候,会执行自己写的exit函数内的功能。

static: 限制作用域

因为在内核里面会有很多个驱动,驱动名字可能会有重复的,那么你在安装的时候就可能出现错误,他识别不到你到底是哪一个申请资源的函数,所有需要用static限制一下函数的作用域,让他只能在当前文件中使用。

__init :申请资源的区域

__exit :释放资源的区域

驱动Makefile的编写

驱动代码的编译需要依赖于内核,本质上你想把.c文件编译成一个驱动代码,使用的是make modules命令,但make modules是在内核的顶层路径下面去执行的,在下层文件中的.c想要编译就需要写一个自己的Makefile来编译生成驱动模块。

驱动Makefile代码

KERNELDIR = /home/linux/kernel/kernel-3.4.39	#写自己的开发板内核路径
#KERNELDIR = /lib/modules/$(shell uname -r)/build	#PC机内核路径(尽量不要用,使用不当可能导致linux崩溃)PWD = $(shell pwd)    #驱动文件的路径all:make -C $(KERNELDIR) M=$(PWD) modules.PHONY:clean
clean:make -C $(KERNELDIR) M=$(PWD) cleanobj-m += hello.o

代码讲解   

这段代码的作用是基于内核框架将驱动代码编译生成驱动模块,需要在内核的顶层目录下执行 make modules

-C:指定到哪个路径下执行这个命令(KERNELDIR中存放顶层路径)

M:赋值,要将哪个路径下的驱动文件编译生成驱动模块(使用shell pwd命令获取当前路径)

注:进入内核目录下执行make modules这条命令,如果不指定 M=$(PWD) 会把内核目录下的.c文件编译生成.ko 

obj-m:功能是生成一个hello.ko 的模块

示例

代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>static int __init hello_init(void)
{printk("hello world\n");printk(KERN_CRIT "%s %s %d\n",__FILE__,__func__,__LINE__);return 0;
}
static void __exit hello_exit(void)
{printk("baibai le ninlei \n");printk(KERN_CRIT "%s %s %d\n",__FILE__,__func__,__LINE__);}module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

 运行结果:

相关文章:

驱动代码编写(一)

驱动程序的作用 驱动程序是指与硬件设备和操作系统进行通信的软件。它的主要功能有以下几个方面&#xff1a; 提供硬件支持&#xff1a;驱动程序允许操作系统与硬件设备进行通信&#xff0c;以便正确地操作和控制硬件设备。它可以向操作系统提供有关硬件设备的各种信息&#x…...

Prompt-to-Prompt Image Editing with Cross Attention Control

Prompt-to-Prompt Image Editing with Cross Attention Control (P2P) Amir Hertz, Tel Aviv University, ICLR23, Paper, Code 1. 前言 编辑对这些生成模型来说是具有挑战性的&#xff0c;因为编辑技术的一个固有特性是保留大部分原始图像&#xff0c;而在基于文本的模型中…...

实验11 OSPF协议配置

实验11 OSPF协议配置 一、OSPF单区域配置&#xff08;一&#xff09;原理描述&#xff08;二&#xff09;实验目的&#xff08;三&#xff09;实验内容&#xff08;四&#xff09;实验配置&#xff08;五&#xff09;实验步骤 二、OSPF多区域配置&#xff08;一&#xff09;原理…...

ChatGPT-4o, 腾讯元宝,通义千问对比测试中文文化

国内的大模型应用我选择了国内综合实力最强的两个&#xff0c;一个是腾讯元宝&#xff0c;一个是通义千问。其它的豆包&#xff0c;Kimi&#xff0c;文心一言等在某些领域也有强于竞品的表现。 问一个中文文化比较基础的问题,我满以为中文文化chatGPT不如国内的大模型。可事实…...

node.js学习

node.js学习实操及笔记 温故node.js&#xff0c;node.js学习实操过程及笔记~ node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记 为什么学node.js 可以让别人访问我们编写的网页为后续的框架学习打下基础&#xff0c;三大框架vue react angular离不开node.js …...

python将一个图片雕刻镂空成二维码

本文使用创作助手。 要将一个图片雕刻镂空成二维码&#xff0c;你可以使用Python中的Pillow库来处理图像&#xff0c;并使用qrcode库来生成二维码。以下是一个示例代码&#xff0c;用于将图片雕刻镂空成二维码&#xff1a; import qrcode from PIL import Image# 打开待处理的…...

OS进程取样器OS Process Sampler执行CMD/Shell命令

Apache JMeter - Users Manual: Component Reference 1.背景 项目上最近需要测试一种很少用到的DICOM协议,但是网上资料很少,基本上可以总结为三种方案: 直接发送TCP 16进制数据包,但是参数化数据准备难度大通过开发封装jar包发送,需要开发组提供通过发送cmd命令给前置机…...

excel两个数据表格,怎样实现筛选的联动?

如图&#xff0c;想要通过处理器或者像素条件进行筛选&#xff0c;形成一个右边图2的对比表&#xff0c;如何实现实现联动显示呢&#xff1f; 这个在excel里可以借用数据透视表切片器来完成。步骤如下&#xff1a; 1.添加表 选中数据区域中任意一个单元格&#xff0c;点击 插…...

python,django好的get和post请求

获得get请求 df request.GET.get("dades")获得post请求 文件settings.py关闭csrf MIDDLEWARE [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middleware.common.CommonMiddleware’…...

volatile的用法

目录 前言 使用volatile的注意事项&#xff1a; 示例&#xff1a; 总结&#xff1a; 前言 在嵌入式C编程中&#xff0c;volatile是一个关键字&#xff0c;它用于告知编译器被修饰的变量可能会在程序的任何地方、任何时候被不可预见的、非程序本身控制的因素所改变。这通常…...

MySQL 与 PostgreSQL 关键对比二(SQL语法)

目录 1 详细示例 1.1自动增量列 1.2 字符串连接 1.3 JSON 支持 2 总结 MySQL 和 PostgreSQL 是两种流行的开源关系数据库管理系统&#xff08;RDBMS&#xff09;。尽管它们在许多方面相似&#xff0c;但在 SQL 语法和功能上存在一些显著差异。 以下SQL语句的执行如果需要开…...

徐州服务器租用该如何维护?

服务器能够帮助企业处理网络上大部分的数据和信息&#xff0c;在互联网行业中起着十分重要的作用&#xff0c;服务器的存在能够保障网站稳定的运行&#xff0c;主要是由内存、硬盘和处理器等组成&#xff0c;服务器除了进行正常的工作运行&#xff0c;还需要定期维护和管理&…...

C++习题精选(4)—— 栈

目录 1. 最小栈2. 栈的压入弹出序列3. 逆波兰表达式求值 1. 最小栈 题目描述&#xff1a;设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素…...

Web前端ES6-ES13笔记合集(下)

#### 五.ES10新特性 ##### 1. Object.fromEntries > Object.fromEntries()方法允许你轻松地将键值对列表转换为对象 js const arr [["name", "kerwin"], ["age", 100]]; console.log(Object.fromEntries(arr))//{name: kerwin, age: 100} …...

我要成为算法高手-双指针篇

目录 什么是双指针?问题1&#xff1a;移动零问题2&#xff1a;复写零问题3&#xff1a;快乐数问题4&#xff1a;盛最多水的容器问题5&#xff1a;有效三角形个数问题6&#xff1a;查找总价格和为目标值的两个商品(两数之和)问题7&#xff1a;三数之和问题8&#xff1a;四数之和…...

Fake news detection: A survey of graph neural network methods

abstract 各种社交网络的出现产生了大量的数据。捕获、区分和过滤真假新闻的有效方法变得越来越重要&#xff0c;特别是在 COVID-19 大流行爆发之后。本研究对假新闻检测系统的图神经网络 (GNN) 的现状和挑战进行了多方面、系统的回顾&#xff0c;并概述了使用 GNN 实现假新闻…...

HCIE认证,这些误区要避开

追求HCIE认证是许多网络工程师提升职业水平的选择之一。 然而&#xff0c;在这条备考之路上&#xff0c;存在不少误解可能会误导你的学习方向或影响你的备考效率。 了解并避开这些常见误区&#xff0c;将帮助你更有效地准备HCIE认证考试。 01 误区一&#xff1a;过分依赖题库 …...

主题切换之CSS文件篇

动态加载CSS: 利用HTML的标签&#xff0c;可以通过JavaScript动态改变其href属性来加载不同的CSS文件。这意味着我们可以在运行时切换整个页面的样式表&#xff0c;从而实现主题的变化。 分离样式: 将不同主题的样式分别放在不同的CSS文件中。例如&#xff0c;default_styles.…...

Vue进阶(八十八)前端测试工具介绍

文章目录 一、前言1.1 引入1.2 基础语法1.2.1 全局函数 describe 和 it1.2.2 断言 expect1.2.3 匹配器1.2.4 snapshot 快照1.2.5 测试用例覆盖率报告1.2.6 React Testing Library render1.2.7 screen1.2.8 查询函数1.2.9 waitFor1.2.10 fireEvent 和 userEvent 二、Jest 基本用…...

【录制,纯正人声】OBS录制软件,音频电流音,杂音解决办法,录制有噪声的解决办法

速度解决的方法 &#xff08;1&#xff09;用RNNoise去除噪声。RNNoise是一个开源的&#xff0c;效果不好的噪声去除器。使用方法就是点击滤镜&#xff0c;然后加噪声抑制RNNoise。【这方法不好用】 &#xff08;2&#xff09;用Krisp(https://krisp.ai/) 去除噪声。这个Kris…...

Django中drf动态过滤查询

Django中drf动态过滤查询 1、page.py 代码: from rest_framework.pagination import PageNumberPaginationclass UserPagination(PageNumberPagination):"""用户分页器"""page_size = 10 # 默认的页面数据数量page_query_param = page # 定…...

GTSAM | gtsam::PriorFactor

文章目录 概述一、定义介绍二、功能作用三、主要内容四、实例演示概述 本节介绍了GTSAM中的gtsam::PriorFactor类。 一、定义介绍 gtsam::PriorFactor 是 GTSAM(Graph-based Trajectory and Mapping)库中的一个类,用于定义先验因子。在因子图优化中,先验因子用于将一些变量…...

MMSegmentation改进:增加Kappa系数评价指数

将mmseg\evaluation\metrics\iou_metric.py文件中的内容替换成以下内容即可&#xff1a; 支持输出单类Kappa系数和平均Kappa系数。 使用方法&#xff1a;将dataset的config文件中&#xff1a;val_evaluator 添加mKappa&#xff0c;如 val_evaluator dict(typemmseg.IoUMetri…...

专栏【汇总】

专栏【汇总】 前言版权推荐专栏【汇总】付费 汇总置顶在读在学我的面试计算机重要课程java面试Java基础数据存储Java框架java提高计算机科学与技术课程算法杂项 最后 前言 2024-5-12 21:13:02 以下内容源自《【专栏】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此…...

成功解决IndexError: index 0 is out of bounds for axis 1 with size 0

成功解决IndexError: index 0 is out of bounds for axis 1 with size 0 &#x1f6e0;️ 成功解决IndexError: index 0 is out of bounds for axis 1 with size 0摘要引言正文内容&#xff08;详细介绍&#xff09;&#x1f914; 错误分析&#xff1a;为什么会发生IndexError&…...

C# MES通信从入门到精通(11)——C#如何使用Json字符串

前言 我们在开发上位机软件的过程中&#xff0c;经常需要和Mes系统进行数据交互&#xff0c;并且最常用的数据格式是Json&#xff0c;本文就是详细介绍Json格式的类型&#xff0c;以及我们在与mes系统进行交互时如何组织Json数据。 1、在C#中如何调用Json 在C#中调用Json相关…...

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句&#xff0c;主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时&#xff08;即试图插入的记录的键值已经存在于表中&#xff09;&#xff0c;此子句会触发一…...

perl use HTTP::Server::Simple 轻量级 http server

cpan -i HTTP::Server::Simple 返回&#xff1a;已是 up to date. 但是我在 D:\Strawberry\perl\site\lib\ 找不到 HTTP\Server 手工安装&#xff1a;下载 HTTP-Server-Simple-0.52.tar.gz 解压 tar zxvf HTTP-Server-Simple-0.52.tar.gz cd D:\perl\HTTP-Server-Simple-…...

【STM32】基于I2C协议的OLED显示(利用U82G库)

【STM32】基于I2C协议的OLED显示(利用U82G库) 文章目录 【STM32】基于I2C协议的OLED显示(利用U82G库)一、实验背景二、U8g2介绍&#xff08;一&#xff09;获取&#xff08;二&#xff09;简介 三、实践&#xff08;一&#xff09;CubexMX配置&#xff08;二&#xff09;U8g2配…...

掌握Python3输入输出:轻松实现用户交互、日志记录与数据处理

Python 是一门简洁且强大的编程语言&#xff0c;广泛应用于各个领域。在 Python 编程中&#xff0c;输入和输出是基本而重要的操作。无论是进行用户交互、记录日志信息&#xff0c;还是将计算结果输出到控制台或文件&#xff0c;掌握这些操作都是编写高效 Python 程序的关键。本…...

wordpress古腾堡编辑器如何使用/网络营销推广的方式

文章转载自&#xff1a;http://www.hack520.com/169.html RAID 技术相信大家都有接触过&#xff0c;尤其是服务器运维人员&#xff0c;RAID 概念很多&#xff0c;有时候会概念混淆。这篇文章为网络转载&#xff0c;写得相当不错&#xff0c;它对 RAID 技术的概念特征、基本原理…...

广州全面开放疫情政策/南昌seo优化

题意&#xff1a;告诉你数列中的一段数满足大于或小于不等式关系&#xff0c;让你求是不是存在这样一个数列。 思路&#xff1a;典型的差分约束的题。主要的步骤是这样的先建图后用SPFA算法判断存不存在负环。 SPFA算法的具体实现见我的《最短路算法总结》。下面讲一下如何建图…...

物联网对企业网站建设的要求/seo关键词分析

其中$module的功能是定位路径$type是后缀 $name是文件名menu_get_item($path,$router_item)$router_item 内部使用from path to router item转载于:https://www.cnblogs.com/qinqiu/p/4918071.html...

网页制作app软件/百度seo收录软件

以下转载自&#xff1a; 推荐&#xff01;国外程序员整理的Java资源大全中文版 https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言&#xff0c;并且也是世界上非常流行的编程语言。国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的…...

中国建设银行 网站登录/长沙网站关键词排名推广公司

Ribbon是一个基于Http和Tcp的客户端负载均衡器,他可以在通过客户端配置的ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。当Ribbon与Eureka联合使用时&#xff0c;Ribbon的服务清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写&#xff0c;扩展成从Eu…...

查看网站空间/网络优化app哪个好

文章目录Gin程序热加载1 项目热加载1.1 工具一&#xff1a;fresh1.2 工具二&#xff1a;codegangsta/gin1.3 工具三&#xff1a;bee1.4 补充Gin程序热加载 1 项目热加载 我们在Flask或者Django框架下开发都是支持实时加载的&#xff0c;当我们对代码进行修改时&#xff0c;程…...