驱动程序范文

时间:2023-03-06 01:12:33

驱动程序

驱动程序范文第1篇

WIND

OMEGA驱动是一款针对ATI显卡的著名第三方驱动,相信很多读者都不会对其感到陌生。它的自动超频功能和简易的软改显卡功能受到了许多DIYer的追捧。加上不输官方驱动的性能和稳定性,甚至还可以提供比官方驱动更好的硬件兼容性而广受好评。其实,OMEGA驱动除了集成官方驱动以外,还提供了一些“副业”,善用这些“副业”可以让你在日常应用中更加事半功倍,比如在Windows系统下备份显卡B10S、随时监控硬盘温度以及监控系统硬件状态等多种实用的功能。

笔者在此就以0MEGA 3 8 23l版驱动为例进行讲解。注意,本文所介绍的功能需在安装并开启驱动程序附带的ATI TRAY TOOLS(下简称ATT)后方可使用。

提取显卡BIOS

实用指数:

作用:备份、刷新显卡BloS,显卡BIOS损坏后的还原。

不少显卡B10S修改软件都需要在纯DOs的环境下提取B10S,且不说命令行操作效率低,单是切换系统的时间就够你等待。有了OMEGA驱动就没这么麻烦啦!因为它在驱动中就集成了保存显卡BIOS的功能。

当ATT的功能开启后,在右下角的系统托盘中会出现一个红色的立方体标志。右键点击该标志,从弹出的菜单中依次选择“T001s&Options”“Dump V1deo B10S”,在指定了BlOS备份文件的保存路径之后,我们就可以将现有的B10S文件提取并储存下来了。

保存桌面图标的位置

实用指数:

作用:快速恢复你熟悉的桌面图标 这个功能可以看作“Ghost”备份。我们都习惯使用自定义的桌面图标设置,而这些图标的位置被打乱无疑是一件让人很郁闷的事情。所以,在你定义好自己的桌面图标之后,右键点击ATT的标志,依次选择“Tools&0ptIOnS”“Save Desktop Icon POSltlOnS”,确定后就完成了桌面图标的保存(图2、3)。当图标被打乱后,依次选择“Tools&Dptions”“Restore Desktop Icon Posltlons”,就可以将桌面设置还原到保存之前的状态了(图4)。

即时显示FPS

实用指数:

作用:即时显示游戏运行状况,可以作为游戏相关硬件性能测试的一个指标。

该功能在运行ATT后再运行需要调用DirectX或ODenGL的程序时,就会自动调用。当功能被调用之后,我们nr以看到在右上角会有黄色的数字,这就是显示出的FPS值,当这个数值低于25时会变成红色(图5)。

当然,如果你觉得它分散了你的注意力的话,也可以把它关掉。只需依次点击“Tools&Options”“On Screen Display”“Hide”(图6),就可以去掉在游戏中显示FPS的功能了。

显示硬盘温度

实用指数:

作用:监控并显示硬盘温度,防止硬盘过热产生故障。

监视硬盘的温度也是附加功能之一,我们可以在“Plugins”“Run Time Plug-ins”中进行监控选项的相关配置(图7)。

在弹出的窗口中找到“HDD Temperature”,选中后单击下方的“Enable”按钮后,再点击“Start”就可以开启这项功能了(图8)。

此时在系统托盘中会出现如图9所示的数字。以笔者的系统为例,我们可以看到其中一块硬盘的温度为38℃,另一块则无法检测(笔者估计是那块硬盘太老造成的),显示为0。

如果不想显示硬盘温度,点击图8中的“Stop”就行了,彻底关闭服务就直接选择“Disable”(原Enable的位置)即可。顺便说一下,在同一窗口中还可以设置CPU负载监视,即“CPU Load Meter”,不过这项功能不如Windows自带的任务管理器好用,就不多介绍了。

自定义快捷键

实用指数:

作用:一键运行特定的应用程序

和NVIDIA显卡驱动一样,通过OMEGA驱动我们也同样可以自定义快捷键。依次选择“Hot Keys”“Customize”可以进人陕捷键控制台。

要启用快捷键功能,需勾选上方的“Enable Hot Keys”,然后添加快捷键。点击下方的“Add”按钮,会弹出一个所示的窗口。

我们可以在左边看到一些诸如“载入预设方案“、。超频”以及“风扇控制”等很有意思的功能。不过作用最大的还是快捷运行应用程序功能,在此就以它来讲解。

点击左边最下面“Miscel[aneous”前面的“+”号,选择下方的“Start anapplication”,然后在右边的“H0t key”文本框中填入用于执行命令的组合键(或单键)。如果对设定的按键不满意,可以按键盘上的“Backspace”米清除。注意,在“Select Application”选项中需要填的就是你想要以此快捷键运行的程序,“Parameter”中可以填入应用程序是否需要以附加参数运行,如sw等。一切设置完成后,点“OK”就可以生效了。

屏幕截图

实用指数:

作用:抓取屏幕截圈

OMEGA驱动中还集成了截图功能。先要在“Tools&Options”“Gene ral Options”中进人“ScreenShOtS”选项卡设置储存路径和储存格式,再到“HotKeys”中进行快捷键设置。在添加快捷键的窗¨左边选择“Miscellaneous”“Make Screenshot'’,在右边空格中填入快捷键,点击“OK”后就可以使用定义好的快捷键截图了。

监视系统

实用指数:

作用:监控系统硬件状况 这是一个又好用又好玩的“副业”,我们可以通过这个功能来察看电脑应用过程的系统资源消耗以及硬件状况,从而可以直观地看出哪一部分的资源消耗最多,找到PC性能的瓶颈。

右键点击ATT图标,选择“Hardware”“Monitoring Graphs”,会弹出一个空白的窗口。

点击下方的"Add”按钮,添加一个视图,在这一页中可以设置折线图的资料。最为关键的设置是在“Sources”的选项卡里,我们可以看到各种可以监视的项目,如CPU时钟频率、内存频率、FPS以及空闲的显存容量等。

为了观察方便,我们还是针对每一个选项都设置一个图表比较好,同时监视多项的话,可以添加多个图表。在每一项后面有一个色块,点击它可以更换该折线的颜色。点“OK”就可以添加这个图表了,所示。

如果我们把鼠标移到图标中,可以查看相应时间轴的数值。要配置选项就在图表上点右键选择“Configure”进行设置,要删除该图表就选择“Delete"即可。

小结

驱动程序范文第2篇

换操作系统,给我一个理由

有的朋友也许会说:“我只用本本自带的系统,不重装系统,不就没这些麻烦事了吗?”我想说:“事情,不是这样的。”

1.拒绝版的Windows

众所周知,现在本本安装的Windows操作系统,大多是Home Edition和Home Basic等“”版(图1)。无论是在功能上,还是在使用习惯上,都没法与大家惯用的更高级别版本相比。

2.Vista,想说爱你不容易

现在很多本本的“ 标配”操作系统都不再是WinXP,而是Vista。但是很多用户都对Vista表示了反感――极高的系统资源占用和使用界面、习惯的改变,并不是所有人都愿意接受的。

3.对不起,我的名字叫Linux

既然都说到低价本本了,我们不妨再来看看另一种低价本本上的操作系统――Linux。许多低价本本,为了压低成本,都会改装Linux。我相信大多数普通用户在面对Linux系统的时候,都是两眼一抹黑,什么都不懂……综上所述,在拿到新本本之后,我们应该做的第一件事情就是――“干掉”它上面的操作系统,换成我们自己熟悉的系统(部分HP和SONY的本本需要刷入特殊BIOS文件方可更换操作系统,切记切记)!

轻轻松松,玩转本本驱动程序

言归正传,在“ 干掉”了本本原配系统之后,谁也不想面对一片惨淡的问号吧(图2)?所以,解决驱动程序的问题,迫在眉睫!要解决这些问号,首先要知道它们都对应什么硬件。可是对于大多数用户来说,想要准确识别出这些设备肯定是不可能完成的任务,因此需要借助一些软件来帮忙。

1.《驱动人生》识别硬件

在这里,笔者推荐大家使用《驱动人生》(下载地址:)。这是一款集硬件识别,驱动程序在线搜索、下载、安装、备份等功能于一身的软件。利用它,可以准确检测出未识别系统设备,并且直接下载驱动程序,非常方便。

硬件检测第一步:

运行程序之后可以查看到本本有哪些驱动程序不是最新、系统中有哪些驱动程序没有备份等信息。关于驱动程序的信息,一目了然(图3)。

硬件检测第二步:

点击工具栏中的“驱动更新”一项,软件会自动扫描系统中所有硬件设备(没有安装驱动程序的设备也能够准确识别)。笔者新买的本本安装了Wi n X P之后没有相应的声卡驱动程序,《驱动人生》不仅能准确识别到这个设备,还能显示最新驱动程序的版本号以及日期等信息(图4)。

硬件检测第三步:

既然找到了未知设备,而且程序也提供了直接在线下载安装功能,那么,只要点击“开始更新”按键,程序就会自动连接到官方网站下载相应的驱动程序,稍等片刻即可(图5)。

驱动程序下载完之后系统会自动安装,接着根据提示重新启动计算机,就轻松搞定了硬件驱动程序的安装。

好了,至此驱动程序的问题基本上得到了完美解决。不过,笔者还有一个压箱底的绝招要告诉大家……

2.操作系统版本更换,简单!

以将Vista Home Basic更换成Vista Ultimate为例,只需运行《驱动人生》,选择“驱动备份”。待新系统安装完毕,选择“驱动还原”即可(图6,WinXP、Vista和Windows7的备份不可通用)。这一绝招是不是很好用?

特别提醒

对了,忘记给大家说个事。在《驱动人生》里还有一个非常人性化的功能――可以选择不更新的内容。只需勾选不想更新驱动程序的硬件名称,《驱动人生》就会在升级的时候自动“忽略”它。也就是说,你可以随心所欲升级驱动程序咯!

驱动程序范文第3篇

第一步,安装操作系统后,首先应该装上操作系统的ServicePack(SP)补丁。我们知道驱动程序直接面对的是操作系统与硬件,所以首先应该用SP补丁解决操作系统的兼容性问题,这样才能尽量确保操作系统和驱动程序的无缝结合。

第二步,安装主板驱动。主板驱动主要用来开启主板芯片组内置功能及特性,主板驱动里一般是主板识别和管理硬盘的IDE驱动程序或补丁,比如Intel芯片组的INF驱动和VIA的4in1补丁等。如果还包含有AGP补丁的话,一定要先安装完IDE驱动再安装AGP补丁,这一步很重要,也是很多造成系统不稳定的直接原因。

第三步,安装DirectX驱动。这里一般推荐安装最新版本,目前DirectX的最新版本是DirectX9.0C。可能有些用户会认为:“我的显卡并不支持DirectX9,没有必要安装DirectX9.0C”,其实这是个错误的认识,把DirectX等同为了Direct3D。DirectX是微软嵌在操作系统上的应用程序接口(API),DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成,显示部分又分为DirectDraw(负责2D加速)和Direct3D(负责3D加速),所以说Direct3D只是它其中的一小部分而已。

而新版本的DirectX改善的不仅仅是显示部分,其声音部分(DirectSound)――带来更好的声效;输入部分(DirectInput)――支持更多的游戏输入设备,并在这些设备的识别与驱动上更加细致,充分发挥设备的最佳状态和全部功能;网络部分(DirectPlay)――增强计算机的网络连接,提供更多的连接方式。只不过是DirectX在显示部分的改进比较大,也更引人关注,才忽略了其他部分的功劳,所以安装新版本的DirectX的意义并不仅是在显示部分了。当然,有兼容性问题时另当别论。

第四步,这时再安装显卡、声卡、网卡、调制解调器等插在主板上的板卡类驱动。

第五步,最后就可以装打印机、扫描仪、读写机这些外设驱动。

这样的安装顺序就能使系统文件合理搭配,协同工作,充分发挥系统的整体性能。

驱动程序范文第4篇

[关键词]嵌入式驱动程序 嵌入式技术 课程研究

[中图分类号]G434 [文献标识码]A

一、引言

嵌入式系统的硬件组成除了包括中心控制部件嵌入式系统处理器外,还有输入输出装置以及一些扩充装置开关、按键、传感器、模数转换器、LCD显示器、触摸屏及LED(发光二极管)等嵌入式硬件设备。嵌入式硬件环境是整个嵌入式操作系统和应用程序运行的硬件平台,不同的应用通常有不同的硬件环境[1]。硬件平台的多样性是嵌入式系统的一个主要特点。如何让这些设备工作起来,是嵌入式驱动程序的任务。由于I/O设备种类繁多,工作模式各不相同,驱动程序是整个嵌入式软件设计中最复杂、代码量最大、最繁琐的部分。

二、嵌入式驱动程序概述

外设驱动程序可以对系统提供访问设备的接口,把操作系统(软件)和设备(硬件)分离开来。当设备改变的时候,只需要更换相应的驱动程序,不必修改操作系统的内核以及运行在操作系统中的软件。系统的驱动程序要受控于相应的操作系统的多任务之间的同步机制。在操作系统中使用信号量、邮箱等机制进行协调。操作系统只和特定的驱动抽象层通讯,无论在抽象层下面对应的是什么类型的设备,对操作系统和用户的应用程序来说都是统一的接口[2]。驱动抽象层位置图如图1所示。

图1:驱动抽象层位置图

该部分包括基于ARM架构的串行口通讯、键盘驱动原理、I/O接口电路、A/D接口电路、LCD的驱动控制、触摸屏程序设计的内容。

三、嵌入式驱动程序设计研究

1.串行口通讯

通过监视串行口,把我们在程序中插入的想要反馈程序运行情况的串行口语句输出到显示器中的超级终端中。这样便可以实时监控程序的运行情况,方便调试程序。串行口组件设计是将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示[3]。

要想设计好串行口驱动程序,需要做如下几步:

(1)熟悉串口通讯原理;

(2)查阅ARM串口寄存器文档,包括S3C2410控制、状态和数据寄存器;

(3)查阅电平转换芯片资料(max3232);

(4)设计硬件电路图;

(5)设计串口驱动(包括串口寄存器初始化,发送接收函数等)。

异步通信必须遵循的3项规定为:

(1)字符的格式

(2)波特率

(3)校验位

初始化时需要设置波特率、停止位、奇偶校验、数据位等参数。异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线。如图2给出了异步串行通信中一个字符的传送格式。

图2:串行通信字符格式

开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。

2.键盘驱动原理

键盘的设计是将一个瞬时接触开关放置在每一行与每一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。如图3所示为逐行扫描法工作原理:逐根行线输出0电平,而其他行线保持高电平;同时检测列,列全1就没有键按下,0有键按下。行线和列线状态组合在一起就确定了是哪个键按下,如110 1110是0键按下,1010111是7键按下。

图3:逐行扫描法原理图

3.I/O接口电路

I/O系统的目标是对RTOS和应用程序员隐藏设备特定的信息,并且对系统的I/O设备提供一个统一的访问方法。下面是从不同角度看I/O系统:

(1)从系统软件开发者角度看,I/O操作意味着与设备的通信、对设备编程初始化和请示执行设备与系统之间的实际数据传输以及操作完成后通知请求者。系统软件工程师必须理解设备的物理特性,如寄存器的定义和设备的访问方法。

(2)从RTOS的角度看,I/O操作意味着对I/O请求定位正确的设备,对设备定位正确的设备驱动程序,并解决对设备驱动程序的请求。有时要求RTOS保证对设备的同步访问。RTOS必须进行抽象,对应用程序员隐含设备的特性。

(3)从应用程序员角度看,目标是找到一个简单、统一和精练的方法与系统中出现的所有类型的设备。

I/O接口的编址方式分为两种:

(1)I/O接口独立编址――端口映射方式

这种编址方式是将存储器地址空间和I/O接口地址空间分开设置,互不影响。设有专门的输入指令(IN)和输出指令(OUT)来完成I/O操作。

(2)I/O接口与存储器统一编址方式――内存映射这种编址方式不区分存储器地址空间和I/O接口地址空间,把所有的I/O接口的端口都当作是存储器的一个单元对待,每个接口芯片都安排一个或几个与存储器统一编号的地址号。也不设专门的输入/输出指令,所有传送和访问存储器的指令都可用来对I/O接口操作。

4.A/D接口电路

A/D转换器能将模拟量转换为数字量的电路;D/A转换器能将数字量转换为模拟量的电路。A/D转换器和D/A转换器是沟通模拟电路和数字电路的桥梁,也可称之为两者之间的接口。A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。一般A/D转换过程要经过采样、保持、量化和编码四个步骤。前两步在取样―保持电路中完成,后两步则在A/D转换器中完成。D/A转换器的基本原理是将输入的每一位二进制代码按其权的大小转换成相应的模拟量,然后将代表各位的模拟量相加,所得的总模拟量就与数字量成正比,这样便实现了从数字量到模拟量的转换。

A/D转换器较常用的是逐次逼近型,如图4所示。转换前,先将SAR寄存器各位清零。转换开始时,控制逻辑电路先设定SAR寄存器的最高位为“1”,其余位为“0”,此试探值经D/A转换成电压Vc,然后将Vc与模拟输入电压Vx比较。如果Vx≥Vc,说明SAR最高位的“1”应予保留;如果Vx

图4:逐次逼近式A/D转换原理图

5.LCD的驱动控制

LCD显示器的基本原理就是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。因此,LCD的驱动控制归于对每个液晶单元的通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使光线通过。

液晶模块有两种工作模式:图形方式和文本方式。在图形方式下,模块上的缓冲区映射的是液晶屏上显示的图形点阵;在文本方式下,模块上的缓冲区对应的是液晶屏上显示的文本字符,包括英文字符和英文标点符号。因为汉字字库没有包含在液晶模块之中,所以液晶屏在文本方式下只能显示英文,不能显示汉字。液晶屏的操作主要包括:初始化、设置液晶屏的工作模式(文本或者图形)、更新显示、开启(或者关闭)背光等。

6.触摸屏程序设计

触摸屏是专门处理是否有笔或手指等物体按下触摸屏,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,并在按下时分别给两组电极通电。因其中一面导电层(顶层)接通X轴方向的5V均匀电压场,使得检测层(底层)的电压由零变为非零,控制器侦测到这个接通后,其对应位置的模拟电压信号经过A/D转换送回处理器。经过坐标转换后,得到触摸点的x/y坐标。

触摸屏接口专用芯片ADS7843是Burr-Brown公司生产的,能够完成电极电压的切换及采集接触点处的电压值,并进行A/D转换。在完成一次x/y坐标采样的过程中需要一次模式转换即在点击触摸屏之前是等待中断模式,当有触摸动作产生触摸屏中断以后,在x/y的坐标采集驱动中设置成自动的x/y位置转换模式,在完成采集以后再转换回等待中断模式,准备下一次的触摸采样。

四、总结

嵌入式驱动程序设计渗透在掌上电脑、笔记本电脑和手机等各个领域,这些设备要想正确工作,必须借助相应硬件及其驱动程序。随着嵌入式系统在工业控制领域、智能机器人、移动通讯以及智能家电、网络家电的应用,驱动程序设计方面的开发人员需求量也会越来越多。

基金项目:北京信息科技大学《嵌入式系统安全》课程建设项目

[参考文献]

[1]王小妮、魏桂英、杨根兴. 嵌入式组件设计[M].北京航空航天大学出版社,2012

[2]王小妮.基于嵌入式系列课程的教学改革与探索[J].教育理论与教学研究,2013.5

[3]王田苗.嵌入式系统设计与实例开发(第3版)[M].北京:清华大学出版社,2008

驱动程序范文第5篇

Windows CE作为一种典型的嵌入式操作系统,通过将蓝牙应用移植到Widows CE中,对于如pSOS+、Nucleus等其它嵌入式系统,具有典型意义。由于OBEX上的文件传输应用建立在RFCOMM实现的蓝牙仿真串口上,本文介绍OBEX文件传输的蓝牙虚拟串口驱动程序的实现。

1 Windows CE设备驱动程序概述

Windows CE支持广泛的基于各种CE平台的设备驱动程序。目前,它提供了四种设备模型,其中两种是专用于Windows CE的模型,另外两种外部模型来自其它操作系统。基于Windows CE的两种模型是本机的设备驱动程序和流接口驱动程序。两种外部模型用于通用串行总线(USB)和网络驱动器接口标准(NDIS)的驱动程序。

由于蓝牙协议是在无线技术下的仿真串口,蓝牙中OBEX的许多应用正是基于蓝牙仿真串口。而流接口驱动程序通过一组流接口函数使得应用程序可以通过文件系统中的特殊文件而与设备接口,因此蓝牙仿真串口的功能性更适合流接口驱动程序的结构。

图1

2 Windows CE下蓝牙串口驱动程序的实现

虽然蓝牙设备驱动程序的实现采用流接口驱动程序设计,但由于两种驱动程序的基本结构与原理相似,所以下文从本机设备驱动程序结构开始,可以更清楚地认识蓝牙设备驱动程序的实现原理。

2.1 本机设备驱动程序结构

Windows CE中包含的样本设备驱动程序分为两种类型:单片驱动程序(Monolithic device driver)和分层的驱动程序(Layered Devicedriver)。单片驱动程序基于单个码片,该码片直接把硬件设备的功能性通过设备驱动程序接口传递给操作系统。与单片驱动程序相比,分层的驱动程序由两个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。本文采用分层的驱动程序来连接蓝牙硬件和上面的文件传输应用。图1说明了两种驱动程序是如何在Windows CE操作系统中集成的。

设备驱动程序接口(DDI)是在MDD中实现的函数集,GWES模块通过这个接口调用设备驱动程序;设备驱动程序服务器提供接口(DDSI)是在PDD中实现的函数集并由MDD调用。由于微软提供了所有与MDD模块相关的源代码,所以对这部分不用做任何改动,只需将自己的PDD模块与MDD模块链结成一个公用库。

理解了本机设备驱动程序的结构后,从图1右边不难看出,流接口驱动程序只是把流接口作为它们的DDI使用。在这种情况下,不必要把这些驱动程序与GWES模块逻接起来。它们以普通的DLL方式存在并根据需要被调用。

2.2 蓝牙仿真串口驱动程序实现

蓝牙仿真串口是用蓝牙RFCOMM协议实现无电缆的无线串口通信,与本机设备驱动程序一样,实现流接口的串口驱动程序同样只需实现蓝牙的PDD模块。

PDD模块包括四部分:第一部分是必须自己实现的所有DDSI接口;第二部分是蓝牙协议栈包括FRCOMM、SDP、L2CAP以及HCI实体;第三部分是HCI传输层通过UART或者USB接口连接到蓝牙硬件;最后一部分是为蓝牙应用提供的图形界面接口和控制端口模块,用来对整个协议栈初始化、蓝牙硬件初始化、搜索附近的蓝牙设备以及发现指定设备上的服务。如图2所示。

在图2所示的蓝牙仿真串口驱动程序的系统结构中,设备管理程序是用户层的程序,在基于Windows CE的平台上不停地运行着。设备管理程序不是内核的一部分,但它是与内核、注册表和注接口驱动程序DLL有相互影响的单独部分。它主要执行以下任务:

HWOBJ BluetoothObj={ /*描述蓝牙仿真串口特征*/

(PDEVICE_LIST)&SerDL,

THREAD_IN_PDD,/*中断处理全部由PDD层处理*/

0,

NULL,

(PHW_VTBL)&BluetoothVTbl/*包含需要实现的所有标准串口DDSI函数的列表*/

};

HWOBJ BluetoothCTRLObj={/*描述蓝牙控制端口特征*/

(PDEVICE_LIST)&SerDL,

THREAD_IN_PDD,

0,

NULL,

(PHW_VTBL)&CTRLVTb1

};

PHWOBJ rgpHWObjects[]={/*包含两个PDD实例的数组*/

&BluetoothObj,

&BluetoothCTRLObj

};

DEVICE_LIST SerDL={/*存储设备驱动程序中所有串口设备*/

“CESerial.dll”,/*串口驱动程序的名字*/

sizeof(rgpHWObjects)/sizeof(PHWOBJ),/*串口设备的数目*/

regHWObjects

};

PDEVICE_LIST GetSerialObject(VOID)

{

return (&SerDL);

}

图2

在串口驱动程序中注册了两个串口设备后,就要实现这两个PDD实例对应的流接口函数。微软为要实现的串口PDD模块提供了一个HWOBJ(Haredware Object)类型的串行对象表,这个结构列出了实现串口驱动的所有接口函数指针。见下面的描述:

typedef struct _HW_VTBL{

PVOID(*HWInit)(ULONG Identifier,PVOID pMDDCon-text,PHWOBJ pHWObj);

…,

…,

BOOL(*HWIoct1)(PVOID pHead,DWORD dwCode,

PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD

DwLenOut,PDWORDpdwActualOut);

} HW_VTBL,*PHW_VTBL;

用户通过修改串行口PDD的串行对象表改变函数集或函数名。下面的结构BluetoothVTbl的定义了蓝牙仿真串口DDSI函数的名称。

Const HW_VTBL BluetoothVTbl={

BluetoothInitSerial,

…,

…,

BluetoothIoctl

};

同样用结

构变量CTRLVTbl定义了控制端口的DDSI函数名列表。由于这个串口设备用作内部实现特殊的功能,下面只列出了需要关心的主要函数名。Const HW_VTBL CTRLVTbl={

CTRLInitSerial,

CTRLDeinit,

CTRLOpen,

CTRLClose,

…,

…,

CTRLIoctl

};

驱动程序范文第6篇

关键词:设备驱动;应用程序;移植;程序

为了保证操作系统的平安性和稳定性以及应用程序的可移植性,Windows操作系统不答应应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,假如应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法摘要:异步过程调用(APC)、事件方式(VxD)、消息方式、异步I/O方式和事件方式(WDM)。下面分别说明这几种方式的原理。

一、异步过程调用(APC)

Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地址%26amp;backFunc()作为参数,通过DeviceIoControl()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用Get_Cur_Thread_Handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_VWIN32_QueueUserApc()函数,向Win32应用程序发送消息。这个函数带有三个参数摘要:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。Win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。

二、事件方式(VxD)

首先,Win32应用程序创建一个事件的句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring0句柄,因此,需要创建Ring0句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(), 找到函数OpenVxDHandle()在动态链接库中的位置。接着,用OpenVxDHandle()函数将Ring3事件句柄转化为Ring0事件句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。假如加载成功,则调用DeviceIoControl()函数将Ring0事件句柄传给VxD;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,VxD置Ring0事件为有信号状态(调用_VWIN32_SetWin32Event()函数),这马上触发对应的Ring3事件为有信号状态。一旦Ring3事件句柄为有信号状态,Win32应用程序的辅助线程就对这个消息进行相应的处理。

三、消息方式

Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这个句柄向窗体发消息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用ON_MESSAGE()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。SHELL_PostMessage()函数的第一个参数为Win32窗体句柄,第二个参数为消息ID号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。Win32应用程序收到消息后,对消息进行处理。

四、异步I/O方式

Win32应用程序首先调用CreateFile()函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,表示以后可以对文件进行重叠I/O操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为OVERLAPPED的数据结构(如Overlapped)。然后,将Overlapped作为一个参数,传给DeviceIoControl()函数。设备驱动程序把这个I/O请求包(IRP)设置为挂起状态,并且设置一个取消例程。假如当前IRP队列为空,则将这个IRP传送给StartIo()例程;否则,将它放到IRP队列中。设备驱动程序做完这些工作后,结束这个DeviceIoControl()的处理,于是Win32应用程序可能不等待IRP处理完,就从DeviceIoControl()的调用中返回。通过判定返回值,得到IRP的处理情况。假如当前IRP处于挂起状态,则主程序先做一些其它的工作,然后调用WaitForSingleObject()或WaitForMultipleObject()函数等待Overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的IRP,处理完成后,调用IoCompleteRequest()函数。该函数将Overlapped中的事件设置为有信号状态。Win32应用程序对这个事件马上进行响应,退出等待状态,并且将事件复位为无信号状态,然后调用GetOverlappedResult() 函数获取IRP的处理结果。

五、 事件方式(WDM)

Win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其它事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。当条件具备后,设备驱动程序将事件设置为有信号状态,这样应用程序的辅助线程马上知道这个消息,于是进行相应的处理。当设备驱动程序不再使用这个事件时,应该解除该事件的指针。

六、 结语

在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,具体说明每种方法的原理和实现过程,希望能够给设备驱动程序的设计者提供一些帮助。

参考文献:

[1](美)Chris Cant. Windows WDM设备驱动程序开发指南. 孙义, 马莉波, 国雪飞等译. 北京摘要: 机械工业出版社 2000.

驱动程序范文第7篇

关键词:USB协议;Linux驱动;USB Device驱动

中图分类号:TP316文献标识码:A文章编号:1009-3044(2011)22-5418-02

Design of USB Device Drver Program on linux

SUN Yong-gang, JIAO Li-fei

(College of Science, GuiZhou University, Guiyang 550025, China)

Abstract:USB interface, with its efficient, reliable and widely is used in various embedded products. However, existing data on linux operating system, more studies USB Host, USB Device driver rarely is done. Therefore this paperthrough a simpleintroduction of USB protocol, as well as analysis of USB driver architecture about linux, is about an design of USB Device driver of linux systemfor embedded microprocessor S3C2440 .

Key words: USB agreement; linux driver;USB device driver

嵌入式产品通过的USB接口品可以很方便与PC的USB进行通信以完成数据的传输与交互。ARM嵌入式处理器性以其性能高、功耗低而被广泛地应用于消费电子、工业控制等众多领域。以ARM内核为核心集成了USB功能的处理器使得产品更简洁、更灵活、更方便。S3C2440集成了ARM920T内核,带MMU功能,可运行linux操作系统,同时带有两个USB Host一个USB Device控制器,因此在此基础上完成Linux 下的USB Device驱动程序有着重要的意义。本文是以此处理器为核心的嵌入式智能终端的Linux下的USB Device驱动程序设计。

1 USB体系结构及协议

1.1 USB硬件系统结构

USB接口是由+5V电源线、电源地线、信号线D+、信号线D-四根电缆线组成接口。其中+5V电源是向设备提供电源,信号线作用是传输数据, 为了提高信号传输的抗干扰能力这两根数据线采用差分传输。主机可以通过D+和D-线的电平高低来确设备是高速设备还是全速设备。

1.2 USB数据传输通道

USB主机与USB设备由很多端点构成,它们之间通过端点进行通讯。通过设置与些端点相对应的寄存器,可以为这些端点分配唯一的地址(由端点号和传输方向组成)。USB总线支持四种传输类型,他们分别是控制传输、同步传输、中断传输、批量传输。端点O只支持控制传输。

1.3 USB总线枚举

USB总线枚举就是当USB设备连接到USB主机时,主机通过缺省管道以控制传输方式来获取USB设备发来的设备描述符、配置描述符、接口描述符、端点描述符信息,并根据这些描述相关内容对USB设备进行相应的配置。

2 Linux USB 驱动程序

在Linux系统中,USB驱动程序可以分为USB Host驱动程序和USB Device驱动程序。Linux USB Host驱动程序和USB Device驱动程序总体架构如图1所示。

从图1可以知,在Linux USB Host中,USB控制器驱动是运行在USB 控制器硬件上面的的驱动动程序。该驱动实现了对USB 控制器硬件进行控制,一般称为USB固件驱动程序。USB设备驱动处于USB驱动的最顶层,它主要实现USB设备如何与主机进行通信。处在USB主机控制器驱动与USB设备驱动之间的是USB核心层,起到驱动程序桥梁的作用,该核心层为USB主机USB主机控制器驱动提供编程接口。

Linux系统中, USB Device驱动分为UDC驱动、Gadget API、Gadget驱动三个层次结构。UDC驱动处USB Device控制器硬件之上,该驱动程序控制USB控制器硬件工作,同时向上层提供操作USB控制器硬件的回调函数。处在中间层的是Gadget API层,该API向下层和上层提供统一的编程接函数的封装。Gadget驱动程序完成设备功能的实现。通过编写不同Gadget驱动程序可以使设备具有不同的功能。

3 S3C2440 USB Device驱动

3.1 S3C2440 USB接口特性

S3C2440嵌入式微处理器集成了一个设备控制器。该设备控制器具有以下特征:

1) 完全兼容USB1.1的协议。设备全速运行时可达到了12Mb/s。

2) 支持控制、中断和批量传输,批量传输支持DMA接口。

3) 自带5个的端点。端点EP0带有16byte的FIFO,该端点为双向的控制端点,其余4个端点都带有128字节输入/输出的FIFO(异步双端口RAM)的,支持中断或DMA批量传输。

3.2 S3C2440 USB Device驱动程序设计

一个完整的S3C2440 USB Device驱动程序由S3C2440_UDA驱动和gadget驱动两部分构成。S3C2440_UDA驱动是用来控制S3C2440的USB Device硬件控制器器,并把对硬件控制操作抽象为函数接口供上层调用。USB gedget驱动程序运行在S3C2440_UDA驱动程序之上的,不同的gedget驱动程序使该设备具有不同的功能。

Linux gadget驱动程序主要涉及到2个重要的结构体usb_gadget_driver和struct file_operations结构。其中usb_gadget_driver结构体包括bind、setup、disconnect等一些函数。Linux Gadget提供usb_gadget_register_driver函数对Gaget驱动进行注册。当Gadget驱动被注册后,Linux内核就会调用结构体usb_gadget_driver中的bind函数把Gadget驱动与UDA驱动进行绑定,这样就可以在Gadget驱动中使用UDA提供的统一接口函数。

bind函数中需要完成以下工作:

1) 使用usb_ep_autoconfig函数申请以后用到的传输端点。

2) 通过usb_ep_alloc_request函数为Gadget驱动分配一个请求。

3) 通过调用register_chrdev_region注册设备驱动程序。

Bind函数完成这后当有USB Host 向USB设备发出请求时,Linux系统将调用setup函数来响应请求。Setup函数把设备的设备描述符、配置描述符、接口描述符以及以后需要使用的几个端点描述符发送给USB Host,这些配置信息的发送都是通过usb_ep_queue函数来完的。

struct file_operations结构包含有open、read、write等函数。通过该结构体定义的变量被register_chrdev_region函数注册后该设备就可以像字符设备那样使有了。该结构中的一些函数完成的功能如下:

1) open函数通过init_waitqueue_head完成等待队列初始化。

2) read函数通过alloc_ep_req函数分配一个读请求变量,并为该变量中的complete设置一个请求完成函数,调用usb_ep_queue函数向端点提交I/O读请求。当内核从USB Device读到数据时就会调有刚才的完成函数。在完成读数据之前可以通过add_wait_queue和schedule()函数让进程挂起,在完成函数中唤醒挂起的进程。

3) write函数通过alloc_ep_req函数分配一个写请求变量,并为该变量中的complete设置一个请求,调用usb_ep_queue函数向端点提交I/O写请求。当内核向USB Device写完数据时就会调有刚才的完成函数。在完成写数据之前可以通过add_wait_queue和chedule()函数让进程挂起,在完成函数中唤醒挂起的进程。

至此整个驱动程序就设计完成了,图2为USB Host 与 USB Device 通信测试效果。

4 结束语

USB Device 为众多电子产品提供了一个与PC信息交互的更好的方案。本文通过对USB协议介绍,以及对Linux下USB驱动程序进行分析,在此基础上实现了USB Device驱动程序进行设计。实践表明该设计是可行的。

参考文献:

[1] 冯国进.嵌入式Linux驱动程序设计从入门到精通[M]北京:清华大学出版社,2008.

[2] 薛园园.USB应用开发技术大全[M].北京:人民邮电出版社,2007.

[3] 刘少峰,韦克平.USB软件系统的开发[J].计算机应用研究,2002,19(30).

[4] 于明,范书瑞,曾祥烨.ARM9嵌人式系统设计与开发教程[M].北京:电子工业出版社,2006.

[5] 李志辉,查建中.嵌入式Linux开发平台的USB主机接口设计[J].电子产品世界,2002(23).

驱动程序范文第8篇

由于工作关系,我经常涉及pc机与设备接口的工作,从pc机这方面要做的工作看来,主要是通过接口处理设备的中断,通过i/o端口或内存地址与外设互相传递数据。从计算机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢?

目前国内流行的pc操作系统有三种:dos,win95/98系列,windowsnt。dos是单用户、单任务操作系统,由于pc机硬件处理速度不断提高,基于单用户、单任务的操作系统越来越不能充分发挥硬件的功能,现在只应用于一些老式pc及其它个别场合,有逐渐被淘汰的趋势;win95/98系列和windowsnt属于多任务操作系统,不论从其原理还是界面上看,这两种操作系统都比dos有着无可比拟的优越性,这两种操作系统虽然在界面和操作上及其相似,但其内部实现的诸多方面有许多区别,有些区别是本质上的。win95/98设计目标是针对一般家庭用户,安全性及可靠性存在许多薄弱环节,就可靠性而言,win95/98系列不能很好的防止多任务环境中某个进程的非法操作导致系统中其它程序甚至整个系统的崩溃,而windowsnt在这方面及其它诸多方面设计的相当严谨。这两种操作系统是microsoft公司同一时期的产品,但针对不同的使用群,所以在一些重要场合及生产实践中应该选择windowsnt作为计算机的操作系统,此外,从发展趋势来看,windowsnt已经成为定型产品,具有相对稳定性。

在不同操作系统下编写驱动程序是有很大区别的,在dos平台上,应用程序和设备驱动程序之间没有标准的接口,它们在外部表现为一个扩展名为exe的文件,驱动程序的作用被柔和在应用程序中,这样,应用程序为了使用不同厂商的同一类设备,必须了解这些设备在接口上具体的硬件实现,同时,对于一个特定型号的硬件产品,所有支持它的应用软件中对于控制整个设备动作的这部分代码,可能被多次重写。这种情况不适应硬件及应用软件的飞速发展。windows系统在这方面,进行了根本性改进,把控制设备动作的这部分代码独立出来,提出了设备驱动程序的概念,驱动程序是应用程序和硬件设备之间的一个桥梁,应用程序与驱动程序之间有明确的接口,应用程序通过与驱动程序交换信息,达到控制外设的目的。接口定义的操作是面向设备的,这就是说,在应用程序的设计中,并不用关心对外设操作的具体硬件实现,只是对驱动程序发出一系列指令既可;驱动程序接受来自上层应用程序的指示,具体操纵实际硬件,完成用户功能。具体实现上,win95/98系列与windowsnt又有所区别,windowsnt是严格按照上述思路设计的;而win95/98系列不那么严格,其支持上述思路,但同时应用程序也可以绕过驱动程序直接访问实际物理i/o,这样做,增加程序设计的灵活性,但同时,对系统可靠性造成一定隐患。这也正是win95/98系列可靠性低于winnt的原因之一。

表1-1 三种操作系统下访问接口比较

操作系统 应用程序访问接口方式 访问权限 dos 直接访问 所有[注] windows95/98 通过设备驱动程序*.vxd 所有[注] 直接访问 仅i/o端口 windowsnt 通过设备驱动程序*.sys 所有[注] [注]‘所有’指i/o端口,ram总线,中断,dma。

windowsnt设备驱动程序的组成原理

windowsnt操作系统结构分为用户模式和内核模式,用户模式下的编程为应用程序的设计,而开发设备驱动程序,则属于内核模式下的编程,内核模式组件包括nt executive(exxxx),内核(kexxx),硬件抽象层(halxxx)。其层次如图2-1所示,其中nt executive 包括几个独立的软件组件,它们是系统服务接口(zwxxx),对象管理器(obxxx),配置管理器,进程管理器(psxxx),安全监视器(sexxx),虚拟空间管理器(memxxx),本地进程调用,i/o管理器(ioxxx)。内核模式的系统服务并不是全部公开的,而是提供了一系列开发设备驱动程序需要的函数(上文括号内为函数形式,函数手册参见[2]kernel-mode drivers-reference章节),换言之,这些函数功能是所有内核模式的系统服务功能的子集。

驱动程序由一系列相对独立的函数组成,由i/o管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成:

1.driverentry() 运行于passive_level

驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。

2.xxunload() 运行于passive_level

用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。

3.xxisr() 运行于dirql

中断服务程序。

4.xxdpcforisr() 运行于dispatch_level

中断服务程序后处理程序,以排队方执行不太关键代码的执行,由于排队机制及优先级,不会造成代码拥塞从而提高中断服务程序的响应并且提高系统总体i/o吞吐率。

5.xxopen() 运行于passive_level

处理应用程序win32函数createfile()请求。

6.xxclose() 运行于passive_level

处理应用程序win32函数closehandle()请求。

7.xxdispatch() 运行于passive_level

处理应用程序win32函数deviceiocontrol()请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。

windowsnt使用一个抽象化的cpu优先级方案, irql代表中断请求级,任一时刻cpu总处在某一级上,这个数越大,表示当前的任务重要性越大,如表2-1所示,从上至下irql越来越小。所有上述驱动程序的函数及内核模式函数都必须运行于各自的irql级上,如果违反这一调用规定,会造成系统崩溃。例如,中断服务程序(xxisr)运行于dirql及上,那幺在编写中断服务程序时,只能调用允许在这一级运行的内核模式函数(并不是所有内核模式函数都能运行于dirql级)。至于每个内核模式函数运行级别的说明,详见[2]kernel-mode drivers-reference章节。

windowsnt是一多任务系统,许多设备的驱动程序同时存在系统中,这样各个设备所占用的资源(中断,i/o及ram地址空间)很有可能冲突,如果设备驱动程序在运行之前不进行‘探测’而使用自己硬件设备的资源,有可能和系统内其它设备占用的资源冲突,后果不堪设想。windowsnt通过注册表管理硬件资源的占用信息,作为内核模式信任的组件,驱动程序使用硬件资源之前必须遵循‘查询-申请-使用-释放’的原则(如图2-2所示)。

表2-1

来源 irql 硬件 highest_level power_level ipi_level clock2_level clock1_level profile_level dirqls(i/o设备中断平台相关的级数) 软件 dispatch_level apc_level passive_level windowsnt设备驱动程序的编写步骤与实例

现以一实际例子简要说明设备驱动程序的开发步骤,本例以cinrad天气雷达测试卡实际应用为原型,加以简化、抽象。

第一步,了解被控设备的接口情况。

本例为一isa卡,占用pc机9号中断,i/o地址360h及ram地址d0228h分别一个字空间。

第二步,确定驱动程序的功能。

驱动程序每当9号中断达到时,检查运行标志变量runflag(为一bool变量),如果等于true,中断累积计数器counter(为一unsigned short变量)增一,把这个值写入ram地址d0228h,再从这个地址读出,如果读出值等于写入值,把这个值写入i/o地址360h,这个地址的内容会驱动板卡上的led显示,把写入值显示出来;如果读出值不等于写入值,设置运行标志变量false。如果运行标志变量等于false,什幺也不做,返回。

第三步,定义驱动程序与应用程序的软件接口。

本例定义两个接口命令:

ioctl_iocarda_start:应用程序设置驱动程序内部的运行标志变量等于true。

ioctl_iocarda_read:应用程序查询驱动程序内部的中断累积计数器的值。

第四步,画流程图。这里列举本例实现的几个主要流程图,(图略)。

系统传给驱动程序入口函数系统定义的‘设备驱动对象’drobj,通过初始化这个对象的一些成员变量,把驱动程序其它函数与这个对象联系起来。

isa卡为非即插即用设备,事先把资源占用信息手工添加注册表如下:

[hkey_local_machine\system\currentcontrolset\services\iocarda\parameters]

"irq"=dword:00000009

"iospan"=dword:00000004

"ioadd"=dword:00000360

"ramadd"=dword:000d0228

"ramspan"=dword:00000002

其中iocarda以下各子键及其值为自定义,设备驱动程序利用相应函数检索出这些值。

(3)每个设备驱动程序可以创建若干系统定义的‘设备对象’,本例根据需要只创建了一个‘设备对象’dev。‘设备对象’其中一个成员变量为指向一非分页的物理内存块deviceextension,这块内存大小及内容为用户自定义,由于dev或deviceextension对象会被系统传给驱动程序的其它函数,这样驱动程序各函数通过访问这块内存区,实际上达到互相传递信息的功能。本例在这里存储设备硬件资源信息及runflag和中断计数器counter,这些数值在driverentry()初始化后,供驱动程序的其它函数使用。

图3-2为中断服务程序iocardaisr()流程图。操作系统接受中断,连同deviceextension等参数传给中断服务程序,中断服务程序利用这些参数,实现要求功能。

图3-3为iocardadispatch()流程图,这个函数用于处理来自上层应用程序的命令。上层应用程序通过以下程序段设置驱动程序中runflag值为true,从而启动中断服务程序开始计数。

bool cmd=true;

htest = createfile(...); //打开设备

deviceiocontrol(htest, //设备句柄

ioctl_iocarda_start,//命令

&cmd,sizeof(bool), //输入缓冲区地址及大小

null,0,&c,null);

closehandle(htest); //关闭设备

上层应用程序通过以下程序段查询当前的中断计数器的值并存于变量w中。

unsigned short w;

htest = createfile(...);

deviceiocontrol(htest,

ioctl_iocarda_read, //命令

null,0,

&w,sizeof(unsigned short),//输出缓冲区地址及大小

&c,null);

closehandle(htest);

其中deviceiocontrol()执行后,操作系统调用iocardadispatch()函数,如流程图所示,这个函数内部通过一个开关语句,根据命令执行相应的分支。驱动程序与应用程序通过此函数接换数据时,操作系统提供4种可选数据缓冲方式,本例由于数据i/o量比较小,故选用‘缓冲i/o’ (method_buffered)。过程是,i/o管理器首先分配一个非分页池,它的大小为调用者输入缓冲区和输出缓冲区的较大者,第一段程序为sizeof(bool),第二段程序为sizeof(unsigned short),它的地址存到irp(i/o请求包)的associatedirp.systembuffer域中,然后把输入数据拷贝到这个池中,在第一段程序中cmd的值true被拷贝到池中,这样驱动程序通过rtlcopybytes()函数再把池中的值拷贝到驱动程序的runflag中。iocardadispatch()函数执行完,i/o管理器把池中的内容拷贝到调用者的输出缓冲区,在第二段程序中,驱动程序通过rtlcopybytes()函数把counter的值拷贝到池中,从而最终传递到应用程序变量w中。

第五步,编程。在编写设备驱动程序的同时,要编写一个简单的应用程序用于测试设备驱动程序的一些功能。

第六步,驱动程序的载入。

驱动程序c语言源程序经过编译、连接生成扩展名为sys的文件,本例为iocarda.sys,把这个文件拷贝到\winnt\system32\drivers\系统目录下,同时手工添加如下信息到注册表:

[hkey_local_machine\system\currentcontrolset\services\iocarda]

"errorcontrol"=dword:00000001

"start"=dword:00000003

"type"=dword:00000001

要保证iocarda子键名与驱动程序文件名一致,其中type=1表示此驱动程序为内核模式驱动程序,start=3表示此驱动程序手动载入,errorcontrol=1表示当驱动程序发生错误时,日志记录错误并显示一个消息框。这样当windows重新启动后,通过使用控制面板中的device小应用程序,从列表中找到iocarda设备名,按start按钮,于是,设备驱动程序就驻留内存并在底层开始工作了。

第七,调试。设备驱动程序没有界面,完全在系统底层运行,为了观察驱动程序的运行状态,windowsnt ddk提供windbj.exe程序用于设备驱动程序的调试,调试设备驱动程序需要两台cpu体系结构完全相同的计算机,一台为‘宿主机’,运行windbj.exe程序,另一台为‘目标机’,运行设备驱动程序,两台计算机用串口线连好,进行一系列软件设置(参见[1]第17章),就可以开始调试了,从‘宿主机’可以控制及观察‘目标机’上驱动程序的运行情况。最常用的调试手段是在驱动程序中必要的位置加入dbgprint()函数,这个函数可以把指定信息输出到‘宿主机’windbg.exe窗口中,通过分析这些信息,可以了解驱动程序当前的运行情况。

结束语 windowsnt是一个复杂而严密的系统,驱动程序的开发不可避免的涉及现代操作系统理论及其它许多计算机理论,内涵相当广泛,本文围绕着开发实践从一定深度探讨了windowsnt设备驱动程序开发最基本的知识及一般方法,希望对读者有所帮助,对于复杂,特殊应用的实现及编程技巧,有待于读者在各自实际应用中不断探索。

参考文献

1.《windowsnt设备驱动程序设计指南》 art baker著 机械工业出版社

驱动程序范文第9篇

关键词:WDM;PCI;DDK;设备驱动程序

中图分类号:TP333文献标识码:A 文章编号:1009-3044(2011)07-1534-03

Designed of PCI Device Driver Based on DDK

ZHAO bin1, TIAN Ze1, CHEN Jia2

(1.Xi'an Shiyou University, Xi'an 710065, China; 2. Xidian University, Xi'an 710072, China)

Abstract: This paper takes a PCI device as an example, describes WDM drivers and PCI bus protocols. And introducing a method of WDM driver design base on DDK(Driver Development Kit), realizing identification and testing function.

Key words: WDM; PCI; DDK; device driver

因为某项目的需求,需要在PC机上调试一PCI设备,在Windows系统下实现主机通过PLX9056桥芯片对PCI设备的访问,但前提条件是当操作系统装载驱动程序正确的情况下。如果驱动程序装载不正常,主机首先就不能够识别PCI设备;如果驱动程序运行不正常,用户就不能正确的访问PCI设备。因此,PCI驱动程序是实现主机识别板卡以及正确访问设备的关键。

目前常用的驱动开发工具有:微软提供的DDK(Device Driver Kits),以及第三方厂商提供的DriverStudio和WinDriver,现在大多数驱动开发人员都是使用DriverStudio和WinDriver,其中DriverStudio将DDK函数按照逻辑功能组织,把很多常用功能封装成类,建立了一个基于C++语言的面向对象的编程环境,大大降低了开发难度和开发周期;WinDriver将一些基本的操作如存储读写、I/O端口读写、中断服务、DMA操作等进行了封装,开发者只需编写一个外壳来调用这个驱动程序,就可以完成对硬件设备的访问。前两种开发工具使用简单,开发速度快,但开发的驱动程序执行效率受到限制。DDK虽然编程难度较大,对编程人员的要求也较高,但是功能强大,编程灵活,使用范围广,可应用于各类硬件驱动程序的编写,而且有助开发人员深刻理解驱动程序和WDM(Windows Driver Mode),所以DDK是更理想的开发工具。

1 WDM式设备驱动的概述

1.1 WDM概念

设备驱动程序需与操作系统最底层进行交互,不同的操作系统底层结构对应于不同的设备驱动程序模型,也影响设备驱动程序的兼容性。在Windows 2000以后,微软公司加入了新的驱动程序模型,这就是WDM。

1.2 WDM式驱动的基本结构

WDM模型中,两个驱动设备对象分别是物理设备对象(Physical Device Object,简称PDO)和功能设备对象(Function Device Object,简称FDO)。其关系是“附加”与“被附加”的关系。

当某个设备插入PC机时,PDO会自动创建。确切的说,PDO是由总线驱动创建的。PDO需要配合FDO一起使用,系统会提示检测到新设备,要求安装驱动程序。需要安装的驱动程序就是WDM程序,此驱动程序就是创建FDO并附加到PDO之上。当一个FDO附加在PDO上的时候,PDO设备对象的子域AttachedDevice会记录FDO的位置。PDO靠近物理设备,被称作底层驱动,而FDO接近发出I/O请求,被称作高层驱动。并且从WDM驱动的设计思路可以看出,WDM驱动是支持即插即用的。

在FDO和PDO之间还会存在过滤驱动,在FDO上面的过滤驱动被称作上层过滤驱动,在FDO下层的驱动,被称作下层过滤驱动。在WDM模型中,过滤驱动不是必须存在的,PDO和FDO是必须的。

2 PCI总线协议

PCI总线协议是PC上最基本的总线,一般显卡、网卡都设计成PCI总线设备。其他总线都是挂在PCI总线上的。例如,ISA总线是通过PCI-ISA桥设备挂在PCI总线上,而USB总线是通过USB HOST设备挂在PCI总线上的。

2.1 PCI总线简介

PCI(Pheripheral Component Interconnect)总线是当前最流行的总线之一,是由Intel公司首先推出的一种局部总线。它定义了32位数据地址总线,并且可以扩展为64位,其支持突发读写操作,也同时可以支持多组设备。

在当前的PC体系结构内,几乎所有外部设备采用的各种各样的接口总线,均是通过桥接电路挂接在PCI系统内的。在这种PCI系统中,Host/PCI桥称为北桥,连接主处理器总线到基础PCI局部总线。PCI-ISA桥称为南桥,连接基础PCI总线到ISA总线。其中南桥通常还含有中断控制器、IDE控制器、USB控制器和DMA控制器等设备。

2.2 PCI配置空间简介

PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定其映射的基址。

系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置,实现真正的即插即用。

3 开发实例

Windows从总体上分为内核模式(Kernel Mode)和用户模式(User Mode)。驱动程序运行在内核模式下,拥有操作系统的最高权限。编写驱动程序主要是为了操作硬件设备,这些硬件设备的操作主要包括访问物理映射内存、设备端口等。而应用程序是运行在用户模式下,应用程序无法直接与硬件设备通信,必须借助于驱动程序。

所开发的PCI设备应用软件和驱动软件驻留在PC机中,其中应用软件与特定的子系统有关,应用软件通过调用PCI驱动软件实现子系统功能要求。应用软件和驱动软件在Windows下的关系如图2所示。

3.1 PCI设备驱动程序

PCI模块驱动软件是实现PCI板卡与宿主机(PC机)应用软件间的接口控制与数据传递的专用软件,它可提供PCI板卡与PC机各类消息数据的读、写支持,以及对PCI板卡内部程序的调度。

PCI驱动程序开发软件是DDK,用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为IRP(I/O Request Package,即输入输出请求包)数据结构,不同IRP数据会被“派遣”到不同的派遣函数(Dispatch Function)。

驱动软件的入口程序是DriverEntry,在DriverEntry中包含了AddDevice函数的设置。PCI设备是属于被动加载的设备,操作系统必须加载PDO后调用AddDevice例程,而AddDevice例程就是负责创建FDO并附加到PDO之上。

其次,DriverEntry必须加入IRP_MJ_PNP的派遣回调函数。IRP_MJ_PNP就是即插即用IRP,是由即插即用管理器发送给PCI驱动程序的。

当启动PCI设备的时候,设备管理器将IRP_MN_START_DEVICE发送给PCI驱动。在处理完此IRP后,驱动程序会将处理结果存储在IRP的设备堆栈中。程序可从当前堆栈就可以获取PDO从PCI配置空间中的有用信息,如中断号、设备物理内存及IO端口信息等。因为实际应用中,不能提前知道这些描述符在数组中出现的位置,因此在实现中必须用循环先把资源值提取到一组局部变量中,然后在处理这些资源信息。

对于枚举PCI设备资源,主要分为四类,分别是设备端口、设备物理内存、DMA、中断等。在实现中,程序里枚举了I/O端口资源,物理内存资源和中断资源。其中,I/O端口资源包括I/O端口地址、I/O端口地址长度,物理内存资源包括基地址0和基地址2,中断资源包括中断请求级、中断向量、CPU亲缘关系、中断模式以及共享中断等。

在设备即将停止的时候,即插即用管理器将发送IRP_MN_REMOVE_DEVICE给PCI驱动,这个IRP标志着设备即将关闭,PCI驱动在此时会做一些资源回收工作。

因此开发PCI设备驱动最重要的一步就是将IRP_MN_START_DEVICE中获取的设备资源记录下来,以便以后使用。

3.2 PCI设备应用程序与驱动程序的通讯

PCI设备应用程序的开发软件是VC6.0,在应用程序中寻找设备是通过设备接口和设备号决定的,其实现过程主要是通过SetupDiXX系列函数得到设备接口。

在实际应用中,PLX9056的本地配置寄存器映射在PLX9056配置寄存器中基地址寄存器0,待测试设备的内存空间由硬件设计人员映射在PLX9056的基地址寄存器2。因此,在应用程序中需定义供用户使用的通过基地址0和基地址2的读写接口函数。例如:

基本的读函数有:

ULONG ReadFromBase0(HANDLE handle,ULONG Offset,

UCHAR *buff,ULONG length);

ULONG ReadFromBase2(HANDLE handle,ULONG Offset,

UCHAR *buff,ULONG length);

基本的写函数有:

ULONG WriteToBase0(HANDLE handle,ULONG Offset,

UCHAR *buff,ULONG length);

ULONG WriteToBase2(HANDLE handle,ULONG Offset,

UCHAR *buff,ULONG length);

应用程序可以通过Win32 API DeviceIoControl操作设备与驱动程序互相通信。DeviceIoControl内部会使操作系统创建一个IRP_MJ_DEVICE_CONTROL类型的IRP,然后操作系统会将这个IRP转发到派遣函数中。

而以上的读写接口函数的本质就是调用DeviceIoControl来实现的。例如从基地址0读函数ReadFromBase0函数原型,如图3。

其中,DDK定义的DeviceIoControl的函数原型为:

BOOL DeviceIoControl{

HANDLE hDevice,//设备句柄

DWORD dwIoControlCode, //控制码

LPVOID lpInBuffer,//输入数据缓冲区指针

DWORD nInBufferSize, //输入数据缓冲区长度

LPVOID lpOutBuffer, //输出数据缓冲区指针

DWORD nOutBufferSize,//输出数据缓冲区长度

LPDWORD lpByteReturned,//输出数据实际长度单元长度

LPOVERLAPPED lpOverlapped //重叠操作结构指针

};

DeviceIoControl的第二个参数是I/O控制码,控制码也称IOCTL值,是一个32位的无符号整型。DDK提供一个宏CTL_CODE,定义为:

CTL_CODE(DeviceType,Function,Method,Access)

其中,DeviceType为设备对象的类型;Function为驱动程序定义的IOCTL值,0x000到0x7ff为微软保留,0x800到0xfff由程序员自己定义;Method是操作模式,其中包括METHOD_BUFFERED为使用缓冲区方式操作,METHOD_IN_DIRECT为使用直接写方式操作,METHOD_OUT_DIRECT为使用直接读方式操作,METHOD_NEITHER为使用其他方式操作;Access为访问权限。

如上述例子ReadFromBase0函数,在驱动程序中用CLT_CODE宏定义定义的IOCTL码:

#define IOCTL_READ_BASE_BAR0 CTL_CODE(

FILE_DEVICE_UNKONWN,

0x800,

METHOD_BUFFERED,

FILE_ANY_ACCESS)

驱动程序中IOCTL派遣函数的实现是首先得到当前I/O堆栈,从I/O堆栈中再一次得到输入缓冲区大小,输出缓冲区大小,以及IOCTL。在实现过程中,运用C语言中的switch语句分别处理不同的IOCTL。在每个IOCTL情况下,就必须使用DDK提供的内核函数WRITE_REGISTER_XX系列函数和READ_REGISTER_XX系列函数操作物理设备内存。具体流程如图4所示。

当应用程序需要操作读写接口函数时,设备管理器就会发送相对应的IRP给设备驱动,驱动程序就会调用DispatchControl函数找到相应的IOCTL码,应用程序再调用DeviceIoControl操作设备。

4 结束语

本文以实际应用的一个PCI设备驱动开发为例着重介绍了驱动程序和应用程序的相互关系,并且还简单介绍了WDM式设备驱动和PCI总线协议。设备驱动程序是Windows操作系统重要的内核组建,在系统中起至关重要。如果驱动程序出错,很容易使Windows操作系统崩溃。开发利用DDK开发驱动程序能够使开发者加深对Windows内核和WDM规范的理解。

参考文献:

[1] 张帆,史彩成.Windows驱动开发技术详解[M].北京:电子工业出版社,2009.

[2] Walter Oney.Programming The Microsoft Windows Driver Model[M].1999.

[3] PCI Tech Company.PCI 9056BA Data Book[M].USA,2003.

[4] Microsoft Corporation,Windows 2000 DDK[M].USA,2000.

驱动程序范文第10篇

关键词:计算机驱动;复杂性;测试模块;开发研究

引言

设备是通过输入输出总线与中央处理器相连,通常集成在同一块电路上,更像是附加的设备,但都具有特定的功能,比如一些基本的硬件,像鼠标、键盘等。计算机的驱动程序是介于操作系统及设备之间的软件,提供了管理和操作设备所必须的接口。驱动程序针对操作系统和应用程序的请求进行转换,成为控制设备所使用的操作命令。与此同时,它也用来回应和处理各种事件以及请求。此外,在对设备状态进行查询时也需要依靠驱动程序来完成。在现代计算机操作系统中,驱动程序的代码占据了很大一部分,也是产生各类错误最主要的原因,也是由于其自身的复杂性所造成的,也给对其进行维护的工作造成了很大的困难。

现代电子技术的发展更求更加完善的计算机驱动程序与之相适应,原来的开发方法很难再开发出高质量的系统,面临着非常多的挑战,比如驱动程序复杂性较难控制、可复用性较低、质量较为低劣等。因此,需要创新开发方法,改善开发的效率,减少错误发生的概率,确保驱动质量。

1 模块设备驱动程序开发途径

计算机驱动程序实际上是一层软件,也是一种特殊程序能够在计算机和设备之间建立通信渠道,其结构整体上较为复杂,并且以前的开发方法对人的因素要求很高,利用模块化的开发方法能够比较有效的解决传统开发方法中存在的许多问题。

1.1 计算机驱动程序的功能及其结构

计算机驱动的作用就是将高层的请求转换为底层的输入和输出序列,在此过程还需要接口以及资源跟操作系统的其他部分交互。这个过程也就是实现驱动接口的过程,需要操作系统通过驱动接口提供集合和代码。以往的开发方法会涉及到供应商和制造商以及集成商,需要三方面主体的配合。

算机驱动程序是一种可以向操作系统提供硬件设备的接口的特殊程序,驱动的主要功能就是将请求转换为操作序列。驱动接口实际上是一种接口的集合,由操作系统提供给计算机驱动。主要是由内核中的子系统来提供这一功能,除此之外,驱动接口还为计算机提供以太网卡设备驱动等相关[1]。计算机驱动程序在发挥其功能时实际上就是编写实现代码的一个过程,主要就是输入和输出操作,主要是针对设备寄存器和内存进行的相关操作,实现对设备的控制。该过程还会涉及到其他内核的服务,主要以子系统提供的服务为主,还有内核提供的服务。除此之外,还要做到了解基本的平台信息。总的来说,在计算机驱动程序发挥功能时主要用到的接口和资源包括操作系统提供的驱动接口、内核、C库、子系统、设备的访问接口及寄存器和系统的平台资源。计算机的驱动程序功能的发挥主要依据上述接口和资源,进行交互,涉及平台、设备以及操作系统三个主要的对象。

1.2 原本的开发方法

芯片的制造商会依据编写出来的描述语言或者其他的手段进行芯片的生产,然后系统集成商会根据需要购买芯片,将其集成到平台上,目标计算机系统就此诞生,这是硬件方面的开发方法。关于软件的开发方法,操作系统的开发商会提供一个操作平台,同时将芯片的有关资料集成到电路上[2]。相关的开发人员会开发出每个系统下面的驱动程序,提供这一类的接口的集合和基本的内核服务以及子系统服务等,把知识有效地转换成代码,驱动程序也就建立成功。但是,要想正确地运行需要对各种资源进行整合然后再将其转换成程序代码。

2 模块化分析、接口的设计及实现

2.1 模块化分析

模块化实际上是生产过程中的一种分工的思想,能够有效解决很多复杂的问题。用在软件开发方面就是将待开发的软件进行划分,使之成为较小的部分,称之为模块,然后针对每个模块进行单独的开发和测试,最终整合成完整的软件。模块化方法的应用对于解决复杂软件的开发问题非常有效,并且具有灵活的特点,也更容易刺激创新成果的出现,也会加强专业化的程度。软件开发的模块化方法主要涉及两部分,即接口和实现。

2.2 操作系统

该模块的主要作用就是读取平台上硬件的配置参数,对计算机模块的接口进行调用,同时完成内核的交互,实现驱动接口。除此之外,还要为计算机各模块提供基本的内核服务。在模块化之后,操作系统还要调用系统平台提供的具体参数。该模块的组成也是依靠驱动接口的集合和代码。

2.3 设备

设备模块的作用就是能够直接和设备的输出输入端进行交互,并且能够提供一层接口来对设备的运行进行控制,也就是设备控制层,其中包括属性和状态的描述,还有一些调用接口。其中包括一些代码的实现以及对很多资源和接口的调用。

2.4 系统平台

该模块主要是给设备提供硬件环境,并且也能够为其他设备所用。能够提供设备的地质空间,有效的提升计算机的工作效率,使得所有的硬件都能够在计算机的运行过程中发挥各自的作用。总的来说,计算机的正常运行离不开中央处理器、内存等,系统平台模块能够完整的提供这些硬件的描述。

3 结束语

通过对模块设备驱动程序及其开发途径来分析计算机驱动程序的模块开发,然后针对模块开发中三个重要的模块进行分析,包括操作系统、设备和系统平台。还对三个模块的关系及其设计中的一些基本问题做了简单的探讨,与业内人士共同学习。

参考文献

[1]刘振宇,王恒.基于形式化方法的测试驱动开发研究[J].计算机工程与设计,2008,29(15):3944-3946.

[2]季义钦.模块化设备驱动开发途径研究[D].南京:南京大学,2013.

上一篇:离婚程序范文 下一篇:vb程序设计范文