设备驱动程序.ppt

上传人:b****2 文档编号:2179609 上传时间:2022-10-27 格式:PPT 页数:71 大小:1.09MB
下载 相关 举报
设备驱动程序.ppt_第1页
第1页 / 共71页
设备驱动程序.ppt_第2页
第2页 / 共71页
设备驱动程序.ppt_第3页
第3页 / 共71页
设备驱动程序.ppt_第4页
第4页 / 共71页
设备驱动程序.ppt_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

设备驱动程序.ppt

《设备驱动程序.ppt》由会员分享,可在线阅读,更多相关《设备驱动程序.ppt(71页珍藏版)》请在冰豆网上搜索。

设备驱动程序.ppt

嵌入式系统设计第七章第七章设备驱动程序设备驱动程序主要内容7.1概述概述7.2设备文件接口设备文件接口7.3中断处理中断处理7.4应用实例应用实例7.1概述LinuxLinux作为作为unixunix的的一个变种一个变种,它继承了,它继承了unixunix的的设备管理方法,将所有的设备看作具体的设备管理方法,将所有的设备看作具体的文件,通过文件系统层对设备进行访问。

文件,通过文件系统层对设备进行访问。

所以在所以在Linux/uclinuxLinux/uclinux的框架结构中,和设的框架结构中,和设备相关的处理可以分为两个层次备相关的处理可以分为两个层次文件文件系统层系统层和和设备驱动层设备驱动层。

设备驱动层设备驱动层屏蔽具体设备的细节,屏蔽具体设备的细节,文件系统文件系统层层则向用户提供一组统一的、规范的用户则向用户提供一组统一的、规范的用户接口。

接口。

7.1概述7.1.1设备驱动原理设备驱动原理所有操作系统下设备驱动程序的共同目所有操作系统下设备驱动程序的共同目标是屏蔽具体物理设备的操作细节,实现标是屏蔽具体物理设备的操作细节,实现设备无关性。

在嵌入式操作系统中,设备无关性。

在嵌入式操作系统中,设备设备驱动程序驱动程序通常是内核的重要部分,运行在通常是内核的重要部分,运行在内核模式,即设备驱动程序为内核提供了内核模式,即设备驱动程序为内核提供了一个一个I/O接口接口,用户使用这个接口实现对设,用户使用这个接口实现对设备的操作。

图备的操作。

图72显示了一个操作系统的输显示了一个操作系统的输入输出子系统中各层次结构和功能。

入输出子系统中各层次结构和功能。

7.1.1设备驱动原理图图72I/O系统层次结构和功能系统层次结构和功能7.1概述7.1.2模块化编程模块化编程由于历史原因及出于效率方面的考虑,由于历史原因及出于效率方面的考虑,LinuxLinux是一个是一个宏内核宏内核。

虽然这种。

虽然这种宏内核宏内核给给LinuxLinux带来了效率高的优点,但也给它带来带来了效率高的优点,但也给它带来了某种程度的麻烦,即一旦需要在了某种程度的麻烦,即一旦需要在内核内核的的基础上增加一项功能时,就必须重新编译基础上增加一项功能时,就必须重新编译整个整个内核内核,这无疑给内核功能的扩充带来,这无疑给内核功能的扩充带来了不便。

于是,了不便。

于是,LinuxLinux发展了可安装内核模发展了可安装内核模块的机制块的机制“modulemodule”。

7.1.2模块化编程从代码特征上来看,从代码特征上来看,模块模块就是可完成一项独就是可完成一项独立功能的一组函数的集合;立功能的一组函数的集合;从使用特征上来看,它在需要时可以随时被从使用特征上来看,它在需要时可以随时被安装,而在不需要时又可以随时被卸载。

安装,而在不需要时又可以随时被卸载。

准确地说,准确地说,模块模块就是一个已编译但未连接的就是一个已编译但未连接的可执行文件。

利用这种机制,我们可以根可执行文件。

利用这种机制,我们可以根据需要,在不重新编译内核的情况下,将据需要,在不重新编译内核的情况下,将编译好的模块动态地插入运行中的内核,编译好的模块动态地插入运行中的内核,或者将内核中已经存在的某个模块移走。

或者将内核中已经存在的某个模块移走。

7.1.2模块化编程为了增强内核的灵活性和为了方便,设备为了增强内核的灵活性和为了方便,设备驱动程度应被设计为可动态安装的内核模。

驱动程度应被设计为可动态安装的内核模。

于是,一个典型的于是,一个典型的Linux设备驱动程序应包设备驱动程序应包含以下几部分代码:

含以下几部分代码:

驱动程序模块的注册与注销函数;驱动程序模块的注册与注销函数;设备的打开、关闭、读、写及需要的其设备的打开、关闭、读、写及需要的其他操作函数;他操作函数;设备的中断服务程序。

设备的中断服务程序。

7.1概述7.1.3设备类型设备类型LinuxLinux中的设备可以分为三类:

字符设备、中的设备可以分为三类:

字符设备、块设备和网络设备。

块设备和网络设备。

1.字符设备字符设备字符设备字符设备是指数据处理以字节为单位按顺是指数据处理以字节为单位按顺序进行的设备,它没有缓冲区,不支持随序进行的设备,它没有缓冲区,不支持随机读写。

机读写。

在对字符设备发出读在对字符设备发出读/写请求时,实际的硬写请求时,实际的硬件件I/OI/O一般就紧接着发生了。

一般就紧接着发生了。

7.1.3设备类型作为最简单的作为最简单的输入输出设备输入输出设备,操作系统将,操作系统将字符设备作为设备文件管理。

其文件结点字符设备作为设备文件管理。

其文件结点和目录管理方式与普通文件相同。

和目录管理方式与普通文件相同。

字符设备字符设备的初始化在内核启动时进行。

某的初始化在内核启动时进行。

某个字符设备初始化时,其驱动程序会构造个字符设备初始化时,其驱动程序会构造一个一个device_structdevice_struct结构,将其作为字符向结构,将其作为字符向量数组量数组chrdevschrdevs的一个元素向的一个元素向LinuxLinux内核注内核注册。

册。

7.1.3设备类型2.块设备块设备块设备块设备是指那些在输入是指那些在输入/输出时数据处理输出时数据处理以块为单位的设备,它一般都采用了缓存以块为单位的设备,它一般都采用了缓存技术,支持数据的随机读写。

典型的块设技术,支持数据的随机读写。

典型的块设备有硬盘、备有硬盘、CD-ROMCD-ROM等。

等。

对用户来说,对用户来说,块设备块设备和和字符设备字符设备的访问接的访问接口都是一样的,都是一组基于文件的系统口都是一样的,都是一组基于文件的系统调用,如调用,如readread,writewrite等,它们在实现上等,它们在实现上细节的区别仅在内核和驱动程序的软件接细节的区别仅在内核和驱动程序的软件接口上。

口上。

7.1.3设备类型3.网络设备网络设备在在LinuxLinux中,整个网络接口驱动程序的框中,整个网络接口驱动程序的框架可分为四层,从上到下分别为架可分为四层,从上到下分别为协议接口协议接口层层、网络设备接口层网络设备接口层、提供实际功能的、提供实际功能的设设备驱动功能层备驱动功能层、以及、以及网络设备和网络媒介网络设备和网络媒介层层。

7.1.3设备类型图图74网络驱动程序体系结构网络驱动程序体系结构7.1.3设备类型

(1)网络设备接口)网络设备接口所谓的网络设备接口,它既包括纯软件网所谓的网络设备接口,它既包括纯软件网络设备接口,如环路(络设备接口,如环路(loopback),也包),也包括硬件网络设备接口,如以太网卡。

在括硬件网络设备接口,如以太网卡。

在Linux中,网络设备接口是由数据结构中,网络设备接口是由数据结构device来表示的。

它操作的数据对象来表示的。

它操作的数据对象数据包是通过结构数据包是通过结构sk_buff来封装的。

来封装的。

7.1.3设备类型

(2)网络驱动程序加载方法)网络驱动程序加载方法目前,目前,Linux网络设备驱动程序的加载有两网络设备驱动程序的加载有两种方式。

一种是系统启动时,由内核自种方式。

一种是系统启动时,由内核自动检测并静态加载,称之为动检测并静态加载,称之为“启动初始启动初始化方式化方式”;另一种是通过模块化机制在;另一种是通过模块化机制在系统运行过程中根据需要由用户或系统系统运行过程中根据需要由用户或系统进程动态加载,称之为进程动态加载,称之为“模块初始化方模块初始化方式式”。

7.1概述7.1.4设备号设备号传统的设备管理中,除了设备类型外,传统的设备管理中,除了设备类型外,Linux/uclinux内核内核还需要一对被称作为还需要一对被称作为主设备号、次设备号的参数,才能唯一主设备号、次设备号的参数,才能唯一地标识设备。

地标识设备。

主设备号主设备号(majornumber)标识设备对应)标识设备对应的驱动程序。

系统中不同的设备可以有的驱动程序。

系统中不同的设备可以有相同的主设备号,主设备号相同的设备相同的主设备号,主设备号相同的设备使用相同的驱动程序,内核利用主设备使用相同的驱动程序,内核利用主设备号将设备与相应的驱动程序对应。

号将设备与相应的驱动程序对应。

7.1.4设备号次设备号次设备号(minornumber)用来区分具体)用来区分具体设备的驱动程序实例,只能由设备驱动设备的驱动程序实例,只能由设备驱动程序使用,内核的其他部分仅将它作为程序使用,内核的其他部分仅将它作为参数传递给驱动程序。

参数传递给驱动程序。

向系统添加一个驱动程序相当于添加一个向系统添加一个驱动程序相当于添加一个主设备号主设备号,字符型设备主设备号的添加,字符型设备主设备号的添加和注销分别通过调用和注销分别通过调用函数函数register_chrdev()和和unregister_chrdev()实现。

实现。

主要内容7.1概述概述7.2设备文件接口设备文件接口7.3中断处理中断处理7.4应用实例应用实例7.2设备文件接口7.2.1用户访问接口用户访问接口1.open入口点入口点打开设备准备打开设备准备I/OI/O操作。

对字符设备文件操作。

对字符设备文件进行打开操作,都会调用设备的进行打开操作,都会调用设备的openopen入口入口点。

点。

openopen子程序必须对将要进行的子程序必须对将要进行的I/OI/O操操作做好必要的准备工作,如清除缓冲区等。

作做好必要的准备工作,如清除缓冲区等。

如果设备是独占的,即同一时刻只能有一如果设备是独占的,即同一时刻只能有一个程序访问此设备,则个程序访问此设备,则openopen子程序必须设子程序必须设置一些标志以表示设备处于忙状态。

置一些标志以表示设备处于忙状态。

7.2.1用户访问接口2.open入口点入口点close()close()函数函数的作用是关闭由的作用是关闭由open()open()函数函数打开的文件,其调用格式为:

打开的文件,其调用格式为:

intcloseintclose(inthandleinthandle););该函数关闭文件描述字该函数关闭文件描述字handlehandle相连的文件。

相连的文件。

7.2.1用户访问接口3.read入口点入口点从设备上读数据。

对于有缓冲区的从设备上读数据。

对于有缓冲区的I/OI/O操作,操作,一般是从缓冲区里读数据。

一般是从缓冲区里读数据。

read()read()函数的调用函数的调用格式为:

格式为:

intread(inthandle,void*buf,intcount);read()read()函数从函数从handlehandle(文件描述字)相连的(文件描述字)相连的文件中,读取文件中,读取countcount个字节放到个字节放到bufbuf所指的所指的缓冲区中,返回值为实际所读字节数,返缓冲区中,返回值为实际所读字节数,返回回-1-1表示出错。

返回表示出错。

返回00表示文件结束。

表示文件结束。

7.2.1用户访问接口4.write入口点入口点往设备上写数据,对于有缓冲区的往设备上写数据,对于有缓冲区的I/OI/O操作,操作,一般是把数据写入缓冲区里。

一般是把数据写入缓冲区里。

write()write()函数函数的调用格式为:

的调用格式为:

intwrite(inthandle,void*buf,intcount);write()write()函数把函数把countcount个字节从个字节从bufbuf指向的缓指向的缓冲区写入与冲区写入与handlehandle相连的文件中,返回值相连的文件中,返回值为实际写入的字节数。

为实际写入的字节数。

7.2.1用户访问接口5.ioctl入口点入口点执行读、写之外的操作。

函数原型为:

执行读、写之外的操作。

函数原型为:

intioctlintioctl(intfdintfd,intcmdintcmd,)参数参数cmdcmd不经修改地传递给驱动程序,可选不经修改地

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1