驱动程序

2024-07-12

驱动程序(精选12篇)

驱动程序 篇1

我们在安装完操作系统后, 第一件事情就是给硬件安装驱动程序。没有安装驱动程序的电脑没办法工作, 或者没办法发挥出它的性能来。这是一类特殊的程序, 我们在日常使用电脑时并不会直接使用它, 但它却在系统中起着不可或缺的作用。它就是我们生活中的幕后英雄, 默默奉献着自己的光和热。

●驱动程序及其工作原理

驱动程序的英文名称为“Device Driver”, 全称为“设备驱动程序”。是一种可以使计算机和设备通信的特殊程序, 相当于硬件的接口。操作系统只有通过这个接口, 才能控制硬件设备的工作。假如某设备的驱动程序未能正确安装, 便不能正常工作。因此, 驱动程序被誉为“硬件的灵魂”、“硬件和系统之间的桥梁”等。

设备驱动程序用来将硬件本身的功能告诉操作系统, 完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相通讯。当操作系统需要使用某个硬件时, 如让声卡播放音乐, 它会先发送相应指令到声卡驱动程序, 声卡驱动程序接收到后, 马上将其翻译成声卡才能听懂的电子信号命令, 从而让声卡播放音乐。简单地说, 驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系, 图1显示了驱动程序工作的原理。

理论上任何硬件要在系统中使用都必须安装驱动程序, 但在实际的使用过程中, 类似键盘、鼠标、显示器、CPU之类的设备, 我们并没有给它们安装驱动程序, 为什么它们能直接使用呢?原来为了简化硬件厂商开发设备驱动的工作量和方便用户的使用, 微软为常见类型的设备提供一系列的总线驱动程序和类型驱动程序。总线驱动内置在Windows中, 包括PCI、AGP、并口、串口、IEEE 1394接口等。类型驱动具有为许多标准类型设备所需的基本功能, 如PC必备的键盘、鼠标、显示器设备。

电脑在启动到操作系统之前, 其实一些设备已经可以使用, 如显示器可以显示图像、键盘可以操作使用等。那这些设备难道能没有驱动就可以直接使用吗?其实电脑在启动时, 最早启动的是主板的BIOS。BIOS里除了基本输入输出系统外, 也有最基本的硬件驱动程序, 所以启动操作系统之前, 有些硬件也是可以使用的。从这个角度来看, 我们也可以把BIOS看成是集成简单的驱动程序的一个微型操作系统。

所以, 硬件不是不需要驱动, 而是有些驱动系统已经预置了。

●驱动程序的分类

1.简版驱动程序

操作系统自带的驱动程序通常称为简版驱动程序, 也叫兼容驱动程序。简版的驱动程序最大的优点就是方便, 当系统安装好后, 大部分硬件就可以直接使用了。当然它的缺点也非常明显, 就是不能充分发挥出硬件的性能, 通常版本比较低。

2.正式版 (公版) 驱动程序

官方正式版驱动是指按照芯片厂商的设计研发出来的, 经过反复测试、修正, 最终通过官方渠道发布出来的正式版驱动程序, 又名公版驱动。稳定性、兼容性好是官方正式版驱动最大的亮点, 同时也是区别于发烧友修改版与测试版的显著特征。

3.微软认证版驱动程序

WHQL是Windows Hardware Quality Labs的缩写, 中文解释为:Windows硬件质量实验室 (认证) 。这是微软对各硬件厂商驱动的一个认证, 是为了测试驱动程序与操作系统的相容性及稳定性而制定的。微软规定凡是通过WHQL认证的产品都被授予“Designed for Windows”标志, 其相关信息都会出现在微软官方网站和操作系统的硬件兼容列表 (HCL) 中, 以方便查询。WHQL认证过程十分严格, 因此一款通过了WHQL认证的驱动程序可以说在Windows系统中基本不存在兼容性问题。此类别驱动最大的特点是稳定性高, 和微软操作系统的兼容性好, 对于普通用户来说, 首选驱动最好是通过微软WHQL认证的版本。

4.第三方驱动程序

第三方驱动一般是指硬件产品OEM厂商发布的、基于官方驱动优化而成的驱动程序。第三方驱动拥有稳定性、兼容性好的优点, 并且比官方正式版拥有更加完善的功能和更加强劲的整体性能。因此, 对于性能和功能要求比较高的用户, 首选推荐使用厂商发布的第三方驱动。

5.修改版 (改版) 驱动程序、Beta版驱动程序

为了满足游戏爱好者更多的功能性要求, 经发烧友修改后的显卡驱动也就应运而生了。这是最早出现的修改版驱动程序。当然后来除了显卡, 其他硬件也出现了各种修改版。这种驱动一般是在原版基础上由发烧友进行修改, 存在一定的不稳定性, 适合对硬件非常了解的人使用。

Beta版驱动程序是正式版或第三方驱动正式推出之前发布的测试版。它往往是为了提高硬件的性能或解决以前版本存在的BUG而发布, 在稳定性和兼容性方面可能会存在一些问题, 和修改版一样也是发烧友的“专利”。

6.一站式驱动服务

对不太了解计算机硬件的人来说, 安装驱动程序是一件比较头痛的事。当然, 只要有需要, 就会有市场;有市场, 就会有人进入。现在, 自动进行硬件识别及自动下载、安装驱动的软件也应运而生, 一站式解决问题的方式, 大大地方便了“菜鸟”装机一族。其中最著名的有驱动精灵 (如图2) 和驱动人生两个软件。

安装启动驱动精灵以后, 在主界面点击“立即检测”, 就会列出电脑中没有安装驱动或可以升级驱动的硬件。只要点击“立即解决”, 驱动精灵就会自动去服务器下载、安装相应的驱动程序。

除此以外, 驱动精灵还可以对驱动程序进行备份。在重装系统以后, 我们可以直接通过驱动精灵恢复驱动程序, 不用再上网下载。如果我们对驱动程序有一定的了解, 不想在重装系统以后安装驱动精灵, 那我们也可以在备份时选择“备份驱动到文件夹”, 到时通过设备管理器来更新驱动程序就可以了。

如果电脑在安装系统以后, 网卡也没有驱动, 这时驱动精灵是不能工作的。我们可以在驱动精灵网站下载扩展版 (集成万能网卡驱动) 。当驱动精灵在没有检测到网络连接时, 就会自动检测网卡类型, 同时安装好网卡驱动程序, 接下来就可以让驱动精灵去发挥它的作用了。

当然, 驱动精灵这类软件并不一定能完全正确地识别你的硬件。有时识别正确, 但下载的驱动程序不能安装或安装时出现错误的情况也不少见。在这种情况下, 我们就需要自己想办法去识别硬件、获取驱动、安装驱动。

●硬件识别方法

为了安装某个硬件的驱动程序, 我们首先需要正确识别相应的硬件。

1.看说明书

这个方法虽然简单甚至有些可笑, 但确实有很多人忘记了这个原始的方法。很多硬件的说明书都会介绍硬件的具体型号以及驱动程序的安装方法。也许我们要解决的问题其实只是举手之劳。在兴师动众之前, 不妨先把说明书拿出来看一看上面是否留有蛛丝马迹。

2.自检界面查看硬件信息

电脑在启动时会进行自检, 检测结果会显示在屏幕上。我们可以通过阅读这些信息来了解一些硬件的芯片和型号。例如, 在图3中可以看出其古老的显卡型号为Ge Force4 MX 440。

在图4中, 显示了电脑中的PCI设备列表。其中的Vendor ID (厂商ID) 和Device ID (设备ID) 是PCI-SIG组织统一编制命名的。我们把其中对安装驱动有用的设备, 如Network Controller (网卡) 、Multimedia Device (声卡) 等设备对应的Vendor ID和Device ID记下来, 登录网站 (http://www.pcidatabase.com/) 便可查询这些硬件设备的型号。

如下表所示, 从“Device Class” (设备类别) 我们可以判断对应的硬件是什么设备。

在电脑启动时, 我们往往来不及看清这些信息就启动到了下一屏。我们可以在显示信息时按下键盘上的“Pause Break”键, 电脑会暂停启动。我们在看清相关信息以后, 按任一键就继续启动。

我们也可以在设备管理器中打开相应硬件的属性, 然后在详细信息中找到硬件ID (如下页图5) 。有些笔记本不同批次的硬件配置会有些区别, 如无线网卡、摄像头等, 官方网站会提供多个驱动以供不同硬件使用。这时我们就可以根据硬件ID来下载正确的驱动程序。

3.软件检测

如果说明书太简单, 或者说明书根本找不到了, 自检界面也看不到硬件类型, 那最直观方便地获取硬件信息的方法, 就是使用硬件检测软件。例如, Everest这款著名的硬件检测软件, 可以比较准确地检测出硬件的型号, 甚至还提供驱动程序的下载网址 (虽然大多不能成功下载) 。如果要找到一块集成主板, 我们要先查找显卡的型号, 在左边选择“主板─芯片组”, 然后在右上“设备描述”下选择“北桥”, 就可以看到这块主板的显卡型号, 下页图6中显示的电脑用的是“ATI Radeon HD 3200”显卡。如果是集成声卡, 在“南桥”中可以找到声卡的型号。

4.观察硬件

如果利用以上方法我们都没能正确识别硬件, 那就要使用“拆机大法”了。即打开机箱, 直接观察硬件。通常硬件会有相关的标识。例如, 我们要知道主板的型号, 可以看下PCB板上有没有标识。有些硬件如显卡、声卡等, 在芯片上会有具体标识。就像下页图7的主板集成声卡, 可以在芯片上看到“ALC650”字样, 这就是其声卡的芯片型号。根据这个型号我们就可以到网上找相应的公版驱动程序。

●驱动程序的获取

在知道了硬件的型号以后, 接下来我们就要去获取相应的驱动程序了。驱动程序从哪里来?

1.Windows自带简版驱动

Windows系统在安装完以后, 会给绝大多数硬件自动安装简版的驱动程序。如果Windows没有某些硬件的驱动程序并且已经联上网, 那么可以通过自动搜索微软的官方网站来获取驱动。但因为微软网站只有一些主流硬件的驱动, 所以在大多时候会失败。Windows自带驱动只能保证电脑的基本工作, 所以我们要在可能的情况下安装其他驱动程序。

2.厂商自带驱动程序

在购买硬件时, 一般厂商都会附赠带有驱动程序和某些工具的光盘。这些驱动程序基本上是第三方驱动, 是比较能发挥硬件性能的, 如果没有特别需要, 建议安装这些驱动程序。当然, 如果第三方驱动版本太低, 可以考虑升级。

3.官方网站获取驱动

各大硬件厂商都会将硬件的相应驱动程序放在官网供购买者下载。例如, 联想的笔记本, 可以在官网通过主机编号或机型查询驱动, 也可以下载驱动安装工具一键下载、安装驱动, 或者通过手动选择产品类型来完成驱动的查找和下载 (如图8) 。一般官方网站为了提高硬件性能、解决以前存在的BUG, 会对主流硬件的驱动进行一定的升级。建议追求性能或要解决BUG的去看看官方网站的驱动有没有提供新版的驱动。

4.专业驱动程序下载网站下载

为了解决硬件驱动的问题, 有些人从中看到了商机。驱动之家 (www.mydrivers.com) 是最早从事专业的驱动程序收集、下载的网站, 现在已经有了非常齐全的硬件驱动程序库。我们根据硬件型号可以找到其相关的驱动程序。专业驱动程序下载网站的优势在于更新非常及时, 版本非常丰富, 我们可以根据自己的需要来下载相应的版本, 特别适合对硬件有比较深入了解的用户。

除此以外, 各大下载网站也开辟了驱动专区。如果我们找不到某个驱动程序, 也可以尝试去太平洋、中关村等驱动下载专区去搜索一番。

●驱动程序的安装

当我们获得了硬件相应的驱动后, 就面临如何安装的问题了。

与普通的程序安装方法一样, 一般的驱动程序都会提供一个安装程序, 双击这个可执行文件就可以按提示一步步完成安装。如果有多个文件, 一般可通过双击setup.exe或install.exe来进行安装。

还有一种情况, 有时我们下载的驱动程序并没有提供安装程序, 甚至连一个可执行文件都没有。我们观察下载到的文件, 其中必然有个inf文件。以.inf为扩展名的文件是从Windows 95时开始引入的一种描述设备安装信息的文件, 它用特定语法的文字来说明要安装的设备类型、生产厂商、型号、要拷贝的文件、拷贝到的目标路径, 以及要添加到注册表中的信息。通过读取和解释这些文字, Windows便知道应该如何安装驱动程序。只要右击这个文件, 就会在快捷菜单中出现“安装”的选项, 点击就可以安装相应的驱动程序了。

新加入的硬件, 系统一般会自动识别, 然后出现驱动程序安装向导。如果系统自带有这个硬件的驱动程序, 可以选择“自动搜索更新的驱动程序软件”;否则, 我们可以选择“浏览计算机以查找驱动程序软件”, 来手工指定驱动程序的位置 (如图9) 。

如果以前就停用了某个硬件或安装时出现了错误, 那我们也可以从设备管理器重新安装驱动。如图10所示, 在“其它设备”里多个设备前面出现了“问号+感叹号”, 说明驱动程序有问题, 右击相应的硬件, 选“更新驱动程序”, 就会出现驱动程序安装向导。如果我们用驱动精灵在备份驱动程序时是以文件夹形式备份的, 那也只能用这种方法来恢复。

驱动程序的安装有没有什么讲究呢?

首先是驱动程序安装的先后顺序问题。在大多数情况下, 不管你按什么顺序安装, 是不会有多大问题的, 但也不排除意外的出现。经过大家的总结, 驱动程序的安装, 按从核心到外围的顺序比较安全, 一般遵循以下顺序:主板芯片组 (Chipset) →显卡 (VGA) →声卡 (Audio) →网卡 (LAN) →无线网卡 (Wireless LAN) →红外线 (IR) →触控板 (Touchpad) →PCMCIA控制器 (PCMCIA) →读卡器 (Flash Media Reader) →调制解调器 (Modem) →其他 (如电视卡、CDMA上网适配器等) →外设 (如打印机、扫描仪等) 。

其次, 在驱动程序安装后一般系统会要求重启, 但为了节省启动时间, 很多人选择了暂不重启。在一般情况下, 这也是没有问题的, 但偶然也会碰到有些硬件会安装失败。如果碰到这种情况, 可以卸载怀疑有冲突的硬件驱动, 再重新安装, 安装时根据系统要求进行重启。如果是厂商提供的第三方驱动, 如主板上有多个设备要安装驱动程序, 在用主板自带光盘安装驱动时, 如果在安装完一个驱动后不重新启动, 是不会自动安装下一个设备的驱动的, 这时我们还是按要求重启吧。

驱动程序就是一部电影的导演, 虽然它只是在幕后工作, 但它才能指挥各个“演员”的行动, 决定了整个剧组的“演员”能不能和谐共处。好的导演, 能导出一部精彩的大戏;好的驱动程序, 才能让硬件发挥出它的极致性能。

摘要:新的一年, “高手论技”继续伴随大家前行, 身处一线的你, 就那些技术上最常遇到的故障、最需要解决的难题、最成熟的应用……都可以在此畅所欲言, 各抒己见。是继续围观还是现身说法, 新浪微群http://q.t.sina.com.cn/264976, 期待您的共同参与。随着计算机应用的不断人性化, 我们的许多工作便利了, 这其中驱动程序功不可没, 但作为幕后英雄, 却甚少为人关注。在此, 主持人和嘉宾将分两期来探讨驱动程序所带给我们的精彩。

驱动程序 篇2

根据百度百科:驱动程序,英文名为“Device Driver”,全称为“设备驱动程序”, 是一种能够使计算机和设备通信的特殊程序,能够说相当于硬件的接口,操作系统只有通过这种接口,才能控制硬件设备的工作,如果某设备的驱动程序没有能正确安装,便不能够正常工作, 所以,驱动程序被誉为“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。

刚安装好的系统操作系统,很可能驱动程序安装得不完整。硬件越新,接下来可能性越大。菜菜熊之前观察的“图标很大且颜色难看”能够没有安装好驱动的原因。

二、驱动程序的作用

跟随电子技术的飞速发展,计算机硬件的能力越来越强大。驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这种名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。

硬件可能缺少了驱动程序的“驱动”,当本来能力非常非常强大的硬件就不能够根据软件发出的指令进行工作,硬件能够空有一身本领都没有根据发挥,毫没有用武之地。这时候,计算机就正如古人所说的“万事俱备,只欠东风”,这“东风”的角色就落在了驱动程序身上。那么看来,驱动程序在计算机使用上还真起着举足轻重的作用。

根据理论上讲,所有的硬件设备都就得安装相应的驱动程序才能正常工作。但像CPU、内存、主板、软驱、键盘、显示器等设备却并不就得安装驱动程序也能够正常工作,而显卡、声卡、网卡等却必须要安装驱动程序,不然的话便不能够正常工作。这是为什么呢?

这主要是因为这些硬件对于一台个人计算机来说是必需的,所以早期的设计人员用这些硬件列为BIOS能直接支持的硬件。换句话说,上述硬件安装之后就能够被BIOS和操作系统直接支持,不会就得安装驱动程序。根据这种角度来说,BIOS也是一种驱动程序。但是对于别的的硬件,比如:网卡,声卡,显卡等等却必须要安装驱动程序,不然这些硬件就不能够正常工作,

三、驱动程序的界定

驱动程序能够界定为官方正式版、微软WHQL见证版、第三方驱动、发烧友修改版、Beta测试版。

1、官方正式版

官方正式版驱动是指按照芯片厂商的设计开发出来的,通过反复测试、修正,最后通过官方渠道公布出来的正式版驱动程序,又叫公版驱动。一般官方正式版的公布方式包括 公布及硬件产品附带光盘这两种方式。稳定性、兼容性好是官方正式版驱动最大的亮点,同时也是区别于发烧友修改版与测试版的显著特征。所以推荐普普通通网民使用官方正式版,而喜爱尝鲜、体现个性的玩家则推荐使用发烧友修改版及Beta测试版。

2、微软WHQL见证版

WHQL是Windows Hardware Quality Labs的缩写,是微软对各硬件厂商驱动的一个见证,是为了测试驱动程序与操作系统的相容性及稳定性而制定的。也可以说通过了WHQL见证的驱动程序与Windows系统基本上不存在兼容性的疑问。

3、第三方驱动

第三方驱动那么是指硬件产品OEM厂商公布的基于官方驱动优化而成的驱动程序。第三方驱动拥有稳定性、兼容性好,基于官方正式版驱动优化并比官方正式版拥有非常完善的功能和非常强劲的整体能力的特性。所以,对于品牌机网民来说,笔者推荐网民的首选驱动是第三方驱动,第二选才是官方正式版驱动;对于组装机网民来说,第三方驱动的选择可能比较复杂一点,所以官方正式版驱动仍是首选。

4、发烧友修改版

发烧友令笔者第1步就联想到了显卡,这是为什么呢?因为一直以来,发烧友很常都被用来形容游戏爱好者。笔者的这种想法也正好和发烧友修改版的诞生典故相符的,因为发烧友修改版的驱动最先能够出现在显卡驱动上的,因为众多发烧友对游戏的狂热,对于显卡能力的期望也能够非常高的,这时候厂商所公布的显卡驱动就往往都不能够满足游戏爱好者的需要了,所以经修改过的以满足游戏爱好者很多的功能性需要的显卡驱动也就应运而生了。现在,发烧友修改版驱动又叫改版驱动,是指经修改过的驱动程序,而又不专指经修改过的驱动程序。

5、Beta测试版

没有驱动程序的打印机 篇3

Q:我有一台旧的台式机,一块闪存盘不管是插入机箱前置插口还是后置插口,都无任何反应,打开设备管理器发现USB设备项旁边都是黄色感叹号。请问,这该如何解决?

A:出现这样的问题后,可以先考虑将黄色感叹号的USB设备项全部删除,让系统自动重新搜索并安装这些设备驱动,看是否能够解决问题。另外,也有因为主板上的电子元件出现老化等问题而导致无法识别的,或者是USB接口堆积灰尘过多,或者供电不足等,也有可能导致这样的问题出现,这类硬件故障,对于没有经验的用户来说,只能是送专业维修点维修了。

◆ 修改应用商店程序的默认安装位置

Q:Windows 8系统中,通过应用商店下载安装的程序都被默认安装到C:\Program Files\WindowsApps,我想将其安装到其他分区中。请问这该如何设置?

A:首先按Win+R键调出运行对话框,输入“regedit”并回车,打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx,然后右击“Appx”项,在“权限”选项中先赋予当前账户的修改权限,再将其右侧的“PackageRoot”值修改成你需要指定的其他分区,作为新的安装位置即可。

◆ 找回Windows 8的桌面“回收站”

Q:我平时删除文件时习惯将文件直接拖放到桌面的回收站中,今天发现桌面上的回收站图标不见了。请问,如何找回桌面的回收站图标?

A:只要右击桌面空白处,选择“个性化”,然后在打开的窗口中选择“更改桌面图标”,在打开的窗口中勾选“回收站”选项,确认即可。

◆ 64位系统如何选择软件

Q:我安装的是64位的Windows 8系统,在选择软件时,据说有的软件选择32位的比64位的更稳定,而有的则需要选择64位的。请问,64位系统到底该如何选择软件?

A:正常情况下,如果软件本身没有额外的插件程序,64位系统下使用64位版本的软件效果可能更好些。不过有些软件会有很多第三方插件程序(如Office、播放器、浏览器等软件),而这些第三方插件程序的开发商各不同,使用的规则也不相当,如果平时喜欢使用第三方插件程序,那就考虑选用32位版本,避免因为插件版本跟不上而导致各种故障。

◆ 用SSD硬盘总是死机

Q:我有一块64位的SSD硬盘,只安装了Windows 8系统,但最近在每天早晨开机时,都会不定时死机,只有强制关机后再开才能恢复正常。请问这是什么原因?

A:对这样的问题,可以按下面的步骤进行排查:首先检查SSD硬盘本身是否有问题,可以使用CrystalDiskInfo软件进行检测。如果SSD硬盘本身没有问题,再查看硬盘剩余空间是不是不足,如果硬盘空间剩余较少,也容易引发死机问题。此外,SSD硬盘在工作时,最好在BIOS中将硬盘工作模式设置为ACHI模式,这样会大幅提高硬盘性能。

vxWorks串口驱动程序设计 篇4

统提供回调函数) , 从而将底层驱动与上层 (一般为用户接口层) 隔离开来。这种隔离使得底层驱动程序员可以编写针对具体硬件的驱动程序并加入到内核中去, 这样的中间层一般被称为虚拟驱动层或者接口层。硬件驱动程序员需要清楚了解驱动程序与系统的接口所在。对系统接口层了解的越清楚, 编写出的驱动程序将更具健壮性和稳定性。

串口驱动既然作为底层驱动程序的一个方面, 系统不例外的也提供了其与上层的接口层。对于vxWorks操作系统而言, 这个接口层由ttyDrv, tyLib所代表。接口层本质上就是系统内核自定义的一套操作函数和数据结构, 底层设备驱动程序将使用其中某些函数和结构与接口层进行交互, 接口层经过进一步的处理后, 继续与上层进行交互。如上文所述, 所谓的上层一般即指用户接口层, 如I/O层。之间关系如图1所示。

ttyDrv和tyLib被称为虚拟驱动层, 二者协同工作共同管理设备驱动层。虚拟驱动层提供的功能主要有:

(1) 以字符设备的形式向上层 (I/O系统层) 注册其读写和控制函数。注册是在ttyDrv () 函数中完成的。而ttyDrv则调用iosDrvInstall完成其注册功能。其对上层注册的读写和控制函数如下: (以下所谓“对应上层XXX函数”是指上层XXX函数将针对tty设备进一步调用此处提供的函数, 如上层read函数针对tty设备将调用ttyRead函数进行进一步的处理)

ttyOpen:tty设备打开函数, 对应上层open函数。

ttyClose:tty设备关闭函数, 对应上层close函数。

tyRead, :tty设备字符读取函数, 对应上层read函数。

tyWrite:tty设备字符发送函数, 对应上层write函数。

ttyIoctl:tty设备控制函数, 对应上层ioctl函数。

(2) 向下层 (设备驱动层) 注册回调函数。作为对下层的接口, 针对是读还是写稍有不同。对于写而言, 在上层I/O层调用write函数写设备时, ttyWrite函数需要主动调用底层驱动程序相关函数发送字符。而对于读而言, ttyRead函数则直接从该层 (虚拟层) 读缓冲区中读取字符, 当缓冲区为空时, 等待 (阻塞方式) 或者立刻返回错误 (非阻塞方式) 。而此时读缓冲区的填充是由底层驱动主动进行的, 当底层驱动接受到一个字符时, 其调用虚拟层提供的机构函数将字符写入缓冲区中以供上层读取。

换句话说, 从虚拟层的角度:当写字符时, 在将字符填入写缓冲区后, 其需要直接调用底层驱动函数发送写缓冲区中的字符。

而当读字符时, 则不会直接调用底层驱动函数, 而只是检查读缓冲区是否有可读字符。读缓冲区中字符的填入是由底层驱动异步进行的。

从底层驱动的角度:对于写字符时, 如果发送完一个字符后, 其需要从写缓冲区中 (如果非空) 取下一个字符继续发送, 由于底层驱动不被允许操作虚拟层中的写缓冲区, 所以虚拟层即以回调函数形式提供一个函数 (tyITx) 供底层驱动从写缓冲区中取字符进行发送。当写缓冲区为空时 (即目前所有字符已被发送完) , 底层驱动将停止发送, 处于空闲状态。此时如果I/O层调用write函数, 继而到达虚拟层的ttyWrite函数, ttyWrite函数在将字符填入写缓冲区后, 其就需要启动底层驱动从空闲状态转入发送状态。这种启动即通过调用底层驱动的某个函数完成。而这个函数的地址在底层驱动程序初始化时将被提供给虚拟层。

对于读字符, 由于字符到达的随机性, 其不能等待上层调用write函数, 才进行接收, 而是只要有字符, 就进行接收, 并将接收到的字符上传给虚拟层, 至于如何对这些字符进行处理将由应用程序决定。此处底层驱动将接收到的字符上传给虚拟层即是通过虚拟层提供的回调函数 (tyIRd) 完成的。

综上, 虚拟层提供给底层驱动的回调函数有两个:①发送:底层驱动从写缓冲区中取字符函数:tyITx;②接收:底层驱动向读缓冲区中写字符函数:tyIRd。

(3) 完成其内部初始化 (如读写缓冲区分配) 和其他各种与硬件无关的辅助功能。

内部初始化主要有:①读写缓冲区分配;②互斥信号量分配;③重要变量和函数指针初始化。

作为底层驱动程序, 向上其与虚拟层交互, 向下其与具体硬件交互。所以其主要完成的功能也可以分为三个方面:

(1) 向上层提供回调函数。底层驱动需要提供一些函数供上层 (虚拟驱动层) 调用, 如启动发送函数, 硬件配置函数等等。一般虚拟层为了完成其功能, 对于其需要调用的底层功能实现函数会专门以一个数据结构的形式进行封装, 底层驱动程序需要对这个数据结构进行初始化后调用虚拟层提供的函数将信息通报给虚拟层。针对串口而言, 这个数据结构即为SIO_DRV_FUNCS结构, 该结构中所有成员均为函数指针, 底层驱动必须编写对应的完成相应功能的函数, 用这些函数地址对SIO_DRV_FUNCS结构进行初始化并通知给虚拟驱动层。

/*sioLib.h文件*/

typedef struct sio_drv_funcs SIO_DRV_FUNCS;

typedef struct sio_chan /*内核使用 SIO_CHAN结构表示一个串口设备*/

{

SIO_DRV_FUNCS * pDrvFuncs;

} SIO_CHAN;

struct sio_drv_funcs /*驱动函数指针定义 */

{

int (*ioctl) (SIO_CHAN *pSioChan, int cmd, void *arg) ;

int (*txStartup) (SIO_CHAN *pSioChan) ;

int (*callbackInstall) (SIO_CHAN *pSioChan, int callbackType,

STATUS (*callback) (void *, ...) , void *callbackArg) ;

int (*pollInput) (SIO_CHAN *pSioChan, char *inChar) ;

int (*pollOutput) (SIO_CHAN *pSioChan, char outChar) ;

};

vxWorks操作系统对每个串口用一个SIO_CHAN结构表示, SIO_DRV_FUNCS结构作为SIO_CHAN结构中一个字段而存在。串口驱动程序必须定义一个SIO_CHAN结构并对其进行初始化, 实际上即对SIO_DRV_FUNCS结构字段进行初始化。在实现上, 为了同时保存其它信息, 驱动程序定义一个自定制数据结构。如下所示。

/*底层设备驱动程序文件:arm926_uart.c*/

typedef struct _ARM926_CHAN{

/* SIO_CHAN类型字段必须是自定制结构的第一个成员 */

SIO_CHAN sio; /*内核定义的SIO_CHAN结构类型 */

…… /*其他信息定义*/

} ARM926_CHAN;

/*定义一个自定义ARM926_CHAN结构类型变量*/

ARM926_CHAN pChan;

/*初始化一个SIO_DRV_FUNCS结构*/

LOCAL SIO_DRV_FUNCS arm926UartDrvFuncs =

{

arm926UartIoctl,

arm926UartTxStartup

arm926UartCallbackInstall,

arm926UartPollInput,

arm926UartPollOutput,

};

/*在初始化函数中对SIO_CHAN结构字段进行初始化*/

void arm926UartDevInit (ARM926_CHAN * pChan)

{

……

pChan->sio.pDrvFuncs = &arm926UartDrvFuncs;

……

}

arm926UartTxStartup函数即是底层驱动提供的供虚拟层调用的发送启动函数。

arm926UartCallbackInstall函数也是由底层驱动程序提供, 虚拟层调用该函数向底层驱动注册tyITx, tyIRd函数地址, 即虚拟层提供给底层驱动的其 (虚拟层) 内部读写缓冲区操作函数, 也即前文中所述的虚拟层向下层提供的两个回调函数。之所以提供arm926UartCallbackInstall函数, 原因在于:①底层驱动并不知道虚拟层提供的回调函数究竟为何?②虚拟层并不清楚底层驱动将自己提供的回调函数安放在何处?

所以虚拟层提供另外一个函数指针callbackInstall, 由底层驱动实现, 虚拟层提供回调函数地址作为参数传入, 至于这些回调函数地址被保存在何处由底层驱动决定。

此处底层对callbackInstall 的具体实现为arm926UartCallbackInstall。对于串口, 网口, 一般存在两种工作模式:中断和查询。中断模式为硬件正常工作模式, 查询模式一般使用在系统调试时。由于查询模式需要明确的由上层进行控制何时进行接收和发送, 所以底层驱动程序必须提供对应的函数供上层调用, 而上层提供函数指针以获取函数地址, 这就是SIO_DRV_FUNCS结构中pollInput, pollOutput函数指针的目的所在。

(2) 控制下层硬件进行字符接收和发送及其他硬件配置工作。底层驱动程序完成的主要功能即控制具体硬件进行字符的接收和发送。在软件实现上, 也即读写相关硬件寄存器内容。正常方式下, 对于串口, 网口这样与外界进行数据交换的设备, 一般通过中断方式进行数据的接收和发送, 中断方式特别对于数据接收具有重要的意义, 因为数据接收时刻对于本设备而言完全不可知, 或者说具有相当的随机性, 内核或者应用程序无法预知何时有数据到达, 从而正好对其进行读取, 所以需要底层驱动程序的异步接收功能:即无论数据何时到达, 底层驱动都进行接收, 并上传给虚拟驱动层进行缓冲, 当应用程序需要读取数据时, 直接从缓冲区中读取即可。

而对于数据发送而言, 中断同样起着至关重要的作用, 通过中断, 底层驱动才可获知此次数据是否发送出去, 从而继续发送下一波数据。

总而言之, 无论是串口驱动还是网口驱动, 中断起着枢纽作用, 是中断将具体硬件与驱动软件联系起来。所以在软件架构上, 无论是串口还是网口, 其都是围绕一个中断处理程序而进行, 由中断处理程序再调用其他相关处理函数进行进一步的处理。

(3) 内部控制结构初始化和其他硬件相关辅助功能。对于驱动程序而言, 其必须维护一个自定义数据结构, 这个结构中将既包括上层需要的结构信息, 也包括对应硬件的具体信息, 如硬件控制寄存器基地址, 中断号等等。

至于其他辅助功能, 包括硬件的统计信息收集和其他一些辅助配置功能。

以上从层次上介绍了虚拟驱动层和设备驱动层的基本功能。了解层次关系对于下文中各层次之间的交互至关重要。下文即从串口初始化开始介绍串口驱动所关联的内核部分。

对于vxWorks而言, 串口初始化是在usrInit函数中 (定义在usrConfig.c文件中) 进行的, 调用路径如下: (以下采取“文件名:函数名”形式说明, 底层驱动程序文件名为arm926_uart.c, 该文件中定义的函数名均以arm926打头, 以与内核函数区分)

usrConfig.c:usrInitundefined:sysHwInitundefined: sysSerialHwInitundefined

arm926_uart.c: arm926UartDevInit ()

sysHwInit是对所有外围硬件进行初始化的函数, 对于串口而言, 具体的初始化函数在sysSerial.c文件sysSerialHwInit函数中进行。而sysSerialHwInit函数实现即与具体硬件平台相关, 对于某个具体的平台而言, 需要对sysSerialHwInit函数进行自实现, 该实现继续调用具体硬件驱动程序初始化函数, 如前文中对于ARM926EJS开发环境, 其对应初始化函数即为arm926UartDevInit。

此时进行的初始化只是底层驱动程序的初始化:

(1) 完成相关数据结构初始化, 包括虚拟层提供的相关结构的初始化从而提供给虚拟层相关回调函数地址。

(2) 完成相关硬件寄存器的配置。配置后硬件处于非工作状态, 但所有的硬件准备工作已经完成, 只是相关工作使能位尚未开启。

此时除了开启硬件正常进行工作, 已完成前文所述底层驱动程序所需完成的三个任务中所有方面。

内核相关初始化在usrRoot函数中完成。从代码实现看, 如果需要在内核中包括串口组件, 必须在config.h文件中定义如下常量:

#define INCLUDE_SERIAL

#define NUM_TTY N_SIO_CHANNELS /*串口通道数*/

#define CONSOLE_TTY 0

#define CONSOLE_BAUD_RATE 115200

INCLUDE_SERIAL变量作为控制是否包含串口设备的总开关。对于需要使用串口的平台, 必须定义该变量。

NUM_TTY为串口通道数, 这也是平台相关的。

CONSOLE_TTY表示控制终端使用的通道号, 一般定义为0。

CONSOLE_BAUD_RATE即控制终端所使用通道的波特率。

usrRoot函数种对串口组件初始化涉及到的关键函数有三:

(1) ttyDrv () 内核实现。该函数实现在前文中已给出。该函数主要完成的功能是虚拟驱动层向上层 (I/O层) 注册读写和控制函数:诸如ttyWrite, ttyRead, ttyIoctl等等, 以供上层调用。

(2) ttyDevCreate () 内核实现。该函数完成对下层相关函数的注册以及内核相关缓冲区和信号量等其它辅助功能初始化工作。

经过以上调用, 此时虚拟驱动层已完成前文中所述该层所需完成的三个主要任务, 内核串口组件已处于正常工作状态。

(3) sysSerialChanGet () 内核提供函数原型, 平台相关实现, 由底层设备驱动程序员完成编写, 与底层串口驱动数据结构相关。该函数的实现读者可参考templateARM目录下 (或者其它体系结构下对应的目录) sysSerial.c文件。

到此, 只剩下向内核注册中断程序 (调用intConnect函数完成) 和开启硬件使能位。这是在sysClkConnect函数中完成的。函数调用路径如下: (采用“文件名:函数名”方式说明, 底层串口驱动程序名为arm926_uart.c) 。

usrRoot:sysClkConnectundefined:sysHwInitundefined:sysSerialHwInitundefined

arm926_uart.c: arm926UartDevInit2 ()

arm926UartDevInit2函数的实现较为简单:①调用intConnect完成中断处理程序的注册。②调用intEnable使能该中断。③写具体硬件相关寄存器使能位开启硬件工作。

所有串口相关准备工作完成, 串口进行正常的数据接收和发送。

底层驱动程序框架总结如下:

(1) 自定义描述设备的数据结构, 形式如前文所述。

(2) 初始化一个虚拟驱动层定义的SIO_DRV_FUNCS结构, 如前文所述。

(3) 编写中断处理核心函数。具体函数架构可参考Wind River提供的串口驱动模版文件。

(4) 提供底层驱动初始化函数, 修改sysSerial.c中相关函数实现, 调用这些初始化函数。注意由sysSerial.c中相关初始化函数对底层驱动程序中初始化函数的调用通过修改sysSerial.c中相关函数实现完成的, 而对于sysSerial.c文件中初始化函数的调用是由内核自动完成, 这从前文的分析中也可看出。所以底层驱动程序员可以而且应该改变sysSerial.c文件中相关函数实现, 但一定不可修改该文件中函数定义的原型:函数名称和参数类型与个数均不可进行改变。

(5) 编写其他具体处理数据接收和发送函数以及其它硬件配置和控制函数, 这些函数由中断处理核心函数调用。

结束语

为使内核上层结构独立于具体底层驱动程序实现, 几乎所有的操作系统都会在设备驱动层之上提供接口层, 一般我们将该层称为虚拟驱动层。作为驱动程序编写者, 除了要了解具体硬件功能外, 还需要清楚了解底层驱动程序与虚拟驱动层之间的联系。本文以vxWorks下串口驱动程序为例, 详细阐述了串口驱动程序底层模块和虚拟驱动层模块的功能以及基本实现, 并从内核初始化代码进行分析, 了解内核模块和底层驱动模块的初始化过程。文章最后附以具体代码给出了一个串口驱动程序的架构。串口驱动程序虽然是所有外围器件驱动程序中较为容易的一类, 但要编写出一个稳定健壮的串口驱动程序还是需要清楚地了解其涉及的各个方面, 希望本文可以在此方面助你一臂之力。

摘要:串口驱动程序由于涉及硬件寄存器较少, 所以是外围器件驱动程序编写中相对较为容易的一类, 但其与内核操作系统的联系上和其它驱动程序都具有相同的层次结构。论文着重阐述了vxWorks操作系统下串口驱动程序与其上层虚拟驱动层的交互, 并详细解释了虚拟驱动层和串口驱动程序的功能以及初始化过程。论文最后结合代码示例给出了串口驱动程序的架构。

关键词:vxWorks,虚拟驱动层,串口驱动

参考文献

[1]Wind River Systems Inc.vxworks kernel programmers guide.2006.09

[2]Wind River Systems Inc.vxworks device driver developers guide.2006.09

[3]Wind River Systems Inc.内核示例源代码

[4]陈智育等.VxWorks程序开发实践.北京:人民邮电出版社, 2004.

电脑的驱动程序有什么作用 篇5

1、总体介绍

设备驱动程序将操作系统和设备链接起来,使得操作系统能够识别设备,并为应用程序提供设备服务。驱动程序的任务,就是把操作系统的驱动接口“映射”到具体的功能实现中。

驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。

从理论上讲,所有的硬件设备都需要安装相应的驱动程序才能正常工作。但像CPU、内存、主板、软驱、键盘、显示器等设备却并不需要安装驱动程序也可以正常工作,而显卡、声卡、网卡等却一定要安装驱动程序,否则便无法正常工作。这是为什么呢?

这主要是由于这些硬件对于一台个人电脑来说是必需的,所以早期的设计人员将这些硬件列为BIOS能直接支持的硬件。换句话说,上述硬件安装后就可以被BIOS和操作系统直接支持,不再需要安装驱动程序。从这个角度来说,BIOS也是一种驱动程序。但是对于其他的硬件,例如:网卡,声卡,显卡等等却必须要安装驱动程序,不然这些硬件就无法正常工作。

2、举例说明

人是如何通过计算机的工作的,可见驱动程序的作用和重要性:

人(比如 你)

↓运行

应用程序(比如 超级解霸 播放VCD)

↓调用

操作系统的相应功能(光驱读盘并出现 图像 声音)

↓访问

★硬件驱动程序★(光驱、显卡 声卡等的驱动)

↓控制

硬件(光驱、显卡 声卡等)

移动版显卡也用新驱动程序 篇6

那么如何才能让本本用户也能用上最新的驱动程序呢?下面笔者就给大家介绍如何通过巧妙改造,让nVIDIA移动版显卡的用户都装上最新的驱动程序(以下如无特殊说明,均针对Vista 32bit系统)。

如果你使用的是nVIDIA的移动版显卡(以下简称N卡),不妨试试这个偷梁换柱的小技巧——用破解版的INF文件替换去动版ForceWare驱动程序中的相应文件,从而提供对移动版显卡的支持。

一、偷梁换柱,修改驱动

在nVIDIA的官网(http://www.nvidia.on/)下载最新ForceWare Vista 32bit驱动程序(截稿时为163.69版),解压缩之后备用。

然后下载名为nvcf.inf的破解文件(http://Work.newhua.com/pcd),在将其重命名为nvdisp.inf后,复制到刚才解压的ForceWare文件夹中(并覆盖同名文件)即可。

二、轻轻松松,完成更新

在做完修改之后,剩下的当然就是安装了。不过在安装驱动程序之前,还有一个“任务”需要完成——在“Vista控制面板”→“用户账户”下关闭UAC功能(安装驱动程序之后,可以重新开启UAC)。

做完这一切,就可以进入ForceWare文件夹,双击Setup.exe进行安装了。安装过程中系统会弹出无法验证驱动程序发行者的警告窗口,单击“始终安装此驱动程序软件”即可(图1)。

安装完成后,重新启动系统,打开nVIDIA控制面板的“帮助”→“系统信息”。看到没有?最新的“移动版”驱动程序已经成功“驻扎”到硬盘上了(图2)!

UEFI驱动程序的研究与开发 篇7

UEFI中引入了UEFI驱动程序模型的概念,采用驱动/协议的结构开发驱动程序,驱动程序和硬件完全独立,具有很强的扩展性,从而使得UEFI平台下添加新的特性变得简单[4]。

1 UEFI基本结构分析

UEFI主要由引导管理器、固件内核、协议、驱动模型等组件构成[4]。其中固件内核为UEFI的基础,它将底层硬件功能抽象化,为上层的引导管理器提供两种服务:引导服务和运行时服务。引导管理器是一个策略引擎,它使用固件内核提供的服务加载UEFI驱动程序和应用程序,并最终加载操作系统。

图1所示为UEFI的系统框架图。固件内核运行在PEI和DXE阶段,UEFI在PEI阶段直接与硬件层打交道,启动必需的硬件资源,譬如完成CPU和芯片组的初始化,进而满足DXE的执行启动条件;其后,系统在DXE阶段完成其他所有硬件的初始化,并为上层接口实现引导服务和运行时服务。引导管理器运行在DXE和BDS阶段,它通过加载框架驱动和平台驱动向上层提供UE-FI服务和接口,通过加载应用程序扩展系统功能,并在BDS阶段提供一个引导菜单,供用户选择引导设备。最终引导加载器在ROM上加载操作系统加载器,将控制权移交给操作系统,完成操作系统的引导。

2 CC2531 Zig Bee模块的设备驱动程序开发

CC2531是TI公司推出的一款用于IEEE 802.15.4或Zig Bee应用的片上系统解决方案,它能够以非常低的成本建立网络节点,支持低功耗的无线通信,主要用于远程控制、家庭控制等领域[5]。CC2531集成了USB2.0功能模块,可以更加方便地与主机进行通信。

本文将CC2531 Zig Bee模块(以下简称CC2531模块)通过USB接口与无线POS机的主机相连,CC2531模块通过Zig Bee无线网络与POS机的外设(如打印机、客显、键盘等)进行信息交互。此方案实现了在启动操作系统之前对POS机及其外设进行相应远程检测和诊断的功能。图2为无线POS机系统的结构框图。

2.1 UEFI驱动程序模型分析

2.1.1 句柄和协议

UEFI驱动程序模型使用句柄代表设备,每个设备对应有自己的句柄,句柄由一个或多个协议组成。协议是一个以128 bit的全局唯一标识符GUID(Globally Unique Identifier)命名的结构体,是一些指针和数据结构体或者规范定义的接口函数指针的集合,协议代表设备提供的一类服务,服务的具体功能在设备驱动程序(以下简称驱动)中实现。开发者首先找到指定设备句柄上挂载的指定协议,再通过协议提供的接口访问设备驱动中实现服务的功能函数,对设备进行操作。图3所示为设备句柄和协议的结构图。

2.1.2 驱动程序模型执行流程

UEFI驱动程序模型是一种用于简化设备驱动设计和执行的机制,遵循驱动程序模型规范的UEFI驱动的可执行镜像大小会得到有效的减小[6]。UEFI驱动程序模型的执行流程图如图4所示。

驱动程序模型采用UEFI驱动载入、连接的形式来进行硬件的辨识、控制及系统资源掌控。在DXE阶段,系统调用引导服务的Load Image()函数将驱动镜像文件加载到内存中,调用Start Image()函数执行驱动的入口函数来启动驱动。遵循模型规范的设备驱动在入口函数的初始化中不涉及任何硬件操作,仅仅实现驱动绑定协议(Driver Binding Protocol),协议包含3个接口函数:Support()、Start()和Stop()。Support()函数用来验证驱动程序与给定的设备句柄是否匹配;Start()函数负责驱动与句柄的连接,即将抽象I/O功能的协议安装到设备句柄上;相对应的,Stop()函数则会强制停止驱动对一个设备句柄的管理和控制,并卸载设备句柄在Start()中安装的所有协议。

DXE阶段执行完成后,虽然加载和启动了驱动,但还在等待着连接设备句柄。因此,在BDS阶段引导管理器将会调用引导服务的Connect Controller()函数执行驱动的连接过程。该函数执行所有驱动绑定协议的Support()进行设备句柄的验证,若验证正确,则会继续调用Start()连接驱动和设备句柄,并在设备句柄上安装抽象I/O功能的协议。

2.2 CC2531模块USB驱动协议栈

图5所示是由一系列驱动组成的多层次的、完整的USB驱动协议栈。处于上层的驱动会使用下层驱动提供的服务,并为更高层的驱动提供服务。首先,PCI总线驱动枚举设备时发现USB主机控制器,并在控制器句柄上安装EFI_PCI_IO_PROTOCOL协议,USB主机控制器驱动则使用EFI_PCI_IO_PROTOCOL协议提供的接口实现EFI_USB_HC_PROTOCOL协议。然后,USB总线驱动使用EFI_USB_HC_PROTOCOL协议服务实现对USB设备的枚举,生成CC2531设备句柄,并在设备句柄上安装EFI_USB_IO_PROTOCOL协议。最后,CC2531模块设备驱动使用EFI_USB_IO_PROTOCOL协议服务,在CC2531模块设备句柄上安装EFI_USB_CCCONTROL_PROTOCOL协议,完成CC2531模块驱动协议栈的加载。

2.3 CC2531模块驱动程序设计

CC2531模块驱动作为设备驱动,遵循UEFI驱动程序模型规范,使用驱动绑定协议的方式实现设备驱动的加载和连接。同时,驱动还提供通信协议EFI_USB_CC-CONTROL_PROTOCOL用于系统与CC2531模块间的通信,并通过Zig Bee网络与无线POS机外设进行通信。

2.3.1 绑定协议接口函数的实现

(1)Support():图6所示为Support函数实现流程图,函数首先检查给定的目标设备句柄是否安装有EFI_USB_IO_PROTOCOL协议,若有,则说明USB总线驱动已经辨认出该USB设备。其次,使用EFI_USB_IO_PROTOCOL协议提供的功能接口函数获取目标USB设备的设备描述符,描述符中的接口号、接口类型、子类型和协议等字段指定了的USB设备的类型,检查这些字段就可得知驱动是否为CC2531模块设备驱动,如果匹配则说明加载的驱动正确,就会执行Start()函数。以下是部分实现代码:

(2)Start():Start()函数的目标是使用USB总线驱动提供的协议服务在CC2531模块设备驱动中安装通信协议EFI_USB_CCCONTROL_PROTOCOL。函数首先打开设备句柄上挂载的EFI_USB_IO_PROTOCOL协议,使用该协议提供的接口函数Usb Get Interface Descriptor()和Usb Get Endpoint Descriptor()得到USB设备的接口描述符和端点描述符,分析设备描述符中的字段以确定USB设备信息和接口类型等参数。其次,为驱动私有数据结构体分配内存,并使用设备描述符中的字段信息进行初始化。最后,安装EFI_USB_CCCONTROL_PROTOCOL协议,完成驱动与设备的连接。图7所示为Start()函数实现流程图。

(3)Stop():Stop()是Start执行流程的逆过程,该函数用于卸载EFI_USB_CCCONTROL_PROTOCOL协议,释放驱动私有数据结构体占用的内存资源,关闭EFI_USB_IO_PROTOCOL协议,断开CC2531模块驱动与设备句柄的连接。

2.3.2 设备通信协议结构体

为了实现UEFI系统与CC2531模块之间的数据通信,本文设计了EFI_USB_CCCONTROL_PROTOCOL作为驱动的通信协议。该协议中包括了UEFI系统与CC2531模块间数据发送和接收的接口函数,还有部分与POS机系统外设交互的命令函数,如系统外设启动和复位命令的接口函数。协议的部分成员函数定义如下:

2.3.3 设备通信协议接口函数的实现

CC2531模块的USB接口固件代码是基于USB通信设备类CDC(Communication Device Class)协议实现的。CDC由通信接口类和数据接口类组成,通信接口类主要负责设备的管理和控制,数据接口类则负责数据的传输。CC2531模块的USB接口采用端点0作为通信接口类中的控制端点来管理设备的枚举和命令控制,数据接口类使用块传输输入(IN)端点和块传输输出(OUT)端点实现数据的双向传输。因此,UEFI系统对CC2531模块的枚举和识别采用控制传输方式,数据通信则采用批量传输方式。

协议的发送接口函数为Usb CCData Transmit(),该函数调用EFI_USB_IO_PROTOCOL协议提供的服务函数Usb Bulk Transfer(),通过将数据写入输出端口完成数据从主机到CC2531模块的批量传输。设备驱动发送数据接口函数的部分代码实现如下所示:

CC2531模块设备驱动的数据接收操作亦通过调用函数Usb Bulk Transfer()检测输入端口的缓冲队列完成。由于数据接收操作的被动性,驱动需要建立一套读操作的响应触发机制。本方案使用UEFI的事件(EVENT)机制实现对数据接收操作的响应:首先在驱动的Start()创建一个定时器事件,并在定时器的响应函数USBCC2531TimerHandler()中周期性调用Usb CCData Recevice()执行对输入端口缓冲队列的读操作,如果成功读到数据,则将读回的数据存入私有数据结构体的循环队列Usb Data Queue中。其次,创建一个等待事件Wait For Input String,并在等待事件的触发函数中检查循环队列,如有数据则读取,否则循环等待。部分数据读取操作的代码如下:

UEFI采用的模块化设计和驱动程序模型都为整体系统提供了良好的兼容性和扩展性,简化了UEFI驱动和应用程序的开发难度,提高了可维护性,有助于计算机固件的进一步发展。相对于传统BIOS,UEFI具有明显的优越性,越来越得到业界和市场的认可。本文从UEFI功能扩展的角度考虑,分析了UEFI的架构和驱动程序模型,设计并实现了CC2531模块的设备驱动程序,最终实现了在启动操作系统之前通过CC2531模块与无线POS机外设进行通信的目标。本方案的下一目标是扩展UEFI下的网络应用,实现对POS机系统的远程管理和诊断。

摘要:UEFI是Intel推出的新一代BIOS技术。在分析UEFI基本结构和驱动程序模型的基础上,详细论述了基于USB协议栈的CC2531 ZigBee模块的设备驱动程序设计与开发过程,实现了在操作系统启动之前主机与USB设备间的信息交互,扩展了UEFI的功能。

驱动程序 篇8

在Linux中, 为了简化对设备的管理, 将所有的外围设备都归结为三类:字符设备 (如键盘, 鼠标等) 、块设备 (如硬盘、软驱等) 和网络设备 (如网卡、串口等) 。为了将网络环境中的物理网络设备的多样性屏蔽, Linux对所有的网络物理设备抽象并定义了一个统一的概念:接口 (Interface) 。对于所有的网络硬件都是通过接口进行访问的, 接口实际上提供了一个对于所有类型的网络硬件的一致化的操作集合, 用于处理对数据的发送和接收。对于每一个已经驱动了的网络设备, 都用一个struct device的数据结构表示。在内核启动或者驱动模块插入时, 通过网络驱动程序, 向系统注册检测到的网络设备。在进行网络数据传输的时候, 网络驱动程序应通过标准的接口将数据发送到相应的网络层, 或者向网络发送数据包。

网络接口并不存在于Linux的文件系统中, 而是定义在内核中的struct device的一个数据结构中。每一个device的数据结构都是在驱动的时候创建的。而不像字符设备或者块设备那样, 即使不存在物理设备也存在有这个设备文件。这是在linux2.2内核版式本之后做的改动, 在这个版本之前, 一旦网络驱动程序被激活, 在/dev目录下就会出现eth0的文件, 对这个设备文件的读写就完成了网络传输, 这种做法现在还是用在字符设备和块设备上。现在的版本是数据包的发送和接收都通过直接对接口进行方问来完成。

2 网络驱动程序中用到的重要数据结构

Struct device这个数据结构是在系统中每一个设备的代表。每一个被系统检测到的网络设备都应该使用struct device类型的节点存在于dev_base中, dev_base是内核中存在的外部变量。如果采取的是内核检测网卡设备的方式, 那么在整个内核可能支持的网络设备的struct device节点。在网络驱动程序检测完之后, 将不存在的网络设备对应的节点删除, 剩下的就是检测到并且得到正确驱动的网络设备。

在这个数据结构里面, 主要定义的成员变量init函数指针, 这个函数指针初始化为设备驱动程序中提供的用来初始化device结构的过程, 这个过程实际上就是用来检测和驱动网络设备的。在检测进行之前, 每一个节点的init函数都指向对应的初始化函数;检测的时候对每一个节点都分别调用init函数指针, 如果成功返回的话, 将该节点保留。

同时, 在这个结构里面定义了对硬件设备的打开和关闭函数指针 (open, close) 硬件头的建立函数指针 (hard_header) ;硬件上数据的传输过程 (hard_sart_xmit) 。当网络设备打开的时候, 就可以通过这个网络设备开始传输数据了, 传输出来的数据存放在struct sk_buff结构里面。Hard_start_xmit函数指针是和某一种具体的硬件相关的, 通过d e v_q u e u e_x m i t这个外部函数调用hard_start_xmit函数指针完成网络数据的发送过程。

3 重要的驱动过程

驱动网络设备驱动程序方法有两种:通过模块驱动和通过内核启动时自动检测的方法。通过模块驱动的方法是Linux中使用模块设计的一种方案。我们知道, linux的内核是将所有的支持编译在一起的, 并不是微内核技术。如果对linux内核增加一项功能, 就把它的实现直接放在内核的代码中。不过为了让linux的内核体积不至于过于庞大, 采用了编译成模块的方式。在需要用到这个模块的时候, 用shell命令的insmod将该模块插入到内核运行空间;如果不需要了, 可以用rmmod命令将该模块卸载。I n s m o d触发的是cleanup_module () 函数。在init_module () 函数里面, 会调用到这种网络设备的init函数指针, 如果检测到了这种网络设备, 并且初始化成功, 那么就将这个网络设备对应的device结构插入到dev_base链表里面。

使用内核启动检测的方法有所不同。在系统启动的时候, 内核把所有编译在内核内部支持的网卡设备都初始化在一个s t r u c t device类型的dev_base链表里面, 然后对于每个节点都调用自己的init函数指针。如果该函数返回成功, 那么该节点对应的设备保留;否则, 该节点对应的设备不存在, 将该节点删除。这样, 在系统初始化的最后, 剩下来在dev_base里面的所有节点就全是系统检测到的网络设备了。

以ne.c为例, init_module () 函数首选初始化d ev设备的in it函数指针, 然后调用register_netdev () 函数在系统中登记该设备。如果登记成功, 那么模块插入成功, 否则就返回出错信息。在register_netdev () 里面, 首先检查该网络设备名是否已经确定, 如果没有, 就赋给一个缺省的名称。然后中, 调用网络设备驱动程序中的init_function, 也就是dev->init函数指针来检测网卡设备是否存在, 并且做dev的初始化工作。如果初始化成功, 将dev插入到dev_base链表的尾部。整个调用流程如图1所示。

内核启动的驱动方法, 内核启动的驱动方法和模块驱动的方法不同, 前者要对所有内核支持的网络调和设备进行检测和初始化, 而后者只需要检测和初始化被装载的网络设备。为了在启动的时候对所有可能存在的网络设备都检测一遍, 系统会在启动前将所有支持的网络设备对应的device结构都挂在dev_base链表上, 正如前文所述。然后使用net_dev_init () 函数依次对dev_base里面每一个节点都运行init函数指针, 如果返回成功, 那么该节点对应的设备存在;否则就将该节点删除。最后在链表中剩下的所有网络设备都是存在的, 并且已经完成了初始化。

USB设备接口驱动程序设计开发 篇9

1芯片概述

接口芯片与上位机通信并提供对外围CPU接口, 使得开发者无须去关心复杂的USB协议。 根据所设计产品的需求, 选择CYPRESS半导体公司的CY7C63001A USB控制器作为接口芯片。 CY7C63001A是符合低速USB低成本的一种解决方案, 它支持2个端点和1个设备地址。 CY7C63001A是一个高性能的8位RISC微控制器, 具有128字节的片内RAM, 4K字节的EPROM。 有12个通用I/O引脚[2]。

2硬件设计

该USB设备的硬件设计以CY7C63001A芯片为中心, 所连接的存储器是ATMEL公司的AT24C02, 接口兼容I2C总线规范, 通过一对串行时钟、 数据线对片内存储单元进行读写。 其电路原理图如图1所示。 按照USB规范的要求, 将微控制器第13引脚 (D-) 通过一个7.5K上拉电阻 连接到+5V的VBUS。 微控制器 第5引脚 ( P1.0) 连接24C02的第7脚 (WP, 写保护 ) , 控制24C02的写操作功能 。 WP为高电平读取24C02的内容; WP为低电平时可进行读、 写操作。 微控制器第1脚 (P0.0) 连接24C02的第6脚 (SCL, 串行时钟),为控制24C02的读写操 作提供时 钟 ; 微控制器 的第2脚 (P0.1) 接24C02的第5脚 (SDA, 串行数据 、 地址 ), 作为读写24C02的数据、 地址信号线。 微控制器通过这3根信号线完成对24C02的读写操作。

3编写驱动程序

系统内核与硬件之间设备通信要通过驱动程序, 它屏蔽了应用程序与硬件之间的细节。 Linux设备驱动分为3类: 字符设备、 网络设备与块设备。 USB设备一般都作为字符设备来进行处理, 这是是通过串行通信来读写数据, 在此所编写驱动即为字符设备驱动。 下面则结合该设备代码来介绍Linux下USB驱动的开发。

3.1注册与注销驱动

Linux下USB驱动程序在USB子系统里注册并提供一些信息。

这是USB驱动框架数据结构。 name是驱动程序模块的名字。 probe函数是在驱动向USB系统注册后当插入一个USB设备时将自动处理的函数。 disconnect函数在拔掉设备后自动运行。 fops是驱动提供的文件操作的接口结构, 通过这样注册一个file_operations函数指针, 使得可与用户空间实现方便的交互。

USB驱动程序初始化模块函数中通过调用usb_register进行注册, 传入刚才定义的驱动框架结构。

相应地在卸载模块函数中通过调用usb_unregister函数注销USB子系统。

在probe函数中, 驱动程序通常首先确认插入的设备是否可被接受, 即USB硬件的厂商号和设备号是否和驱动相匹配, 若相符则在devfs子系统中注册设备, 允许devfs用户通过fops定义的文件操作接口来访问该设备。

当拔掉USB设备时, 会调用disconnect函数, 驱动程序需要从devfs上注销。

3.2数据处理函数

当USB驱动与设备绑定好后, 任何用户 通过file_operations结构所定义的函数即可操作此设备 。

首先, open设备后即可对设备进行操作。 MODULE_INC_ USE_COUNT宏在open函数中起到计数的作用 , 计数器在用户态程序打开一个设备后就加1。 若以模块方式加入一个驱动且计数器不为零, 则说明该驱动属于使用状态, 是不可以通过rmmod命令卸载驱动模块的。

当open完设备完成后, read、 write函数就可以发送和接收数据了。

在usb_read函数中 , 我们采用 中断方式 传输 , 用FILL_INT_URB宏建立一个urb, 调用usb_submit_urb函数来提交urb。

由于设备没有中断OUT端点, 因此需要采用Set_Repor标准请求来从主机接收数据。 所以write函数没有用urb传送数据, 而是用usb_set_report函数代替, 这个函数可以发送数据给设备, 并且不需要创建urb和操作urb函数。

4结语

USB设备由于其低价和高性能 , 在近几年内得到迅速的普及。 采用CY7C63001A开发出的低速通信设备, 满足了价格和性能这两方面的要求。 已投放市场经过了实际的 检验 , 证实了该系统设计方案的可行性。

参考文献

[1]杨辉,等.数字化教学资源保护系统的设计[J].山东水利职业学院院刊,2006,(3).

[2]徐增祥.USB软件狗的设计及反破解技术[J].电子技术应用,2012,(8).

[3]罗予东.一种USB软件狗的设计及防解密研究[J].计算机时代,2009,(8).

驱动程序 篇10

随着信息技术的快速发展和应用, 计算机的发展正显示出微型化和专业化的趋势, 以台式计算机为主流的时代必将进入"后PC"时代。目前, 嵌入式系统已得到广泛应用, 其中VxWorks是业界公认的性能最出色的一种实时操作系统。虽然VxWorks本身已对硬件提供了广泛的支持, 但对系统中采用的专用硬件还需专门编写驱动程序。

2、Vx Works系统概述

VxWorks是由Wind River Systems公司开发的一套具有微内核、高性能、可伸缩的实时操作系统, 支持众多的网络协议, 用户可以根据自己的需要来组合, 其开放式的结构和对工业标准的支持使开发者只需要做少量的工作就可以设计出有效的、适用于不同用户的系统。VxWorks由以下几个系统组成:

(1) 高性能的实时操作系统核心wind。

(2) I/O系统。VxWorks提供了一个能快速、灵活地与ANSI C兼容的I/O系统, 包括UNIX标准的缓冲I/O和POSIX标准的异步I/O。VxWorks包括以下驱动程序:网络驱动、管道驱动、键盘驱动、显示驱动、磁盘驱动、并口驱动等。

(3) 本地文件系统。

(4) 板级支持包BSP (Board Support Package) 。板级支持包对各种板子的硬件功能提供了统一的软件接口, 它包括硬件初始化、中断的产生和处理、硬件时钟和计时器管理、局域和总线内存地址映射、内存分配等等。每个板级支持包包括一个ROM启动或其它启动机制。

(5) 虚拟内存与共享内存。

除了性能出众的操作系统之外, Wind RiverSystems公司还提供了优秀的实时操作系统开发环境Tornado, 它能支持几乎所有流行的工作平台和目标处理器。Tornado由3个高度集成的部分组成:Tornado工具, VxWorks运行时系统以及连接目标机的通讯选项。其中, Tornado工具是一整套强有力的交叉开发工具, 这些工具还可用于所有目标系统, 而VxWorks则是运行在目标机上的高性能、可裁减的实时操作系统。基于宿主机的所有开发工具对开发者来说都有一致的图形界面, 所有工具都是通过一个目标机服务器和目标机相连, 因此, 无论宿主机和目标机是以何种方式相连 (以太网, 串行线路, 在线仿真, ROM仿真或客户提供的专用线路等) , 所有工具都可以应用。另外, 开发工具对目标机应用程序的调试方法有2种模式:系统模式和任务模式。系统模式对整个应用系统进行调试, 可在系统中设置断点, 调试中应用系统必须停下来。而任务模式是针对系统中某一任务模块进行, 整个系统仍可保留工作状态。同样, 在对整个系统进行调试时, 也可以逐个模块进行, 调好一个运行一个, 这样便于加快调试速度, 方便系统调整。

3、设备驱动程序的实现

3.1 设备驱动程序和VxWorks的关系

应用程序必须通过驱动程序才能与硬件进行数据通信, 而驱动程序的编写与操作系统密切相关。BSP即板级支持包, 它与设备驱动程序的编写密切相关。BSP与VxWorks的主要关系可以用图1描述:

从图1可以看出:驱动系统硬件的工作由BSP完成, BSP中的驱动程序管理特定目标环境中的设备, 对其进行控制和初始化。在VxWorks中, BSP向VxWorks提供与硬件环境的接口, 负责完成加电时的硬件初始化, 为VxWorks访问硬件驱动程序提供支持, 将VxWorks中与硬件有关以及与硬件无关的软件进行集成。在BSP中, 包括了源代码、头文件、Make文件、派生文件以及二进制驱动程序模块。但BSP并不是硬件驱动程序。在VxWorks中, 硬件驱动程序被分为二类, 即通用的和BSP专用的。通用的驱动程序管理可以在不同的目标环境之间移动的设备, 例如网卡;而VxWorks具有的开放式结构和对工业标准的支持, 使得开发者只需做最少的工作即可设计出有效的、适合于不同用户要求的系统。在开发BSP时, 不仅要对BSP专用的驱动程序提供完全的支持, 还需要将通用的设备驱动程序集成在一起。因此, 在编写设备驱动程序的实现时, 可以根据具体情况将其放在BSP中合适的位置。

3.2 VxWorks设备驱动程序实现机制

首先, 在系统加电后执行启动代码, 加载VxWorks映像, 然后处理器跳转到VxWorks映像的加载地址 (即sysInit的首地址) 开始执行。sysInit复位处理器, 执行最少而必要的硬件初始, 但是并不初始化内存。之后转到userInit执行, 完成内核启动之前的初始化。这两个子程序都被静态地连接在可加载的VxWorks映像中。userInit是一个通用子程序, 它负责关闭所有硬件中断, 将硬件初始化到一种已知的静止状态, 然后调用子程序激活VxWorks内核。其中, 子程序sysHWinit将硬件置于初始的安静状态, 之后, 子程序kenelInit激活VxWorks内核, 生成多任务环境, 并产生一个任务来安装驱动程序以及创建设备、初始化VxWorks库、调用应用程序启动代码。用来生成这个任务的子程序是userRoot。由此可见, 通用的设备驱动程序应该可位于userRoot中, 而BSP专用的设备驱动程序则位于子程序sysHWinit中。

3.3 设备驱动程序的结构流程

在VxWorks中, 设备驱动程序有查询方式和中断方式二种。在中断方式下, 事件发生是由中断信号确定的, 在中断信号没有出现时, 驱动程序处于空闲状态。在查询方式下, 驱动程序必须生成一个任务来不停地查询相关的寄存器以确定事件的发生。但无论采用哪一种方式, 设备驱动程序的基本流程都是相同的。在第一步中获取的硬件接口参数包括内存映射地址、端口和系统中断控制器的输入 (IRQ) 。获取这些参数的方法由硬件的接口方式决定。例如, PCI总线作为一种即插即用的总线结构, 在与硬件无关的软件应用程序I/O系统文件系统VxWorks库与硬件有关的软件内核SCIS驱动程序BSPLan驱动程序硬件SCC定时器TCP/IPMUX40 Journal of Civil Avia-tion Flight University of China Vol.16 No.4BIOS和操作系统的支持下, 能够自动为设备分配合适的硬件接口参数。硬件的行为和特性由内部寄存器控制。基于PCI总线的系统采用内存映射访问寄存器。对于采用中断方式的硬件设备, 在接口函数中必须实现中断服务程序。中断程序的编写必须遵循不能有运行时间过长的代码, 不能独占共享资源以避免死锁, 程序结束后尽可能地快速返回等原则。上述步骤完成后, 即可启动硬件设备。

3.4 设备驱动程序框架

(1) 定义常量和全局变量#define VENDOR_ID xxx

(2) 定义信息数据结构

(3) 获取硬件接口参数

(4) 中断服务程序

(5) 设备初始子程序

4、总结

为了编写设备驱动程序, 在掌握了系统结构和启动过程之后, 还需要理解在VxWorks环境中软件编程的基础。事实上, VxWorks的所有机制和功能都是基于"C子程序"这种简单机构的, 即:VxWorks的所有功能都是由C程序库提供的, 任何C程序都能从Tornado的命令和调试环境中交互式地调用, 能够作为VxWorks的一个任务从Tornado主机工具或者应用程序中产生, 而且C程序能够与中断看门狗定时器或辅助定时器相连。VxWorks的这种统一性使Tornado成为一种有效的开发系统, 因为用户不必再编写特殊的代码来与系统陷阱接口, 也不需要进行特殊的处理来建立一个任务, 更不需要编写特殊的用户接口程序来测试新代码, 用户只需要编写子程序就可以完成所有这些工作。VxWorks的这些特性为编写设备驱动程序提供了极大的便利。

摘要:本文阐述了在嵌入式实时操作系统VxWorks下实现设备驱动程序的原理和方法, 并给出了程序框架。

算法与程序·程序框图 篇11

[开始] [产生0~1之间的两个随机数 分别赋给[xi,yi]] [输出[P]][结束] [是][否] [是]

A. [P=N1000] B. [P=4N1000]

C. [P=M1000] D. [P=4M1000]

2. 执行如图所示的程序框图,输出的[S]的值为( )

[开始] [输出[S]][结束] [否] [是]

A.1 B. [23] C. [1321] D. [610987]

3. 如图所示的程序框图中,令[a=x,b=-x,][c=12x+1],若给定一个[x]值,输出的结果仅仅适合[12x+1],则这样的[x]的取值范围是( )

[开始] [输出[a]][结束] [是][否] [输入[a,b,c]] [是] [否]

A. [-∞,-23] B. [-23,2]

C. [-23,2] D. [2,+∞]

4. 如图所示,程序框图的输出结果是( )

[开始] [输出[S]][结束] [否] [是]

A. [16] B. [2524] C. [34] D. [1112]

5. 执行如图所示的程序框图,如果输出的[S=3],那么判断框内应填入的条件是( )

[开始] [输出[S]][结束] [否] [是]

A. [K≤6] B. [K≤7]

C. [K≤8] D. [K≤9]

6. 执行如图所示的程序框图,如果输入的[N=10],那么输出的[S]的值为( )

[开始] [输出[S]][结束] [否] [是] [输入[N]]

A. [1+12+13+…+110]

B. [1+12!+13!+…+110!]

C. [1+12!+13!+…+110!+111!]

D. [1+12+13+…+110+111]

7. 如果执行如图所示的程序框图,输入正整数[N]([N]≥2)和实数[a1,a2,a3,]…,[aN],输出[A,B],则( )

A. [A+B]为[a1,a2,a3,]…,[aN]的和

B. [A+B2]为[a1,a2,a3,]…,[aN]的算术平均数

C. [A]和[B]分别是[a1,a2,a3,]…,[aN]中最大的数和最小的数

D. [B]和[A]分别是[a1,a2,a3,]…,[aN]中最大的数和最小的数

[开始] [输出[A,B]][结束][是][否] [输入[N1,a1,a2,a3,…,aN]] [是][否] [是][否]

8. 如图,[x1,x2,x3]为某次考试三个评阅人对同一道题的独立评分,[p]为该题的最终得分,当[x1=6,x2=9,p=8.5]时[x3]等于( )

[开始] [输出[p]][结束] [否] [是] [输入[x1,x2]] [输入[x3]] [是][否]

A. 11 B. 10 C. 8 D. 7

9. 执行如下图所示的程序框图,输入[l=2,][m=3,][n=5],则输出的[y]的值是 .

[开始] [输出[y]][结束] [否] [是] [输入非负整数[l,m,n]] [否][是]

驱动程序 篇12

关键词:PCI,vxworks,驱动程序,运动控制卡

VxWorks是目前世界上用户数量最大的实时嵌入式操作系统,它具有高度可剪裁的微内核结构、高效的多任务调度、灵活的任务间通信手段、快速灵活的I/O系统、确定的微妙级中断延迟时间等优点。

本文介绍了基于PCI接口规范的通用运动控制卡在VxWorks下的驱动程序的设计。对其设计驱动程序需要对实时操作系统、实时软件设计、硬件设备有深入的了解。因此,该设计不仅本身具有很高的应用价值,也为实时驱动程序的设计提供了一个样例。

1 系统组成

在基于微机的数据采集、处理与控制系统中,计算机接口卡常常是其中的关键硬件设备。目前在运动控制领域,各类运动控制卡得到广泛运用,其中以工控机通过ISA或PCI等系统总线连接运动控制卡的主从式结构最为流行,由工控机发出控制指令和参数,控制卡根据接收到的指令及参数完成具体控制功能。由于PCI总线的高速和即插即用特性,使其取代ISA被广泛应用于高速数据采集与传输等系统中,有效地解决了实时采集、实时传输和实时存储等问题。

根据本课题任务及技术指标要求,板卡要具有多路能接受陀螺反馈数字信号的RS-232接口和RS-485接口,加速度模数转换通道及其他模拟量采集通道,多路控制方位、高度、旋像伺服系统的数模转换通道。板卡数字输入输出信号为标准的TTL电平,具有接受测角和姿态信号的多位并行接口,通用I/O接口,板卡能够与主控PC机进行数据交换,系统的功能框图和组成结构框图分别如图1和2所示。

2 PCI配置空间

PCI系统具有三种地址空间:存储器空间、I/O空间和配置空间。每个PCI设备都有64个配置双字用于实现配置寄存器,64个配置双字分为两部分,⑴PCI协议定义了开头16个双字的格式和用途,称为设备的配置头区域;⑵其它48个双字的用途是由设备指定的。目前PCI协议定义了两种头区域格式,第1类配置头区域用于定义PCI-PCI桥,而第0类配置头区域用于定义其它PCI设备。所有的PCI设备,包括PCI-PCI桥都必须实现下述配置寄存器:厂商标志、设备标志、命令、状态、分类码、版本标志和头区域类型寄存器。如表1所示为PCI配置寄存器。这些寄存器对编程访问PCI设备至关重要,我们就是利用vendor ID和device ID来枚举出对应的设备,再进一步获得设备的其他信息的。

3 驱动程序的开发

VxWorks提供在指定目标系统上运行的板级支持包(BSP),本文选用的是针对pentium的板级支持包。VxWorks是支持PCI总线的,提供了一些库函数专门用来访问PCI设备。为了调用这些函数以方便开发,需要包含如下头文件"iosLib.h"、"pciConfigLib.h"、"pciIntLib.h"、"sysLib.h"和"pciLocalBus.h",还需要导入sysOutLong()和sysInByte()等函数。在config.h里面定义INCLUDE_PCI以添加VxWorks对PCI的支持,还可以定义PCI_CFG_TYPE为PCI_CFG_FORCE、PCI_CFG_AUTO或PCI_CFG_NONE,我们一般定义为PCI_CFG_NONE,Vxworks只需把配置好的信息读出来就可以了。

针对PCI总线结构的数据采集模块,其驱动程序的主要开发步骤如下:确定设备的PCI配置信息→确定设备的内部存储器、寄存器基地址及中断号→设备初始化→中断服务程序→设备各功能函数。以下按照程序执行的顺序分步骤给出源代码,并加以详细的说明。

1)查找PCI设备

2)获得设备映射信息

根据设备的总线号busNo、设备号deviceNo、功能号funcNo,通过调用pciConfigInLong、pciConfigInByte获得设备映射的内存基地址memBase和I/O基地址ioBase以及中断号Irq,部分代码如下:

3)中断挂接

4)使能映射空间

4 结束语

利用上文所述的方法编写的驱动程序,达到了本项目所要求的性能指标,系统经过实际验证是高速稳定可靠的,而且由于PCI总线的即插即用特性,不需要用户去手动跳线,极大得方便了使用。

参考文献

[1]microsoft msdn[EB].2001.

[2]卞红雨,曹明明,桑恩方.VxWorks下PCI总线设备驱动程序设计[J].声学与电子工程,2005(2).

上一篇:模型建构法下一篇:动机与可行方式