驱动程序范文

时间:2023-10-14 15:40:40

驱动程序

驱动程序篇1

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模式,这样会大幅提高硬盘性能。

驱动程序篇2

为了保证操作系统的平安性和稳定性以及应用程序的可移植性,windows操作系统不答应应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,假如应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。它们之间的通信包括两个方面摘要:一方面是应用程序传送给设备驱动程序的数据;另一方面是设备驱动程序发送给应用程序的消息。前者的实现较轻易,通过createfile()函数获取设备驱动程序的句柄后,就可以使用win32函数,如deviceiocontrol()、readfile()或writefile()等实现应用程序和设备驱动程序之间的通信。后者的实现远比前者复杂,同时介绍这方面情况的文章较少。这不等于说它不重要,相反,它在有些应用场合发挥着重要的功能。设备驱动程序完成数据的采集工作后,需要马上通知应用程序,以便应用程序能够及时将数据取走并进行处理。诸如此类情况,不一而足。

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法摘要:异步过程调用(apc)、事件方式(vxd)、消息方式、异步i/o方式和事件方式(wdm)。下面分别说明这几种方式的原理,并给出实现的部分源代码。

1 异步过程调用(apc)

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

2 事件方式(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应用程序的辅助线程就对这个消息进行相应的处理。

3 消息方式

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

4 异步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的处理结果。

5 事件方式(wdm)

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

6 结语

在目前流行的windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。它向上提供和硬件无关的用户接口,向下直接进行i/o、硬件中断、dma和内存访问等操作。它将应用程序和硬件细节屏蔽开来,使软件不依靠于硬件并且可在多个不同的平台之间移植。本文介绍了5种设备驱动程序通知应用程序的方法,其中前3种方法主要用于vxd中,后2种方法主要用于wdm。这5种方法都经过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。

参考文献摘要:

[1欧青立,徐建波,李方敏,等. 虚拟设备驱动程序vxd的探究和开发. 计算机工程,2003

[2(美)chris cant. windows wdm设备驱动程序开发指南. 孙义, 马莉波, 国雪飞等译. 北京摘要: 机械工业出版社 2000

驱动程序篇3

【关键词】UEFI 嵌入设备 驱动程序

随着计算机技术的进一步发展,传统的固件技术已不能满足其进一步发展。于是,提出了UEFI这一技术,克服传统BIOS的缺陷,成为新的固件技术[1]。

一、UEFI概述

(一)UEFI定义

UEFI是Unified Extensible Firmware Interface的缩写,又被称为“统一的可扩展固件接口”。该固件技术主要采用C语言、模块化等参数传统来建立新的网络系统,实现硬件与系统间的有效连接,方式更加灵活。整体而言,就是一个可以扩展,具有一定标准的固件接口规范[2]。

(二)UEFI的优势

UEFI这以可扩展固件接口,是为了取代传统固定,缺少文档仅靠经验进行约定的BIOS固件,具有自身独特的优势。

首先,UEFI超过99%的部分编码都是利用C语言实现的,并且采用了Driver/protocol的新型硬件端口操作方法;其次,UEFI实现了强大的管理工具优势,可以调动计算机设备进行驱动,还能够进行远程系统配置,无需操作系统就能启动管理等;最后UEFI还实现了清晰明了的图形界面组合,由初始化模块、驱动执行环境、驱动程序、兼容支持模块等几大部分共同构成。同时,由于UEFI内部设置了图形驱动,因此根据彩色图形,可以通过鼠标进行调整配置。所以,UEFI较BIOS具有强大的可扩展性、兼容性、图形界面以及鼠标操作性等优势,势必成为主流固件接口技术。

二、UEFI嵌入式驱动程序开发

(一)UEFI驱动程序简介

计算机程序都存在一定的入口,也就是通常所说的接口,主函数,将其输入计算机系统后,编译器会自动进行识别并执行命令。而对于应用程序与驱动程序,一般都是PE映像头中的Sub-system来进行区分的。UEFI驱动程序都是由其引导管理器进行的加载,或者可以通过UEFI固件和应用程序来加载驱动,是不能够直接进行的一种操作方式。在计算机系统进行应用程序加载时,固件就会保留一定的空间进行映像储存,待程序加载完毕后,就会逐步向计算机驱动程序转移。当然程序返回情况有所不同,从驱动程序入口点返回EFI-SUCCESS,不需要卸载驱动程序,只有当出现错误代码时,才要将驱动程序卸载后返回UEFI组件。

(二)UEFI嵌入式驱动程序开发分析

UEFI的启动操作系统,根据现代软件体系分为四个阶段来具体实现,是进行复杂的嵌入式系统程序的基础,其主要运行机理如图所示:

图1 UEFI启动操作流程图

根据UEFI的启动操作程序,可以发现其嵌入式驱动程序的开发是一个复杂漫长的过程,而为了简化UEFI的驱动程序开发,大量的引进了驱动模型,更方便阐述驱动程序开发的过程及原理。

1.UEFI驱动模型

UEFI驱动模型主要通过对多种协议的组装整合,实现了硬件驱动。而且根据能否创建子控制器,UEFI驱动模型分为总线驱动、设备驱动两种[3]。它能有效的将计算机硬件与驱动程序分离,尽可能的减小驱动程序多占空间,整体维护系统的可扩展性。

2.UEFI嵌入式驱动程序开发过程

利用计算机进行的驱动程序开发,包括USB键盘以及鼠标等搜狐死常见的,但是复杂的嵌入式驱动程序开发还未被广泛应用。而要实现计算机UEFI嵌入式驱动程序的开发,就必须先掌握驱动程序开发的通用方法,了解驱动程序开发过程中,函数与协议的结合使用。

陕西某职业电子信息学院针对计算机UEFI嵌入式驱动程序开发技术原理及步骤,进行了驱动程序ProtocolImpll的开发实例研究。该驱动程序主要是利用UEFI指纹设备驱动实现的,注册Protocol为其程序辨别器,通过第三方来进行指纹设备驱动,完成嵌入式UEFI驱动程序开发[5]。首先利用ProtocolConsume找寻ProtocolImpll的具置,将其作为UEFI固件接口,然后完成该接口的程序功能。

通过UEFI函数Install-ProtocolInterface来安装驱动程序,进行指纹硬件设备驱动,就能很好的实现ProtocolImpll这一嵌入式驱动程序。在驱动程序开发过程中,依照通用的程序协议步骤,就能完成最后执行镜像的文件INF,它包含了C语言程序的定义、构成、链接库以及其他有效信息。最后将INF输入预定的DSC文件中,自动使用GenMake生成二进制的镜像文件,就能实现指纹驱动程序。

三、结语

UEFI作为新的固件技术,在技术上具有传统BISO固件技术所不能比拟的优势。尤其是利用C语言进行整个系统的编码,能够打破过去固定的经验之谈,扩大系统的兼容性与扩展性。不仅如此,UEFI在程序的开发应用上也具有一定的优势,实践总结出驱动程序开发的一般步骤方法,为UEFI进行嵌入式驱动程序开发奠定了良好的基础。

参考文献:

[1]余超志,朱泽民.新一代BIOS-EFI-CSSBIOS技术研究[J].山东:科技信息(学术版),2006(5):14-15.

[2]庄克良,高云岭,纪向尚.UEFI BIOS在复杂嵌入式系统中的可应用性的研究[J].湖北:舰船电子工程,2009(12):156-158,163.

驱动程序篇4

新驱动、新特性

260.63 Beta驱动程序采用全新的界面外观,有别于传统的NVIDIA显卡驱动程序,给人耳目一新的感觉。该驱动程序在安装菜单中提供了简洁(Express)和自定义(Custom)两种安装模式。简洁模式为傻瓜式的安装,适合初级用户。而在自定义模式下,你可以对具体的组件,如3D Vision、PhysX、HD音频驱动包等进行选择性安装。在该模式下,用户还可以选择“执行清洁安装”,即删除已有的驱动程序和相关组件。而且非常方便的是,这个操作无须重新启动计算机就可以完成,这是以往的驱动程序无法实现的。

过去,如果你想开启3D Vision模式的话,除了下载NVIDIA显卡驱动程序,还必须单独下载专门的3D Vision驱动程序。而260.63 Beta驱动程序则整合了3D Vision驱动,方便了用户使用。此外,该驱动程序还对3D Vislon进行了一系列更新,如3D Photo Viewer立体相片查看器增加对索尼3D Sweep Panorama格式的支持;增加支持新的3D Vision液晶显示器,如明基X2410和NEC F23W2A;游戏方面,《失落的星球2》、《最终幻想14》等游戏也提供对3D Vision的支持。

GeForce GTX 460实战新驱动

260.63驱动程序主要针对GeForce GTX 480/460显卡进行了性能优化,使两款显卡在性能上有不小的提升,尤其是在高分辨率和高画质的设置下。下面笔者将在260.63和258.96版本的驱动程序下,分别对目前热门的GeForce GTX 460显卡(高频版)进行相关的性能测试,主要测试该显卡的3D性能、PhysX物理加速性能、3D Vision模式下的性能、CUDA转码的性能。

测试平台

CPU:Intel Core i7 860 OC 4.1GHz

散热器:COGAGE True Spirit

主板:微星P55-GD65

内存:金士顿DDR3 1800 2Gx2OC DDR3 2050 9-9-9-124 lT

显卡:GeForce GTX 460(默认850MHz/4000MHz)

电源:航嘉X7 900

3D性能提升明显

从表1的测试结果中可以看到,GeForce GTX 460显卡在260.63Beta版本驱动程序下的性能确实有不小的提升。其在Performance模式下的单卡得分突破了两万,较258.96版本驱动程序提升了5%。此外在目前流行的几个游戏大作的测试中,无论是经典的DirectX 10游戏《孤岛危机》,还是号称新一代显卡杀手的DirectX 11游戏《地铁20339,游戏帧数均有5%~10%的提升。

3D Vision性能提升较大

在3D Vision模式下,260 63Beta版本驱动程序依然对GeForce GTX 460显卡的性能有着不小的提升,游戏的帧数均比在258.96版本的驱动程序下有所提高。尤其是在《尘埃2》中,使用258.96版本驱动程序时偶尔会出现游戏画面停顿、不流畅的情况,而在260.63版本驱动程序下,这种情况则得到很大的改善。

这里需要提醒大家的是,由于在3D Vision模式下,同一帧游戏画面需要渲染两次,对显卡性能要求很高,因此游戏帧数会有不同程度地下降。在高画质、关闭抗锯齿设置下,GeForce GTX 460显卡的性能下降幅度约30%~50%。而在实际游戏过程中,玩家的视觉都被3D立体效果所吸引,此时肉眼对画质高低的区别已经不再那么明显,因此在这里笔者建议玩家可以采取高分辨率+中等画质的设置来换取更流畅的游戏速度。

此外笔者在试用中发现,虽然260.63 beta驱动程序集成了3D Vision驱动,但并没有整合3D Vision信号发射器的驱动程序。这意味着如果你使用红蓝眼镜的话,直接安装该驱动程序即可实现3D功能,如果你使用3D立体幻镜套装的话,还需要登录NVIDIA官方网站下载3DVision信号发射器的驱动程序(NVIDIA 3D Vision Controller Driver v260.63)才能开启3D Vision功能。

PhysX和CUDA转码性能无明显提升

260.63 Beta驱动程序中还将PhysX物理驱动程序升级至9.10.0514版本,但在两个支持PhysX物理加速的主流游戏《镜之边缘》和《蝙蝠侠:阿卡姆疯人院》的测试中,GeForce GTX 460显卡在两个驱动程序下的性能表现几乎相同,没有明显的差别。类似的情况还出现在CUDA高清视频转码的测试中。希望在后续的260系列正式版驱动中能够更多地针对CUDA转码及物理加速方面的性能进行优化。

实用的260系列驱动程序

驱动程序篇5

DriverMax2.5小资料:

软件语言 英文

软件授权 免费软件

软件大小 1891KB

运行环境 Windows Vista/2003/XP/2000/ NT/ Me/98/

下载地址 省略/soft/44921.htm

DriverMax是专门备份/恢复Windows驱动程序的软件,当然它也可以备份/恢复Vista驱动程序。DriverMax能够找到电脑中所有硬件(例如显示卡、声卡、主板等)的驱动程序,然后让你选择对哪些驱动程序进行备份,当然你也可以备份系统中所有驱动程序。

DriverMax备份了驱动程序之后,备份文件保存方式有两种,一种是将驱动备份到指定的目录中,另一种是打包压缩成一个ZIP文件。如果你想节省空间,建议将驱动备份成ZIP文件加以保存。以后如果你想恢复系统中的驱动程序,只要运行DriverMax进行恢复操作,即可恢复之前的驱动程序。

下载和安装

DriverMax当前最高版本是2.5,请到省略/soft/44921.htm下载。下载完毕,点击压缩包中的drivermax_44921.exe文件进行安装;安装完成会自动启动DriverMax2.省略)即可。

注册邮箱最好使用国外的,例如yahoo(mail.省略)等邮箱,国内的网易163邮箱(mail.省略)也可以。注册完毕稍等片刻,到刚才填写的邮箱(例如)中就能收到一封邮件,内容包含一个注册码,回到DriverMax软件,点击“Enter registration code”输入该注册码,按“确定”后,该软件就变成正式版了,这样以后你就能永远免费使用该软件了!

备份Vista驱动程序

DriverMax备份/恢复驱动程序的操作非常简单,因为整个过程都会有操作精灵引导你,只要你按照提示进行操作即可!如果你想备份当前系统的驱动程序,请进入DriverMax主画面,单击“Export drivers”按钮,随之会启动操作精灵,出现一段说明。请点击“Next”,软件就会检查系统中所有的驱动程序,检查完毕会弹出一个画面,显示一张驱动程序清单。如果你不知道应该备份系统中哪些有用的驱动程序,建议选择画面右下方的“All drivers”(图2),然后点击“Select all”按钮,这样就能备份系统中所有的驱动程序,不至于漏下某个驱动程序没有备份!

如果你想对系统中驱动搜索结果进行修改,即希望指定搜索当前系统中的某些驱动程序,请单击右下角的“Settings”按钮进行设定。在弹出的“Display settings”对话框中,设定过滤驱动程序的5项条件(图3),例如你选择“Only show driver versions currently in use”,以后就会搜索、显示当前系统正在使用的驱动程序,设定完毕后单击“OK”返回到驱动程序清单画面;接下来,你可以勾选要备份的驱动程序,例如显示卡、声卡、主板芯片等,重要的必不可少的驱动都应该勾选;

勾选完毕点击“Next”,会弹出一个提示框,询问你如何保存驱动备份文件,你可以选择将驱动程序直接备份到某个目录中,或者将驱动备份成一个ZIP文件,注意如果你决定将驱动备份到指定的文件夹中,该文件夹必须是一个空目录,否则软件就会拒绝备份操作。

设定好保存方式和路径后,单击“Next”按钮,软件就会开始对系统中的驱动程序进行备份了;稍等片刻,备份完成,点击Close大功告成!

快速恢复Vista驱动程序

平时备份好系统中的驱动程序,对电脑用户来讲非常重要!因为以后系统一旦被病毒破坏崩溃了,就需要重新安装,接下来就需要重装驱动程序。

如果你想快速恢复Windows或者Vista驱动程序,可以运行DriverMax2.5,然后单击“Install drivers”,随后弹出恢复驱动操作精灵,按“Next”,选择从目录或者ZIP文件中恢复驱动程序(图5),然后根据提示即可恢复系统中原来的驱动程序。

好了,现在你就不必再为Vista系统的驱动程序而犯愁了,下次可以放心的对系统进行重装了!

驱动程序篇6

关键词: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).

驱动程序篇7

PCI总线规范是为提高微机总线的数据传输速度而制定的一种局部总线标准。在设计自行开发的基于PCI总线的数据传输设备时,需要开发相应的设备驱动程序。通常开发PCI设备驱动程序有多种模式,在Windows2000环境下,主要采用WDM模式。本文针对自行开发的基于PCI总线的CCD视频信号传输控制卡,编写了符合WDM模式的驱动程序。

1 WDM模式驱动程序

1.1 WDM模式(Windows Driver Model)

Windows2000对驱动程序的编写不再基于以往的Win3.x和Win9x下的VxD(虚拟设备驱动程序)结构,而是基于一种新的驱动模型——WDM(Windows Driver Model)。

WDM为Windows98/2000/XP操作系统的设备驱动程序的设计提供了统一的框架。WDM来源于Windows NT的分层32位设备驱动程序模型(layered 32-bit device driver model)。它支持更多的特性,如即插即用(PnP)、电源管理、WMI和NT事件。

1.2 设备驱动程序

设备驱动程序是操作系统的一个组成部分,它由I/O管理器(I/O Manager)管理和调动。Windows2000操作系统下的I/O管理器功能描述如图1所示。

I/O管理器每收到一个来自用户应用程序的请求就创建一个I/O请求包(IRP)的数据结构,并将其作为参数传递给驱动程序。驱动程序通过识别IRP中的物理设备对象(PDO)来区别是发送给哪一个设备。IRP结构中存放请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。驱动程序处理完这个请求后,在该结构中填入处理结果的有关信息,调用IoCompleteRequest将其返回给 I/O管理器,用户应用程序的请求随即返回。访问硬件时,驱动程序通过调用硬件抽象层的函数实现。

1.3 DriverStudio工具简介

NuMega Lab公司开发的DriverStudio是一整套开发、调试和检测Windows平台下设备驱动程序的工具软件包。它把DDK(Device Development Kit)封装成完整的C++函数库,根据具体硬件通过向导生成框架代码,并且提供了一套完整的调试和性能测试工具SoftICE、DriverMonitor等。

2 应用实例

本文利用PCI专用接口芯片PCI9052设计了一个数据传输控制卡。卡上主要的芯片有PCI9052、FIFO(CY7C4221)、CPLD(MAX7064S)和A/D转换器(MAX1197)。传输卡硬件框图如图2所示。面阵CCD得到的视频信号经过调理电路,生成的视频调理信号通过A/D转换器进行数字化处理,送入FIFO中。在CPLD的控制下,数据经过PCI9052送入PCI总线,再传送到计算机内存中,并显示在监视器上。驱动程序必须实现如下几个基本功能:(1)硬件中断;(2)能支持应用程序获取数据;(3)能根据外部FIFO(CY7C4221)的状态启动或停止突发传输。

在数据输入过程中,最重要的是对数据进行实时控制,因此需要硬件中断。在中断程序中,根据外部FIFO状态完成数据的读入。

2.1 用DriverWizard生成驱动程序框架

DriverStudio中的DriverWorks软件为开发WDM程序提供了一个完整的框架。它包含一个可快速生成WDM驱动程序框架的代码生成向导工具DriverWizard,而且还带有许多类库。在用DriverWizard生成的程序框架中写入相对于设备的特定代码,编译后即可得到所需的驱动程序。

在利用DriverWorks V2.7的向导Driver Wizard完成驱动程序的框架时共有11个步骤,其中关键步骤有:

(1)在第四步中选中PCI,并在VendorID和DeviceID中分别输入厂商号和设备号,还需填入PCI Subsystem ID和PCI Revision ID。这四项可以用网上的免费软件PCITree或PCIView浏览PCI设备,用这两个软件也可以得到BAR0~BAR5的资源分配情况和中断号。

(2)第七步IRP队列排队方法,它决定了驱动程序检查设备的方式。本设计选SystemManaged,则所有的IRP排队都由系统(即I/O管理器)完成。

(3)第九步是最关键的一步。首先在Resources中添加资源,在name中输入变量名,在PCI Base Address中输入0~5的序列号。0~5和BAR0~BAR5一一对应。在设置中断对话框中,在name栏写入中断服务程序的名称,选中创建中断服务程序ISR?穴Create ISR?雪,不选创建延迟程序调用DPC(Create DPC),选中Make ISR/DPC class functions,使ISR/DPC成为设备类的成员函数。

其次选中Buffer以选取读写方式,用于描述与I/O操作相关的数据缓冲区。本设计需要快速传送大量数据,因此采用Direct I/O方式。

(4)在第十步中,需要加入与应用程序或者其他驱动程序通信的I/O控制代码参量。

2.2 驱动程序模块框图和代码分布

PCI设备驱动程序模块包括配置空间的访问模块、IO端口模块、内存读写模块和终端模块等。各模块之间是对等的。驱动程序模块框图如图3所示。

驱动程序初始化模块代码段放在#pragma code_seg(″INT″)和#pragma code_seg()之间。在系统初始化完成后,这部分代码从内存中释放,防止占用系统宝贵的内存资源。#pragma code_seg()之后是驱动程序和系统的许多模块的实现部分。这部分在驱动程序运行后不会从内存中释放。

2.3 驱动程序主要模块的实现

(1)配置空间的访问模块

DriverWorks的KPciConfiguration类封装了访问PCI设备配置空间的所有操作。首先初始化这个类的实例:

KpciConfiguration PciConfig()m_Lower.TopOfStack());

/?觹m_Lower是 KpnpLowerDevice类的对象。m_LowerTopOfStack()返回当前设备堆栈顶部的设备对象。*/

初始化完后可以直接利用成员函数 ReadHeader/ WriteHeader函数访问所有的配置寄存器。

为了确定映射空间的类型和大小,先向目标基地址寄存器写入0Xffffffffh,然后回读该寄存器的值。如果最低位为1,表示映射于I/O空间,反之为存储空间;如果映射于存储空间,从第四位开始计算0的个数可以确定内存空间的大小;如果是I/O方式,从第二位开始计算0的个数可确定I/O空间的大小,最大为256字节。如果设备的存储空间超过256字节,要实现设备的整个存储部分的访问

,就必须采用内存映射。(2)I/O操作模块

Driverworks的KIoRange类封装了I/O端口访问的操作。部分代码如下:

{……

KIORange DevIoPort () ;//创建实例

NTSTATUS status= DevIoPort ().Initialize ( pResListTranslated,pResListRaW,PciConfig.BaseAddressIndexToOrdinal(0));

/* 第一个参数为转换后的资源列表指针;第二个参数为原始资源列表指针;第三个参数中的0为 I/O口对应的基地址,用来转换成特定端口资源的序数?*/

If(NT _SUCCESS(status))

{……

DevIoPort.inb(0,LineBuf1,10);

/*成功初始化后可分别用KIoRange类的成员函数inb(/outb)从端口中读/写字节 */

}

else{Invalidate();return status;

/*未能初始化成功,错误信息在status中*/

{

……}

(3)内存读写模块

DriverWorks的 KMemoryRange类封装了端口访问的操作。

status=m_MemoryRange().Initialize(pResListTranslated,pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0));

此函数的参数、意义及具体用法与I/O端口的操作基本相同。

内存对象也用来发送控制字,以控制CPLD的开始和停止等。实际上控制字是通过PCI9052发送的。该控制字地址已被映射成PCI的内存空间。所以定义一个指向内存空间的内存对象,通过该对象即可发送控制字。

(4)中断模块

在中断模块,首先要激活PCI9052中断使能位,然后判断硬件中断响应是否产生,如果有,则进行突发传输,读入FIFO中的数据。

BOOLEAN TranCard::Isr_MyIrq(void)

{ if (// 中断未产生)

{……

return FALSE;}

else

{/* 如果产生硬件中断,设置命令寄存器,进行突发数据传输 */

return TRUE;}

}

为了将硬件中断与编写的中断服务程序连接在一起,采用InitializeAndConnect方法,部分代码如下:

NTSTATUS TranCardDevice?押?押OnStartDevice(KIrp I )

{……

status=m_MyIrq. InitializeAndConnect(

pResListTranlated,

LinkTo(Isr_MyIrq),

This;)

……}

2.4 驱动程序的调用

编写驱动程序本身不是最终目的,最终目的是调用驱动程序管理资源,并为用户应用程序使用。驱动程序加载以后,它的许多进程处于Idle状态,实际上需要用户应用程序去调用激活。应用程序利用Win32 API直接调用驱动程序,实现驱动程序和应用程序的信息交互。

首先用CreateFile()打开设备,获得一个指向设备对象的句柄。使用CreateFile函数时应注意:由于驱动程序是*.sys,所以第一个参数应该是这个设备对象的标志连接(symbolic link)。该标志连接名有一个设置数据文件搜索路径的数字号,而这个数字号通常是零。如果这个连接名是″TranCard″,则传递给CreateFile的宇符串就是:″\\\\.\\ TranCard0″。例如:

HANDLE hDevice=CreateFile(″\\\\.\\TranCard0″)GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ, NULL?, OPEN_EXISTING,0,NULL);

然后用 DeviceIoControl()进行数据的传送。最后用CloseHandle( )关闭设备句柄。

下面是应用DeviceIoControl()程序片段。

{……

m_b=DeviceIoControl(hDevice,TRANCARD_IOCTL_

RECEIVE(buffer, sizeof,buffer, NULL,0,&buffersize,NULL);

……}

2.5 驱动程序的调试

采用SoftICE、DriverMonitor作为调试工具,基本调试过程如下:(1)使用symbol loader加载驱动程序,然后使用SoftICE跟踪调试,确认驱动程序正常加载;(2)对核心的中断响应程序代码,用SoftICE中的Genint命令产生虚拟中断,单步跟踪中断;(3)硬件发送大量的数据,通过查看内存的数据,确认数据传输是否正确。

在驱动程序的调试过程中,经常出现系统“死机”、“蓝屏”等现象,这些情况可能因内存访问分页错误、设备资源和系统资源冲突、I/O使用错误、程序中“指针”使用错误等因素造成。

驱动程序篇8

电子纸显示器(EPD)能展现良好的阅读舒适性,但它具有显示速度慢的缺点,这必须通过对显示驱动程序进行优化设计加以克服。提出了一种基于三缓冲区的EPD驱动程序的实现架构和设计方法,并在一个专用阅读设备上进行了实现和验证。与传统的双缓冲机制相比,三缓冲架构增设了一个EPD显示区,用于保存显示到屏幕上的数据帧。测试结果表明,该驱动程序工作正常,不会出现屏幕闪烁问题,显示效果良好,用户可以获得较佳的视觉体验。

关键词:电子纸显示器;驱动程序;三缓冲区;阅读设备

0 引言

电子纸显示器(Electronic Paper Display, EPD), 简称电子纸,是一种类纸型显示器件。与传统的液晶显示器(Liquid Crystal Display, LCD) 相比,它具有重量轻、尺寸薄、功耗低以及静态显示等特点,能展现接近于纸质印刷品的视觉效果。凭着在阅读舒适性和功耗方面的良好表现,EPD大量应用于电子阅读和数字出版中[1-2]。然而,EPD由于其材料特性,存在刷新速度慢、翻页闪烁、残影等显示缺陷,这会给用户带来不好的视觉体验[3-4]。因此,在EPD设备的设计过程中,如何对电子纸显示屏控制软件(即EPD驱动程序)进行优化、运用有效的设计方法来避免上述缺陷,是一个亟待解决的重要问题。

文献[5]利用Linux系统中专门针对显示设备的帧缓冲 (framebuffer) 专用接口编写了EPD驱动程序。类似地在文献[6]中,作者从平台设备和平台驱动的角度研究了电子纸帧缓冲驱动程序的设计问题,并进行了实现和验证。然而,这些基于Linux帧缓冲机制的EPD驱动程序只支持单个缓冲区,并没有将图形或图像的绘制过程和显示过程区分开来,容易破坏数据的完整性。文献[7]采用一种双帧缓冲区机制来实现对用户层透明的EPD设备驱动:其中一个帧缓冲区对用户可见,可以接收用户的读写数据;另一个帧缓冲区对应用程序不可见,只作为显示接口。这种双缓冲机制保障了显示数据的安全,但未能考虑EPD刷新速度慢这个问题,导致显示不稳定、屏幕闪烁,从而用户不能获得正常的视觉体验。

本文针对EPD的显示特点,在Android系统的双缓冲技术[8]的基础上,提出了一种基于三缓冲区的EPD显示驱动程序的实现架构和设计方法,并在一台EPD阅读设备上进行了实现。该驱动程序不仅结构简单、易于实现,而且能很好地适应EPD的技术特点,展现良好的显示效果。

1 EPD显示系统

EPD显示系统主要由显示屏和控制器组成[9],如图1所示。控制器的主要功能是将CPU发送过来的显示数据转换成适合EPD的控制电压,通过控制EPD内带电粒子的运动来进行显示[10]。Flash芯片是控制器的固件,主要由查找表组成。由于EPD屏对温度敏感,因此可以通过读取温度传感器的值来调整EPD屏的控制电压输入值。控制器需外接SDRAM作为显存,里面可以同时存放多幅待显示的图像数据。采用适当的控制策略, CPU和控制器之间的数据传送量可以大为减少。控制器和CPU之间的接口可以是GPIO模式,也可以是16位宽度的SDRAM接口。

图片

图1 EPD显示系统的组成

2 EPD驱动程序的架构

EPD显示驱动程序的作用是对来自用户空间的图形或图像数据进行控制和显示。驱动程序总共开辟了三块存储空间,其中两块通过文件系统接口提供给应用程序使用:一块用作绘图,另一块保存已绘制好的图形或图像数据,驱动程序在两块缓冲区之间轮流切换。但是由于EPD显示速度慢,如果每帧都进行显示,整个显示系统的性能和显示效果就会受影响。因此驱动程序再开辟出一块缓冲区,用于保存显示到EPD上的数据帧。只有在当前帧显示完毕,并且应用程序进行了缓冲区切换之后,才会把显示区的数据拷贝到EPD显示区并进行显示,其架构如图2所示。

3 EPD驱动程序的实现

3.1 双缓冲的实现

EPD驱动程序开辟两块数据缓冲区来存储用户空间的数据。如果只使用一块数据区来保存用户空间的数据,当该缓冲区映射到内存空间后,用户空间会对该数据空间进行操作,同时内核驱动也会将该数据送到EPD上进行显示。因此,用户空间的任何操作都可能破坏该数据的完整性,导致显示不正常。而设置双缓冲的目的正是为了解决该问题:开辟两块缓冲区后,一个缓冲区的数据在准备好之后用作当前显示,另外一个缓冲区则交给用户空间进行数据准备。当用户准备好下一个显示数据块后,通过fb_pan_display()将准备好的数据区切换成显示区。这样,设置双缓冲区既提高了操作的效率,又保证了数据的完整性。

申请双缓冲区:

3.2 颜色空间转换算法

由于用户空间使用16位彩色,而最终EPD显示的是16阶灰度(4位二进制数),因此要进行对应的颜色转换。为了保证色彩过渡平滑,首先将16位的彩色分解成RGB 565的格式,然后通过以下公式计算出对应的16阶灰度值:

3.3 程序的基本功能

EPD驱动程序定义为平台软件,提供驱动探测、驱动卸载以及休眠唤醒的基本功能[12]。其接口实现如下:

驱动探测 (probe) 函数的作用是初始化EPD控制器接口,包括配置SDRAM相关的寄存器、初始化中断等,同时分配必要的数据结构以及存储空间。卸载 (remove) 函数释放相关存储空间。休眠 (suspend) 函数使控制器进入低功耗的休眠模式,以节省电能。唤醒 (resume) 函数让系统重新回到运行状态。

3.4 用户操作接口

EPD驱动向用户提供两种接口:1)EPD是显示设备,因此在驱动程序中将其注册为帧缓存 (framebuffer) 标准设备,遵循framebuffer的标准接口,其中包括对显示设备的打开、读、写以及I/O控制和内存映射等操作;2)提供/sys虚拟文件系统访问接口,该接口主要用于屏幕的强制刷新。

实现该接口后,在Linux系统中即可创建framebuffer设备节点/dev/fb0, 通过标准的open/read/mmap/ioctl/close等系统调用接口即可访问该设备。其中最主要的是fb_write, fb_pan_display和fb_ioctl三个接口的实现。fb_write是对framebuffer设备的写实现,给用户提供了标准的写数据接口,将数据写入驱动后再在EPD上显示。fb_pan_display是切换双缓冲区的控制函数,当用户需要从一个缓冲区切换到另外一个缓冲区显示时,即调用该函数。fb_ioctl给用户提供了一些特殊的命令来控制显示驱动程序进行特殊的操作。

通过power sys的API, 注册一个/sys/power/update的节点,向该文件写入update字符串,即可实现EPD屏幕的强制刷新。

3.5 接口读写函数

EPD控制器操作包括命令和数据两部分,因此封装三个基本操作:写命令、写数据和读数据。其他的诸如读写寄存器、读写数据块以及各种其他控制,都是基于这三个基本操作的。

4 应用实例

一个基于EPD技术的电子阅读设备主要包括以下几个部分:嵌入式处理器、EPD显示模组、存储模块、无线通信模块、电源及其管理模块、数据接口、输入输出设备。本文为了验证EPD驱动程序,专门设计了一个阅读设备,如图4所示。

该阅读器基于Marvell公司的PXA270处理器,采用台湾元太科技 (PVI) 的电子纸显示屏及其控制芯片 (Epson公司生产的 S1D13521B01), 人机交互的方式有两种:小键盘或者液晶屏+触摸屏。EPD模组是整个阅读器的核心部分,EPD驱动程序不仅决定了整个设备能否正常工作,而且其性能将影响显示效果的好坏。该阅读器将前文所述的EPD显示驱动程序集成在设备的硬件抽象层 (HAL) 中,EPD驱动程序在软件系统中负责用户界面和阅读内容的显示。

4.1 显示性能

该设备的EPD驱动程序分别采用Android系统建议的双缓冲机制和本文提出的三缓冲区架构进行实现,通过对同一个图形文件进行绘制,来比较这两种架构的显示性能。测试用例是一个由Android标志衍生出来的动态图片,该图片上半部分的三个小机器人能动。图5是EPD驱动程序采用三缓冲区架构时,测试图片在设备屏幕上的显示结果。而设备如果采用基于双缓冲机制[13]的EPD驱动程序,图片的显示效果如图6所示。

比较图5和图6可以发现,测试图形的静态部分(即ANDROID这7个字母以及小机器人脚下的滑板)显示效果相同,而动态部分(即3个小机器人,在原始图片中是绿色)存在较大的差异。因为三缓冲机制能较好地适应EPD刷新慢这个特点,故当EPD设备采用这种驱动程序显示动态图形时画面正常、平稳。而基于双缓冲机制的EPD驱动程序由于绘制次数频繁,显示屏幕会出现明显的闪烁,如果显示的是动态图形,因为带电粒子缺乏足够的时间运动到最终状态,将会产生显示残影,如图6所示。由此可见,基于三缓冲架构的EPD驱动程序可以通过降低图形的绘制频次来避免屏幕闪烁问题,从而改善了显示效果、提升了用户体验。

4.2 软件架构

在软件方面,该设备运行着带有图形用户界面(Graphica User Interface, GUI)的操作系统,整个软件系统的架构如图7所示。EPD软件系统具有以下特点:操作系统采用嵌入式Linux; 图形界面采用现有的GUI图形库;中间组件集成WiFi/3G等通信模块和各种内容格式的解析模块;系统Framework向应用程序提供统一的界面操作、内容管理和设备管理接口;应用程序可以是某种内容格式的阅读器,也可以是其他应用程序,比如浏览器等。

图片

图7 EPD阅读设备的软件架构

阅读软件是整个电子阅读器设备中的核心软件,其主要功能有文档资源管理、各种类型的文档阅读以及书签管理等。软件基本架构如图8所示,主要由以下几个部分组成:UI, 提供资源管理、菜单、书签等用户接口;文档数据库Provider, 主要作用是扫描SD卡内的阅读文档并形成数据库,供其他组件使用;阅读器的核心组件主要实现文档格式的解析和排版布局的功能。这个软件采用插件 (plugin) 设计方法,每种格式可以设计成一种独立的组件,只需按照插件的格式注册上去,即可对文档进行解析和布局阅读。解析完成后再使用统一的文本和图像布局,这样就能保证每种格式的排版都是一致的。

4.3 运行结果

UI部分是阅读软件的主界面,从Provider数据库里读出扫描的结果,以列表的形式显示出来,如图9所示。

阅读软件支持多种文件格式,如txt、 pdf、 doc、 ppt、 XSL等。图10是ppt文件在EPD屏上的显示结果。

5 结语

本文所述的EPD显示驱动程序结构简单、实现方便。基于三缓冲区的存储架构,既能提高软件操作的效率,又能保证数据访问的安全性和可靠性,更重要的是,它降低了图形的绘制频次,从而不会出现屏闪和残影问题。实现结果和应用实例表明,该驱动程序工作正常,并能适应EPD主流应用――电子阅读的技术特点,展现良好的显示效果和用户体验。

参考文献:

[1] OMODANI M. Electronic paper: concept and expectations[J]. 仪器仪表学报, 2004, 25(S4): 67-71.

[2] 付永华, 江源, 胡星波. 一种面向数字版权保护的EPD电子教材的设计与实现[J]. 江西科学, 2013, 31(1): 103-108.

[3] 李庆诚, 胡海军, 宫晓利, 等. 基于任务队列的电子纸显示屏刷新策略研究[J]. 现代显示,2011, 22(6): 20-24.

[4] 李庆诚, 宫晓利, 马捷, 等. 自恢复的电子纸屏幕显示管理策略研究[J]. 现代显示,2011, 22(1/2): 20-23.

[5] 李文睿, 陈新. ARM9+Linux下电子纸驱动的设计与实现[J]. 电子技术应用, 2011, 37(10): 42-45.

[6] 徐莹莹. 嵌入式电子纸帧缓冲驱动程序设计研究[D]. 西安: 西安电子科技大学, 2010.

[7] 张秋野. 基于嵌入式Linux和EPD显示的PDA底层驱动设计[D]. 上海: 上海交通大学, 2007.

[8] 叶炳发, 孟小华. Android图形系统的分析与移植[J]. 电信科学,2010, 26(2): 65-68.

[9] 胡力刚, 许伟明. 电子纸阅读器的设计[J]. 计算机测量与控制, 2010, 18(7): 1621-1626.

[10] 李庆诚, 陈越. Linux电子纸屏幕印刷系统研究与实现[J]. 计算机工程与设计,2008, 29(4): 952-954.

[11] 张伽伟, 周安栋, 罗勇. ARM11嵌入式系统Linux下LCD的驱动设计[J]. 液晶与显示, 2011, 26(5):660-664.

[12] CORBET J, RUBINI A, KROAHHARTMAN G. Linux设备驱动程序设计[M]. 3版. 魏永明, 耿岳, 钟书毅, 译. 北京: 中国电力出版社, 2006.

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