字符设备驱动流程

字符设备驱动:

linux系统驱动程序分为三大类,字符设备驱动块设备驱动网络设备驱动。其中字符设备驱动是使用最多的一种,从点灯到llC,SPI,音频设备等的驱动都是字符设备驱动。块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如EMMC、NAND、SD卡和U盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备。网络设备驱动就更好理解了,就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。一个设备可以属手多种设备驱动类型,比如USB WIFI,由于其使用USB接口,所以属于字符设备,但是其又能上网,所以也属于网络设备驱动。

字符设备驱动简介:

字符设备是Linux驱动中最基本的一类设备驱动,字符设备就是—个—个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI、LCD等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

linux系统中万物皆文件,驱动程序加载后会在/dev目录下生成一个对应的文件,如/dev/led。应用程序就是先用open打开该文件,用write控制led的亮灭,用read读取led的亮灭,用完之后用close关闭该文件。
这里需要注意的是,应用程序运行在用户空间,驱动程序运行在内核空间。应用程序必须使用一个叫做“系统调用”的方法来实现从用户空间“陷入”到内核空间,这样才能实现对底层驱动的操作。一个open函数执行的过程如下

linux源码中字符设备驱动程序存放在driver/char目录下,我们也可以将我们自己的驱动程序保存在该目录下

1)写一个加载和卸载驱动:



16和17行分别用两个带参宏指出驱动程序初始 化入口点和退出入口点。

19、20表示该驱动程序遵守的协议和 驱动程序的编写者。

2)注册设备号

字符设备驱动程序 将来被linux加载的时候需要注册这个驱动程序。其实无论哪种 驱动程序,按照linux的做法在加载时都需要注册

int register_chrdev(unsigned int major, const char *name, 
const struct file_operations *fops);

参数:

1.unsigned int major:主设备号(一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的设备,注意:设置一个静态的主设备号,比如200。设置时一定要注意不能使 用已经用了的主设备号):使用cat /proc/devices命令即可查看

2.const char *name:你的驱动程序起一个名字

3.struct file_operations *fops:这是一个指向file_operations结构 体变量的指针,这个结构体里面的成员绝大多数都是函数的指针。如常用的

        ①  open 函数用于打开设备文件

        ② release 函数用于释放(关闭)设备文件,与应用程序中的 close 函数对应

        ③ read 函数用于读取设备文件

        ④ write 函数用于向设备文件写入(发送)数据

        ⑤ owner 拥有该结构体的模块的指针,一般设置为 THIS_MODULE

为了调用注册字符设备驱动 函数,不得不先准备一个file_operations结构体变量,而这个结 构体变量中必要的成员,必须提前准备几个函数。注意:使用copy_to_user函数把内核空间的数据拷贝到用户空间;

然后定义一个file_operations结构体变量,并将函数入口地址赋 值给各自的成员

以上就是字符驱动程序的编写,那如何编译呢?有两种方法

方法一:

第一种方法是告诉linux的Makefile我们添加了一个新的驱动程序, 这种方法需要我们的驱动源码就放在driver/char目录中

1)打开 drivers/char/Kconfig 文件并添加如下内容

Kconfig文件被称之为内核配置文件,这里我们添加了一个名为 FIRST_DRIVER的配置选项,该配置选项为三态的,所谓三态是 指将来的编译结果可以是模块可以直接编译进内核可以不编译default m是指默认编译成模块。最后那段是帮助文本。

2)运行make menuconfig,依次进入Device Driver- >Character devices;看到My first driver按空格切换选择’M’ ,编译成模块,以方便之后的调试

3)打开 drivers/char/Makefile并添加下面内容(需要在 Makefile 中把内核配置选项和真正的源代码联系起来)

4)之后在源码顶层目录下执行make modules就可以完成编译

· 编译完成之后在driver/char目录下可以找到一个名为 first_driver.ko文件,这个就是我们需要的驱动程序

· 将first_driver.ko通过nfs复制到开发板上,使用insmod xxx.ko命令 加载驱动程序

· 使用lsmod查看已经加载的驱动

· 使用rmmod xxx卸载驱动程序,注意不用加.ko

5)加载好驱动程序以后,查看一下/dev目录,这里并没有出现我们 所说的设备文件,这是因为目前我们的驱动程序还不能自动创 建设备文件;用手动的方法创建设备文件,命令为:

mknod [OPTIONS] NAME TYPE MAJOR MINOR

该命令中[OPTIONS]选项可不填;NAME就是/dev下的设备文件 名;TYPE是设备型号,这里是字符设备用c表示;MAJOR主设备 号;MINOR子设备号。

mknod /dev/first_device c 200 0

以后应用程序就是以文件 /dev/first作为入口点调用驱动程序的。

方法二:

将我们写好的驱动 源码放在任意一个文件夹内,如linux源码目录下的my_driver目录, 并在该目录下创建一个Makefile文件

 第1行:获得linux源码顶层目录,根据实际情况填写

 第2行:获得驱动源码所在目录

 第3行:定义目标文件并指定目标文件为模块形式

 第8行:具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作 目录切换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目 录,”make modules”命令中加入 M=dir 以后程序会自动到指定的 dir 目录中读取 模块的源码并将其编译为.ko 文件

 之后使用make命令编译同样得到xxx.ko文件,加载什么的操作就和之前一样了。

程序调用:

正如之前所提到的,驱动程序的调用是通过应用程序的文件IO 实现的。所以调用驱动程序就是编写一个简单的文件IO程序。在nfs/rootfs下。

使用下面这个命令进行交叉编译,生成一个.app的可执行文件

执行.app

这样字符驱动编写流程就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3015015.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…

超越传统游戏:生成式人工智能对游戏的变革性影响

人工智能(AI)在游戏中的应用 游戏产业是一个充满活力、不断发展的领域,人工智能(AI)的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…

【Java笔记】多线程:中断

线程中断的作用 线程中断可以使一个线程从等待状态变成就绪状态 使用线程中断,并不是要把线程给终止或是杀死,而是让线程不再继续等待,而是让线程不再继续等待,线程可以继续往下执行代码,线程发生中断后,会…

Linux网络编程(二) socket编程及其仿真

本节内容介绍Linux下进行网络编程所必须得socket接口的一些知识 一、socket地址函数 1.1、主机字节序和网络字节序 现代PC大多采用小端字节序,因此小端字节序又被称为主机字节序。 为了避免由于字节序导致的错误,发送端总是将字节序转换为大端字节序…

暖心又实用!母亲节教会妈妈这4招才是最贴心的礼物

母亲节就要到了,这个特殊的日子,我们总是想要为妈妈送上最真挚的祝福和关怀。在这个数字化时代,一部智能手机就能成为我们表达爱意的桥梁。今天,就让我们一起来看看华为手机的四个功能,让妈妈的手机使用体验更加便捷、…

C语言中的关键字static和extern

Hello,亲爱的小伙伴们,我又来了,上一期作者菌讲解了C语言中函数的知识点,得到了很好的反馈,这里作者菌感谢每一个至此我的小伙伴!!今天作者菌又来补充一些很有用的知识,感兴趣的uu们不要吝啬手中…

Jmeter 命令行压测 生成 HTML 测试报告,你真的会?

通常 Jmeter 的 GUI 模式仅用于调试,在实际的压测项目中,为了让压测机有更好的性能,多用 Jmeter 命令行来进行压测。 同时,JMeter 也支持生成 HTML 测试报告, 以便从测试计划中获得图表和统计信息。 以上定义的文件路…

Elementui的el-footer标签使用报错

Elementui的el-footer标签使用报错 其余标签的使用没有报错信息 el-footer的报错信息 原因: ​ 警告信息表示 Vue 不识别 <el-footer> 解决方式: 在组件中进行引入和暴露

Flume 的安装和使用方法

一、Flume的安装 1.下载压缩包 https://www.apache.org/dyn/closer.lua/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz 2.上传到linux中 3.解压安装包 cd #进入加载压缩包目录sudo tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /usr/local # 将 apache-flume-1.7.0-bin.tar.g…

119. 再谈接口幂等性

文章目录 0. 前言1. insert前先select2. 加悲观锁3. 加乐观锁5. 加唯一索引【配合 &#xff08;1. insert前先select &#xff09;最常用 】6. 建防重表6. 根据状态机7. 加分布式锁8. 获取token 0. 前言 在 93. 通用防重幂等设计 一文中&#xff0c;已经介绍过幂等的使用。该文…

力扣:63. 不同路径 II

63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么…

C# Web控件与数据感应之 BaseDataList 类

目录 关于数据感应 BaseDataList 类 范例运行环境 pageview 方法 设计 实现 调用示例 数据源 调用 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍以与数据库提取数据并捆绑控件…

CI522/CI523电动车NFC一键启动开发资料

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

UDP广播

1、UDP广播 1.1、广播的概念 广播&#xff1a;由一台主机向该主机所在子网内的所有主机发送数据的方式 例如 &#xff1a;192.168.3.103主机发送广播信息&#xff0c;则192.168.3.1~192.168.3.254所有主机都可以接收到数据 广播只能用UDP或原始IP实现&#xff0c;不能用TCP…

漏洞挖掘 | EDU证书站任意密码重置

1.前言&#xff1a; 挖了一段时间EDU老破小的站&#xff0c;也该拿证书站下手了。下手的第一个目标&#xff0c;那必然是漏洞排行榜第一的某交大&#xff01;&#xff01;&#xff01; 2.信息搜集 想快速挖到漏洞&#xff0c;必须信息搜集全面。如果信息搜集不到位不全面&…

明星中药企业系列洞察(二)丨百年御药同仁堂,为什么被称为我国最“硬”的老字号?

从最初的同仁堂药室、同仁堂药店到现在的北京同仁堂集团&#xff0c;经历了清王朝由强盛到衰弱、几次外敌入侵、军阀混战到新民主主义革命的历史沧桑&#xff0c;其所有制形式、企业性质、管理方式也都发生了根本性的变化&#xff0c;但同仁堂经历数代而不衰&#xff0c;在海内…

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 某城市有n个小镇&#xff0c;编号是1~n。由于贫穷和缺乏城市规划的人才&#xff0c;每个小镇有且仅有一段单向的公路通往别…

[Linux] GDB使用指南----包含CentOS7下安装以及使用

什么是GDB&#xff1f; GDB 是由 GUN 软件系统社区提供的调试工具&#xff0c;同 GCC 配套组成了一套完整的开发环境&#xff0c;GDB 是 Linux 和许多 类Unix系统的标准开发环境。可以用来调试C、C、Go、java、 objective-c、PHP等语言。 GDB的作用 程序启动时&#xff0c;可…