嵌入式软件开发导论7设备驱动程序开发.ppt

上传人:wj 文档编号:18719337 上传时间:2023-10-18 格式:PPT 页数:81 大小:1.69MB
下载 相关 举报
嵌入式软件开发导论7设备驱动程序开发.ppt_第1页
第1页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第2页
第2页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第3页
第3页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第4页
第4页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第5页
第5页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第6页
第6页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第7页
第7页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第8页
第8页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第9页
第9页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第10页
第10页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第11页
第11页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第12页
第12页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第13页
第13页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第14页
第14页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第15页
第15页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第16页
第16页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第17页
第17页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第18页
第18页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第19页
第19页 / 共81页
嵌入式软件开发导论7设备驱动程序开发.ppt_第20页
第20页 / 共81页
亲,该文档总共81页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式软件开发导论7设备驱动程序开发.ppt

《嵌入式软件开发导论7设备驱动程序开发.ppt》由会员分享,可在线阅读,更多相关《嵌入式软件开发导论7设备驱动程序开发.ppt(81页珍藏版)》请在冰点文库上搜索。

嵌入式软件开发导论7设备驱动程序开发.ppt

嵌入式软件开发导论,同济大学软件学院2006,7.设备驱动程序开发,主要内容,概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务,什么是设备驱动程序,设备驱动程序是与硬件设备进行通信的系统程序。

一个设备可以是物理设备,也可以是一个逻辑实体。

通常,这些实体需要操作系统对其进行控制,资源管理。

设备驱动程序就是管理这些物理设备或者虚拟设备,协议或者系统服务的软件模块。

对于每一个基于WindowsCE的设备,设备驱动程序都是必不可少。

-译自MSDN,“一般”驱动程序开发的理解,必须使用汇编语言对端口进行读写设备驱动程序是操作系统的一部分,难于开发与调试。

设备驱动程序控制硬件中断比较难于处理,必须使用汇编语言读写端口,CEDDK.dll提供APIs与硬件进行通信HalGetBusDataREAD_PORT_UCHARWRITE_REGISTER_ULONG对于逻辑设备驱动程序,采用Win32APIs从硬件获取数据,设备驱动程序是操作系统的一部分,难于开发与调试,对于UNIX或者是Windows9x,设备驱动程序是与操作系统映像连接的,并运行于系统内核态。

对于windowsCE,大多数的设备驱动程序运行于用户态,简单的来说就是一个DLL文件。

设备驱动程序控制硬件,大多数的设备驱动程序用来控制硬件。

对于某些硬件,是没有驱动的。

CPU内存对于虚拟设备驱动程序,没有物理设备。

文件系统驱动程序RAMdisk,中断有时难于处理,WindowsCE提供逻辑中断(SYSINTRs)中断由一个用户态的线程进行处理(IST),为什么应当写驱动程序?

当我们设计硬件时,就需要提供这一硬件的驱动软件。

硬件OEM厂商不提供基于WindowsCE的硬件驱动,但是提供硬件的规格说明。

对于一个现有硬件驱动的功能进行扩展。

驱动分类整体,WindowsCE整体上将设备驱动分为三种:

内置驱动总线流接口,内置驱动,硬件所必须的驱动程序,这些驱动程序通常由设计OEM厂商进行设计。

如:

键盘,触摸屏,音频设备。

可能不支持一般的驱动接口,也有可能带有扩展的接口或者完全提供一个用户自定义的接口。

内置驱动通常需要针对具体的操作系统进行小幅改动。

总线驱动,管理系统总线如PCI总线等。

PCMCIA与CompactFlash也在其列。

负责处理总线上硬件的询问,以及资源的分配。

同时也请求设备管理器为总线上的硬件安装适当驱动程序。

驱动分类详细,AudioDriversBatteryDriversBlockDriversBluetoothHCITransportDriverDirect3DDeviceDriverInterfaceDirectDrawDisplayDriversDisplayDriversDVD-VideoRendererIEEE1394DriversKeyboardDriversNotificationLEDDriversParallelPortDriversPCCardDriversPrinterDriversSerialPortDriversSmartCardDriversStreamInterfaceDriversTouchScreenDriversUSBDrivers,参见文档:

DriverDevelopment-DriverCategories,驱动的加载过程,大多数的设备驱动由设备管理器(Device.exe)进程在系统启动时进行加载。

另一方面,其中一部分内置驱动程序由GWES.exe进行加载。

这些驱动包括显示器驱动(DDI.dll)、键盘驱动、鼠标驱动、触摸屏驱动等。

驱动的加载过程,当Device.exe对设备驱动程序进行安装时将在注册表的HKEY_LOCAL_MACHINEDrivers项下检查一个字符串,其值为RootKey,传统地,其名字为BuiltIn。

然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。

驱动的加载过程,驱动的加载过程,安装DLL,给每一个驱动创建一个Active键,然后调用ActivateDevice或者ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。

ActivateDevice在HKEY_LOCAL_MACHINEDriversActive下创建一个新的键值。

驱动的加载过程,驱动加载API,设备驱动程序也能通过应用程序进行手动的安装,这是ActivateDeviceEx的一个首选的功能。

安装驱动一个更老的方法是使用RegisterDevice与DeregisterDevice,主要内容,概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务,什么是流接口,流接口驱动包括所有提供流接口函数的驱动程序,不管由这个驱动控制的设备是什么类型。

典型的流接口驱动程序有:

文件系统驱动(iostream,fstream)COM,LPT,使用流接口,hSer=CreateFile(TEXT(“COM1:

”),GENERIC_READ,0,NULL,OPEN_EXSITING,0,NULL);rc=ReadFile(hSer,直接使用Win32文件系统API。

创建一个流驱动程序,写一个导出具体流接口的DLL编译设备驱动程序对注册表进行配置,流接口函数,构建设备驱动程序,构建设备驱动程序与构建一个DLL一样简单。

可以使用PlatformBuilder与EVC+。

只需创建一个WindowsCEDLL项目,输出适当的入口点,然后编写代码。

常犯的一个错误是没有将入口点声明为externC,因此C+编译器就不能处理输出的函数名。

注册表设置,在Project.reg中:

HKEY_LOCAL_MACHINEDriversBuiltInSampleDll=mydriver.DllPrefix=DEMIndex=dword:

1Order=dword:

0FriendlyName=DemoDriverIoctl=dword:

0,注册表设置,Order给所有的驱动设置相对安装顺序。

Order为0的驱动先安装,依次安装Order为1,2,的驱动。

Oder可以让开发者保证有相到依赖关系的多个驱动以适当的顺序进行安装。

Index指定在文件系统中的驱动名的数字部分。

在默认情况下,带有前缀COM的驱动在文件系统中分配名字为COM1,下一个即为COM2。

为了保证驱动总是安装成COM2,必须提供Index=2。

演示:

使用emulator编写一个流接口驱动程序并使用它,驱动是如何工作的,WhenCE启动时,Device.exe根据注册表中的设置安装所有的驱动程序。

当安装mydriver.dll时,device.exe调用DEM1_Init。

Application程序调用CreateFile(“DEM1”),驱动是如何工作的

(2),Coredll.dll处理API调用并切换到device.exeDevice.exe调用mydriver.dll的DEM1_Open。

CreateFile返回DEM1_Open的retval,设备功能栈,硬件,WindowsCEDDKAPI,设备驱动程序,设备管理器(device.exe),应用程序,主要内容,概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务,驱动架构,驱动的类型,内置与流安装机制,通常内置驱动程序根据注册键值安装在GWES进程空间总线驱动由Device.exe根据键值进行安装可安装的流驱动或其它驱动由Device.exe根据总线驱动或注册检查器进行安装。

设备管理器,用户级进程继续运行与内核、注册表交互的单独应用程序,以及流接口驱动DLL。

提供ActivateDevice与DeactivateDeviceAPI。

设备管理器,包括IO资源管理器安装注册表检查器(RegEnum.dll),并由这一个注册表检查器根据注册表进行驱动的安装提供电源通知回调函数跟踪所有已安装的驱动程序,给设备接口发出拉入或删除的通知,设备管理器,设备驱动程序的安装过程,DEVICE.EXE,Kernel,I/OResourceManager(partofDevice.exe),REGENUM.DLL,PCIBUS.DLL,loads,loads,loads,DEVICE.EXE,I/OResourceManager(partofDevice.exe),REGENUM.DLL,PCIBUS.DLL,注册表枚举器,注册枚举器是RegEnum.dllDevice.exe根据HKEY_LOCAL_MACHINEDriversRootKey安装注册枚举器注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器是可重入的,并支持分级使用当注册枚举器卸载时,同时也御载它安装的所有信息注册枚举器根据Order,检查紧挨着传给它的键的下一级键值。

注册枚举器对每一个找到的子键调用ActivateDeviceEx,ActivateDeviceEx,由Device.exe提供总线驱动程序当安装设备驱动时调用ActivateDeviceExActivateDeviceEx也在RAM工作区锁定流接口驱动程序这可以防止代码页被丢弃注册检查器对找到的每一个内置子键调用ActivateDeviceExActivateDeviceEx安装驱动并更新注册表,接口类,驱动程序的接口有以下特征每一个Iclass有一个GUID,一个名字GUID描述类设备接口Name描述接口的实例COM1:

DSK1:

等等提供一个驱动接口在注册表中的Iclass子键驱动程序发布接口AdvertiseInterface应用程序访问接口RequestDeviceNotifications每个已有的接口的预定义GUIDA32942B7-920C-486b-B0E6-92A702A99B35,I/O资源管理(IORM),IORM是设备管理器必备的部分跟踪可用I/O资源(IRQ与I/O基地址)OEM为内置设备预分配的资源当在总线上安装一个客户驱动时,总线驱动请求资源ResourceReleaseResourceRequestResourceCreateList当存在冲突时IORM调用ResourceRequest失败,注册表帮助例程,从注册表中读取资源初始化信息OpenDeviceKeyDDKReg_GetIsrInfoDDKReg_GetWindowInfoDDKReg_GetPciInfo在COREDLL的API在and的函数原型在publiccommonoakdrivers中的例子wavedevpddes1371wavepdd.cpp-GetRegistryConfig,电源管理,电源管理器灵活的系统级与外设级电源管理使设备智能化地管理它们的电源在设备与系统或应用之间充当协调者使OEM修改调用PowerOffSystem()的相关代码,电源管理,系统级电源状态设备(外设)级电源状态,电源管理器架构,驱动,电源管理器(pm.dll),PMAPIs,应用程序,通知消息队列,驱动APIs,应用API,物理内存,64MBRAM,32MBFlash,DbgSerialPort,2GBUser,512MBUncached,512MBCached,64MBRAM,32MBFlash,64MBRAM,32MBFlash,物理内存,内核虚拟地址,Reserved,04000000,82000000,80000000,80000000,A0000000,C0000000,0,NotUsed,Slot0,Slot32,64KB,32MB,64MB,2GB,3GB,4GB,Memorymappedfiles,Above2G-3GMappedtophysicalmemory,Virtualaddressspace,Slot1,Slot32,NULLpointers,虚拟地址空间,0x80000000,0xA0000000,AccessableviaMmMapiIoSpace,内存管理函数,设备驱动程序是用户态模块必须将物理内存映射成虚拟内存VirtualAlloc,VirtualFree:

预留,释放虚拟内存MEM_RESERVEVirtualCopy:

将一个物理内存区域映射到一个虚拟内存区域PAGE_NOCACHEPAGE_PHYSICAL,驱动的内存访问与映射,MapPtrToProcess将一个地址空间的指针映射成另外一个指针GetCurrentProcess/SetProcPermissions重新找回进程ID用于MapPtrToProcess函数MmMapIoSpace将一个物理地址空间映射成一个不分页的,由进程决定的地址空间,CEDDK,CEv2.1x以及后来的版本支持独立于平台的I/O配置让OEM以及驱动开发人员使用它们CEDDK.DLL总线管理内存管理I/O管理从NTDDK拿来的CEDDKAPI直到V2.12以后的版本才有文档但在大多数V2.00版中都有,CEDDK简介,设备驱动使用CEDDK正常开发的驱动是跨平台二进制兼容的跨CPU的源代码兼容,设备管理器,设备驱动,CEDDK.DLL,硬件,CEDDK内容,中断架构,中断只是异常处理的一部分在内核代码中被获取在恢复到用户态之间进行处理但是硬件是独立于操作系统的CE使用二阶段中断服务模式少量的代码进行中断的记录调度中断服务程序代码进行处理操作系统提供API来使能IRQ信号,设置中断的优先级,等等。

与硬件有关的操作在OAL,以及设备驱动代码中进行。

关于ISR与IST的一些解释,IST是老的用户模式代码有完整的CE.NETAPI与CRT库CE.NET调度程序根据线程的优先级控制IST的执行运行态绑定到SYSINTR从异常处理函数调用ISR没有操作系统服务堆栈空间大小有限可设置为可重入的(在OAL进行设置)MIPS,SHx汇编语言,ISR,IRQ优先级的设定依赖于不同CPU的系统架构在x86上由PIC硬件进行设置在MIPS上用OAL的IntrPriority,IntrMask进行设置通过让IST进程推断ISR服务,OAL能够增加实时性。

在CE3.0中,所有的ISR代码都是OAL的一部分没有特殊的扩展IRQ绑定到OEMInit的事件ID没有支持PNP,共享IRQ(PCI总线)CE.NET通过IRS(IISR)链解决了这些限制。

CE.NET可安装ISR,CE3.0ISR架构的首选扩展DLL代码,在运行时进行绑定源代码可以是独立于CPU的一般用C编写有一些限制不能调用CRT,WindowsAPI,或其它的DLL不可推断的ISR,或IST发布支持硬件共IRQ共享从同一个IRQ关联的不同SYSINTRID,IISR,CE.NET中断处理,内核,OAL,驱动,硬件,设置事件,SYSINTR_ID,被屏蔽的IRQ,IST,中断服务线程,是内置设备的驱动程序的作户态线程进行实际的中断处理调用CreateEvent创建一个与逻辑中断相关联的事件对象IST在大多数时间里都是处于空闲状态,以内核用信号通知事件对象时被唤醒IST通常运行的优先级高于普通优先级,其优先级由CeSetThreadPriority函数设定,中断服务线程,InterruptInitialize调用InterruptInitialize将事件与ISR的中断标识符关联起来WaitForSingleObject用来等待一个用信号通知的事件这一调用通常放在一个循环中,以使和中断处理时,IST可以回到这一个调用等待下一个要处理的中断InterruptDone中断数据处理完以后,IST必须调用InterruptDone函数使内核使能与这一个线程相关的中断,典型的IST启动,structISTData/DeclaretheStrucuretopasstotheISTHANDLEhThread;/ISTHandleDWORDsysIntr;/LogicalIDHANDLEhEvent;/handletotheeventtowaitforinterruptvolatileBOOLabort;/flagtotesttoexittheIST;ISTDatag_KeypadISTData;/CreateeventtolinktoISTg_KeypadISTData.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);/TranslateIRQtoanlogicalID(x86CEPC)g_KeypadISTData.sysIntr=Mapirq2Sysintr(5);/startthethreadg_KeypadISTData.hThread=CreateThread(NULL,0,典型的IST启动,/ChangethethreadspriorityCeSetThreadPriority(g_KeypadISTData.hThread,0);/disconnectanypreviouseventfromlogicalIDInterruptDisable(g_KeypadISTData.sysIntr);/ConnectLogicalIDwithEventInterruptInitialize(g_KeypadISTData.sysIntr,g_KeypadISTData.hEvent,NULL,0);,设置IST的优先级与以前的事件断开与ISR关联,典型的IST启动,DWORDKeypadIST(void*dat)ISTData*pData=(ISTData*)dat;/loopuntiltoldtostopWhile(!

pData-abort)/waitfortheinterruptevent.WaitForSingleObject(pData-hEvent,INFINITE)if(pData-abort)break;/Handletheinterrupt./LetOSknowtheinterruptprocessingisdoneInterruptDone(pData-sysIntr);Return0;,典型的IST结束,/setabortflagtotruetoletthreadknow/thatitshouldexitg_KeypadISTData.abort=TRUE;/disconnecteventfromlogicalID/thisinternallysetsg_KeypadISTData.sysIntrwhichinturn/setsg_KeypadISTData.hEventthroughthekernelInterruptDisable(g_KeypadISTData.sysIntr);/waitforthreadtoexitWaitForSingleObject(g_KeypadISTData.hEvent,INFINITE);CloseHandle(g_KeypadISTData.hEvent);CloseHandle(g_KeypadISTData.hThread);,设置一个会导致IST退出的标志,总线驱动概览,PCMCIAI82365(ISA)TI-1250(PCI)USBHost多主控制器OHCI与UHCI(PCI),PCMCIAHost,PCMCIA总线驱动有三个主要的线程状态改变线程(卡的插入与移除)中断线程(处理卡的功能性中断请求)回调线程(通知事件相关的设备卡)总线驱动支持CardServ消息的一个子集,从回调线程中用回调函数发送中断以回调的形式发送到客户端驱动对新插入的卡进行扫描以确定是否PnP元组,并与注册表中的相关项进行比较如果没有发现相匹配的信息,则候选的驱动程序就运行与卡相关的“detect”例程对卡进行识别可能显示出一个对话框询问DLL的名字,USBHost,兼容USB1.1版完全支持OHCI与UHCI支持所有的传输类型Isoch,bulk,interrupt,controlUSBD支持多个HC的复用总线设备驱动典型地采用LoadDriver进行安装,使用USBD操作与HC进行通信总线设备驱动能可选地调用ActivateDeviceEx()以提供一个流接口给应用程序检测并识别新装设备按照注册表中的描述安装驱动可能显示一个对话框询问DLL的名字,OEM硬件,单块驱动(显示),GWE子系统,设备管理器,MDD,PDD,MDD,PDD,DDI,DDSI,DDSI,编程模型,USB总线设备驱动,HCD,USBD,MDD,PDD,主要内容,概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务,USB驱动传输类型,控制传输USB打印机,USB数码相机同步传输USB网络电话中断传输鼠标,键盘,游戏控制器批量传输USB相机,必须的入口点,USBDeviceAttach当设备挂接时,USB驱动模块调用这个函数USBInstallDriver当一个不明设备挂接到USB上时,USB驱动模块调用这个函数USBUnInstallDriver总线设备驱动能调用这个函数从USB驱动注消,USB鼠标模型,演示:

USB鼠标驱动代码,主要内容,概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务,系统服务的概念与历史,在WindowsCE4.0以前,没有系统服务所谓的“设备驱动”被写成一个工作区在WindowsCE4.0以后,引入了系统服务管理器,系统服务注册,系统服务体系架构,CE的系统服务是一个DLL,这个DLL的构建几乎与流设备驱动一模一样与流设备驱动一样,WindowsCE系统服务提供同样的10个入点口,从xxx_Init到xxx_PowerDown系统服务有三个前缀字符,系统服务IOCTL命令,IOCTL_SERVICE_STARTIOCTL_SERVICE_STOPIOCTL_SERVICE_REFRESHIOCTL_SERVICE_INSTALLIOCTL_SERVICE_STATUSIOCTL_SERVICE_SUPPORTED_OPTIONS,系统服务的应用控制,ActivateServiceRegisterServiceGetServiceHandleServiceIoControlDeregisterService,作业,读Service.exe的在线帮助,自已实现关于WindowsCE的系统服务。

应用程序发送I/O控制命令,然后服务例程将当前时间写到日志文件,

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

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2