嵌入式系统 第九讲 设备驱动程序设计基础

• 9.1 Linux设备驱动程序简介

• 系统调用:是操作系统内核(Linux系统内核)和应用程序之间 的接口。

• 设备驱动程序:是操作系统内核(Linux系统内核)和机器硬件 之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,在 应用程序看来,硬件设备只是一个设备文件,应用程序可以向 操作普通文件一样对硬件设备进行操作。

• 设备驱动程序是内核的一部分,完成以下功能:

① 对设备的初始化和释放;

② 把数据从内核传送到硬件,和从硬件读取数据到内核;

③ 读取应用程序传送给设备文件的数据,和回送应用程序请求 的数据;这需要在用户空间、内核空间、总线以及外设之间 传输数据;

④ 检测和处理设备出现的错误。

• 设备驱动程序与应用程序的区别:

① 应用程序一般有一个main函数,从头到尾执行一个任务。

② 设备驱动程序却不同,它没有main函数,通过使用宏module_init(),将 初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱 动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等 待被应用软件调用;驱动程序中有一个宏module_exit()注册退出处理 函数,它在驱动退出时被调用。

③ 应用程序可以和GLIBC 库连接,因此可以包含标准的头文件,比如<stdio.h>、<stdlib.h>。

④ 在设备驱动程序中是不能使用标准C 库的,因此不能调用所有的C 库函 数,比如输出打印函数只能使用内核的printk函数,包含的头文件只能 是内核的头文件,比如<linux/module.h>。

• Linux 的设备驱动程序开发调试有两种方法:

① 一种是直接编译到内核,再运行新的内核来测试

② 二是编译为模块的形式,单独加载运行调试。

• 第一种方法(直接编译到内核)效率较低,但在某些场合是唯 一的方法。

• 第二种方式(编译为模块——模块方式)调试效率很高,它使 用insmod命令将编译的模块直接插入内核;如果出现故障,可 以使用rmmod命令从内核中卸载模块;不需要重新启动内核, 这使驱动调试效率大大提高。lsmod命令为查看模块。 insmod character.ko   rmmodcharacter

• 9.1.1 设备的分类

– 字符设备:无须缓冲直接读写的设备,如串口等设备。

– 块设备:通过缓冲区进行(缓冲区通常为系统内存), 只能以块为单位进行读写,块大小可以是512B或1024B, 如硬盘等设备。

– 网络设备:可以通过BSD套接口访问。

BSD(Berkeley Software Distribution,伯克利软件套件)是Unix的 衍生系统,在1977至1995年间由加州大学伯克利分校开发和发布的。

• 9.1.2 设备文件

– Linux抽象了对硬件的处理,所有的硬件设备都可以作为普通文件一样对 待,可以使用标准的系统调用接口来完成对设备的打开(open)、关闭 (close)、读写(read、write)和I/O控制操作(ioctl),驱动程序的主 要任务是实现这些系统调用函数。

• fd= open(/dev/character_device, O_RDWR);//打开设备文件

• close(fd);//关闭设备文件

• ret = write(fd,"APP test",8);//写操作

• ret = read(fd, buf, 5);//读操作

• ret = ioctl(fd,'a',0); //ioctl 操作

– Linux系统中所有的硬件设备都使用一个特殊的设备文件(设备名)来表 示,如:

• 基于GPIO的LED灯:/dev/leds_ctl

• 蜂鸣器:/dev/buzzer_ctl

• 按键:/dev/farsight_keys

• 直流电机:/dev/dc_motor

– 对用户来说,设备文件和普通文件并无区别

– 查看设备文件命令:ls -l /de

• 9.1.3 主设备号和次设备号

– 主设备号:标识该设备的种类,也标识了该设备所使用的驱动程序,主设备号在/proc/devices文件中查看

• 查看主设备号命令:cat /proc/devices

– 次设备号:标识使用同一设备驱动程序的不同硬件设备

– 创建设备文件的命令:mknod /dev/lp0 c 6 0

• /dev/lp0:设备名

• c:表示字符设备(b:表示块设备)

• 6:主设备号

• 0:次设备号

• 9.1.4 Linux设备驱动代码的分布

– 实验箱的所有设备驱动位于Ubuntu的: /home/linux/workdir/fs3399/system/kernel/drivers/目录下

• char:字符设备驱动

• block:块设备驱动

• pci:PCI驱动

• scsi:SCSI驱动

• net:网络驱动

• 9.1.5 Linux设备驱动程序的特点

① 内核代码:设备驱动是内核代码的一部分

② 内核接口:设备驱动必须为Linux内核提供一个标准接口。

③ 内核机制与服务:设备驱动可以使用标准的内核服务,如内存 分配、中断和等待队列等。

④ 可加载:可以在需要的时候加载到内核(insmod),在不需要 的时候从内核中卸载(rmmod)。

⑤ 可配置:设备驱动程序可以集成为内核的一部分,在编译内核 时,可以选择把哪些驱动程序直接集成到内核里。

⑥ 动态性:系统启动或设备驱动初始化后,驱动程序将维护其控 制的设备,即使该设备不存在,也不会影响整个系统的运行。

• 9.2 设备驱动程序结构

• Linux设备驱动程序与外界的接口分为以下三部分:

驱动程序与Linux操作系统内核的接口

② 驱动程序与系统引导的接口

③ 驱动程序与设备的接口

• Linux设备驱动程序的代码结构包括:

① 驱动程序的注册与注销

② 设备的打开与释放

③ 设备的读写操作

④ 设备的控制操作

⑤ 设备的中断和轮询处理

• 9.2.1 驱动程序的注册与注销

– 注册:赋予设备一个主设备号

• 字符设备(chr):register_chrdev_region()函数

– 例如:retval= register_chrdev_region(devt,1,DRVNAME);

• 块设备(blk):register_blkdev_region()函数

– 注销:释放占用的主设备号

• 字符设备:unregister_chrdev_region()函数

– 例如:unregister_chrdev_region(devnum,1);

• 块设备:unregister_blkdev_region()函数

• 9.2.2 设备的打开与释放

– file_operations结构体:设备文件操作结构体

– 设备的打开:通过调用file_operations结构体中的open()函数完成

• 例如:fd= open(“/dev/dc_motor”, O_RDWR); //打开直流电机

– 设备的释放(关闭):通过调用file_operations结构体中的release()函数 完成(有时也称为close()函数)

• 例如:close(fd); //关闭直流电机

• 9.2.3 设备的读写操作

– 设备的读操作:通过调用file_operations结构体中的read()函数完成

• 字符设备:read()函数

– 例如:ret = read(fd, buf, 5);

• 块设备:block_read() //字符设备character的读操作

– 设备的写操作:通过调用file_operations结构体中的write()函数完成

• 字符设备:write()函数

– 例如:ret = write(fd,"APP test",8);

• 块设备:block_write()函数

• 9.2.4 设备的控制操作

• 设备的控制操作:通过调用file_operations结构体中的ioctl()函数 完成

• 例如,使RS-485处于发送模式或接收模式:

• ret = ioctl(fd,'a',0);         //字符设备character的ioctl操作

• ret = ioctl(fd,'b',0);         //字符设备character的ioctl操作

• 9.2.5 设备的轮询和中断处理

– 轮询方式(查询方式):对于不支持中断的硬件设备,读写时需 要轮流查询设备状态,以便决定是否继续进行数据传输

• 轮询设备驱动可以通过使用系统定时器,使内核周期性的调用设备 驱动中的某个例程来检查设备状态

– 中断方式:内核负责把硬件产生的中断传递给相应的设备驱动

• 在/proc/interrupts文件中可以看到设备驱动所对应的中断号及类型

• 查询中断号的命令:cat /proc/interrupts

• 9.3 Linux内核设备模型

• 9.3.1 设备模型建立的目的

– 内核设备模型是为了适应系统拓扑结构越来越复杂,对电源管理、 热插拔支持要求越来越高等形势下开发的全新的设备模型,它采 用sysfs文件系统,其作用是将系统中的设备组织层次结构,然 后向用户程序提供内核数据结构信息

– 设备模型提供独立的机制表示设备,并表示其在系统中的拓扑结 构

• 9.3.2 sysfs——设备拓扑结构的文件系统表 现

–将设备结构树导出为一个文件系统,即sysfs文件系统,sysfs文件 系统挂载在“/sys”目录下

–“/sys/devices”目录将设备模型导出到用户空间,其目录结构就 是系统中实际的设备拓扑结构

• 9.3.3 驱动模型和sysfs

– Linux 设备驱动模型的基本元素是:

① 总线类型(总线结构):bus ,位于/sys/bus

② 设备(设备结构):devices ,位于/sys/devices

③ 设备类别(设备类结构):class,位于/sys/class

④ 设备驱动(驱动结构):drivers ,例如,USB设备的驱动位于 /sys/bus/usb/drivers

• 9.3.4 platform总线

– platform总线(平台总线)是Linux内核中的一个虚拟总线,使设 备的管理更加简单化,目前大部分的驱动都是用platform总线来 写的。

– platform总线分为以下几个部分:

① platform_bus ② platform_device ③ platform_driver

• 9.4 内存映射和管理

• 9.4.1 物理地址映射到虚拟地址

– 在内核中访问I/O内存(I/O与内存统一编制访问I/O就像访问内 存一样)之前,我们只有I/O内存的物理地址,这样是无法通过软 件直接访问的,需要首先用ioremap()函数将设备所处的物理地址 映射到内核虚拟地址空间(3GB~4GB),然后,才能根据映射所 得到的内核虚拟地址范围,通过访问指令访问这些I/O内存资源。

        • void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)

                – phys_addr:要映射的起始I/O地址

                – size:要映射的空间的大小

                – flags:要映射的I/O空间的和权限有关

• 9.4.2 内核空间映射到用户空间

– 使用mmap系统调用,可以将内核空间的地址映射到用户空间

        • void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);

        • int(* mmap)(structfile*filp, struct vm_area_struct *vma);

                – 查看设备内存是如何映射的:cat /proc/iomem

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法学习(19)—— 队列与 BFS

关于bfs bfs又称宽搜&#xff0c;全称是“宽度优先遍历”&#xff0c;然后就是关于bfs的三个说法&#xff1a;“宽度优先搜索”&#xff0c;“宽度优先遍历”&#xff0c;“层序遍历”&#xff0c;这三个都是同一个东西&#xff0c;前面我们介绍了大量的深度优先遍历的题目已经…

cellphoneDB进行CCI以及可视化

除了cellchat&#xff0c;在单细胞转录组或者空间组的分析中&#xff0c;cellphoneDB也是一个常用的细胞通讯软件&#xff0c;这个数据库更注重配受体关系&#xff0c;对于有明确先验知识的配受体研究比较友好。 但值得注意的是&#xff0c;它的数据库只包括人的基因名称信息&…

003 字节码

字节码的位置 当我们讨论到字节码&#xff0c;我们需要清楚它在整个学习框架中的位置 如图&#xff0c;字节码是我们写的代码编译之后的结果&#xff0c;与虚拟机很近。 字节码是Java能实现跨平台的基础。 字节码基本知识体系 我们需要关注的点在于class文件的构成上。 字节…

基本算法——回归

本节将通过分析能源效率数据集&#xff08;Tsanas和Xifara&#xff0c;2012&#xff09;学习基本的回归算法。我们将基 于建筑的结构特点&#xff08;比如表面、墙体与屋顶面积、高度、紧凑度&#xff09;研究它们的加热与冷却负载要 求。研究者使用一个模拟器设计了12种不…

U盘文件剪切丢失的全方位解析与恢复指南

一、U盘文件剪切丢失现象描述 在日常使用U盘的过程中&#xff0c;我们时常会遇到需要将文件从一个位置移动到另一个位置的情况&#xff0c;而剪切加粘贴便是最常用的操作之一。然而&#xff0c;有时在剪切文件后&#xff0c;却意外发现目标位置并没有出现这些文件&#xff0c;…

洛谷 P1075 [NOIP2012 普及组] 质因数分解 C语言

题目&#xff1a; P1075 [NOIP2012 普及组] 质因数分解 - 洛谷 | 计算机科学教育新生态 题目描述 已知正整数 n 是两个不同的质数的乘积&#xff0c;试求出两者中较大的那个质数。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数 p&#xff0c;即较大的那个质数。…

Lecture 17

10’s Complement Representation 主要内容&#xff1a; 1. 10’s 补码表示: • 10’s 补码表示法需要指定表示的数字位数&#xff08;用 n 表示&#xff09;。 • 表示的数字取决于 n 的位数&#xff0c;这会影响具体数值的解释。 2. 举例: • 如果采用 3 位补码&…

电子电器架构 --- 智能座舱HUD技术革新

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

零基础微信小程序开发——全局配置之tabBar(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型

1 什么是RNN模型 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出. 一般单层神经网络结构: RNN单层网络结构: 以时间步对RNN进行展开后的单层网络结构: RNN的…

Xilinx PCIe高速接口入门实战(三)

引言&#xff1a;为保证FPGA设备可以连接并被系统识别&#xff0c;本节讨论了PCIe基础规范和PCIe板卡电气规范的对FPGA配置时间具体要求。 1. 配置访问时间 在PCIe的标准系统中&#xff0c;当系统通电时&#xff0c;处理器上运行的配置软件开始扫描PCIe总线以发现机器拓扑。…

InfoNCE Loss详解(上)

引言 InfoNCE对比学习损失是学习句嵌入绕不开的知识点&#xff0c;本文就从头开始来探讨一下它是怎么来的。 先验知识 数学期望与大数定律 期望(expectation&#xff0c;expected value&#xff0c;数学期望&#xff0c;mathematical expectation)是随机变量的平均值&#…

抽象工厂设计模式的理解和实践

在软件开发中&#xff0c;设计模式是前人通过大量实践总结出的、可复用的、解决特定问题的设计方案。它们为我们提供了一种标准化的解决方案&#xff0c;使得代码更加简洁、灵活和易于维护。在众多设计模式中&#xff0c;抽象工厂模式&#xff08;Abstract Factory Pattern&…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 随着科技的飞速发展&#xff0c;工业 4.0 浪潮正席卷全球制造业&#xff0c;而机器学习作为这一变革中的关键技术&#xff0c;正以前…

全面了解 SQL Server:功能、优势与最佳实践

SQL Server 是微软公司推出的一款关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于企业级数据存储、数据分析、应用开发等领域。作为全球最受欢迎的数据库管理系统之一&#xff0c;SQL Server 提供了强大的功能和工具&#xff0c;支持从小型应用到大型…

旅游管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

攻防世界 robots

开启场景 根据提示访问/robots.txt&#xff0c;发现了 f1ag_1s_h3re.php 拼接访问 /f1ag_1s_h3re.php 发现了 flag cyberpeace{d8b7025ed93ed79d44f64e94f2527a17}

离线语音识别+青云客语音机器人(幼儿园级别教程)

1、使用步骤 确保已安装以下库&#xff1a; pip install vosk sounddevice requests pyttsx3 2、下载 Vosk 模型&#xff1a; 下载适合的中文模型&#xff0c;如 vosk-model-small-cn-0.22。 下载地址&#xff1a; https://alphacephei.com/vosk/models 将模型解压后放置在…