嵌入式Linux设备驱动程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用mknod命令可以创建指定类型的设备文 件,同时为其分配相应的主设备号和次设备 号。
[root@xsbase root]# mknod /dev/lp0 c 6 0
7
第十章 Agenda
10.1 10.2 10.3 10.4 Linux的设备介绍 Linux设备驱动程序介绍 Linux的设备驱动程序的模块结构 Linux的设备驱动程序的编写举例
4
10.1.2 设备文件
Linux抽象了对硬件的处理,所有的硬件设 备都可以作为普通文件来看待;它们可以使 用和操作系统相同的、标准的系统调用接口 来打开、关闭、读写和控制I/O的操作,而 驱动程序的主要任务也就是要实现这些系统 调用函数。
wk.baidu.com
5
设备文件
Linux系统中的所有硬件设备都使用一个特 殊的设备文件来表示
20
主要接口函数
bytedevice_open,bytedevice_release:主要 是对设备进行初始化和释放,实现了设备的打开和 关闭功能。 bytedevice_read:当设备文件执行该函数调用 时,表面上看像时从设备中读取数据,实际上是从 内核空间的数据队列中读取,通过copy_to_user() copy_to_user() 函数,把数据从内核空间传送到用户空间,使得用 户空间的其他代码(测试代码)可以访问这些数据。 bytedevice_write:和bytedevice_read()函数 相似,只不过数据传送的方向发生了变化,即把参 数中的count字节数从用户空间的缓冲区buf复制 到硬件或者内核的缓冲区中。
13
第十章 Agenda
10.1 10.2 10.3 10.4 Linux的设备介绍 Linux设备驱动程序介绍 Linux的设备驱动程序的模块结构 Linux的设备驱动程序的编写举例
14
10.3 Linux的设备驱动程序的模块结构
Linux中的可加载模块(loadable module)是 Linux内核支持的动态可加载模块(dynamic loadable module),它们是内核的一部分,但是 并没有编译到内核里面去。 模块可以单独编译成目标代码,以.o的目标文件形 式存在。它可以根据需要在系统启动后动态加载到 系统内核之中。当模块不再被需要时,可以动态地 写在出系统内核。 Linux中地大多数设备驱动程序都以模块地形式存 在。
11
设备驱动的层次
输入/输出 请求 输入/输出 响应
用户程序的进程 (设备)文件系统
设备服务子程序 中断处理程序
设备驱动程序
物理设备控制器 物理设备
12
10.2.2 设备驱动程序与外界的接口
打开的设备在内核内部由file结构标识,内核使用 file_operations结构访问驱动程序的函数。 file_operations结构是一个定义在 <include/linux/fs.h>中的重要数据结构,这就 是通常所说的设备驱动程序与外界的接口。 每个文件都与它自己的函数集相关联(通过包括指 向file_operations结构的一个名为f_op的指针字 段)。这些操作主要负责系统调用的实现,并因此 被命名为open、read 等。
3
10.1.1 Linux的设备分类
Linux支持三类硬件设备:
字符设备:指那些无须缓冲直接读写的设备 块设备:只能以块为单位进行读写,典型的块大 小为512或1024字节。 网络设备 :不像字符设备或块设备那样通过对 应的设备文件节点去访问,可以通过基于BSD Unix的套接口(socket)机制访问,在系统和驱动 程序之间定义专门的数据结构进行数据的传递
15
模块
模块的装载和卸载有两种方式:
可以通过超级用户运行insmod和rmmod命令显 式地将模块载入内核或从内核中卸载; 内核自身也可以在需要时,请求守护进程 (kerneld)装载和卸载模块。 kerneld
模块方式对性能的影响:
采用了一些额外的代码和数据结构,它们占用了 一部分内存。 用户进程通过模块对内核资源进行的访问是间接 的,不可避免地降低了内核资源地访问效率。 16
23
对设备初始化和释放。 把数据从内核传送到硬件和从硬件读取数据。 读取应用程序传送给设备文件的数据和回送应用程序请 求的数据。 检测和处理设备出现的错误。
10
10.2.1 设备驱动的层次
Linux下的设备驱动程序是内核的一部分,运行在内 核模式,也就是说设备驱动程序为内核提供了一个 I/O接口,用户使用这个接口实现对设备的操作。 Linux的设备驱动程序介于(设备)文件系统与物理 设备中间。用户通过应用程序进程输入输入请求, 进而调用(设备)文件系统,(设备)文件系统通 过设备驱动程序控制物理设备进行设备的操作,如 进行磁盘文件的读出和写入操作等等,如图所示。 Linux设备驱动程序包含了中断处理程序和设备服务 子程序。
17
第十章 Agenda
10.1 10.2 10.3 10.4 Linux的设备介绍 Linux设备驱动程序介绍 Linux的设备驱动程序的模块结构 Linux的设备驱动程序的编写举例
18
Linux驱动程序接口
通常Linux驱动程序接口分为如下四层: 1)应用程序进程与内核的接口; 2)内核与文件系统的接口; 3)文件系统与设备驱动程序的接口; 4)设备驱动程序与硬件设备的接口。
19
字符设备驱动程序
一个最简单的字符设备驱动程序
该字符设备具备4个基本操作 bytedevice_open(),bytedevice_write(),by tedevice_read(),bytedevice_release() 实现的基本功能为向这个新建的字符设备先写 入一些数据,然后再从这个设备中读取这些数 据。
21
模块加载
采取模块加载的方式 :init_module和 cleanup_module函数 主要使用了驱动程序的注册与注销中的 register_chrdev()和 unregister_chrdev()。
22
驱动安装过程
完成上面的工作后,对前面的代码进行编译,并通过insmod 的方式加载其到内核中。 比如bytedevice源代码放在/usr/src/bytedevice下,可以 这样编译,生成bytedevice.o文件: $ gcc bytedevice.c –I /usr/src/bytedevice/include –c bytedevice.c –D__KERNEL__ -DMODULE 接下来把目标文件加载到内核。可以使用命令: $insmod –f bytedevice.o 如果已经成功安装,在/proc/devices文件中就可以找到设备 bytedevice, 并且可以看到它的主设备号(内核动态分配所 得)。如果要卸载模块,运行: $rmmod bytedevice 创建一个设备文件 ,通过设备文件就可以访问驱动程序
8
10.2 Linux设备驱动程序介绍
10.2.1 设备驱动的层次 10.2.2 设备驱动程序与外界的接口
9
设备驱动程序
设备驱动程序是操作系统内核和机器硬件之间的接 口。设备驱动程序为应用程序屏蔽了硬件的细节, 这样在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行 操作。 设备驱动程序主要完成以下功能:
常用命令
lsmod : 列出当前系统中加载的模块。 insmod, modprobe :用于加载当前模块,但 insmod不会自动解决依存关系,而modprobe则 可以根据模块间依存关系以及/etc/modules/conf 文件中的内容自动插入模块。 rmmod :把某个不再使用的模块从内核中卸载。 depmod :制造模块相关文件(module dependency file),以便后面要使用insmod命 令用来查询模块的具体位置
嵌入式系统
第十章 嵌入式Linux 设备驱动程序 嵌入式Linux
1
第十章 Agenda
10.1 10.2 10.3 10.4 Linux的设备介绍 Linux设备驱动程序介绍 Linux的设备驱动程序的模块结构 Linux的设备驱动程序的编写举例
2
10.1 Linux的设备介绍
10.1.1 Linux的设备分类 10.1.2 设备文件 10.1.3 设备号
例如,系统中的第一个IDE硬盘用/dev/had来表 示。 串口可以用/dev/ttyS0来表示.
由于引入了设备文件这一概念,Linux为文 件和设备提供了一致的用户接口。对用户来 说,设备文件与普通文件并无区别。
6
10.1.3 设备号
每个设备文件都对应有两个设备号:
一个是主设备号,表示该设备的种类,也标识 了该设备所使用的驱动程序; 另一个是次设备号,标识使用同一设备驱动程 序的不同硬件设备。