您好,欢迎访问三七文档
嵌入式软件开发导论同济大学软件学院20057.设备驱动程序开发主要内容概述流驱动接口设备驱动程序架构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)、键盘驱动、鼠标驱动、触摸屏驱动等。驱动的加载过程1.当Device.exe对设备驱动程序进行安装时将在注册表的[HKEY_LOCAL_MACHINE]\Drivers项下检查一个字符串,其值为RootKey,传统地,其名字为BuiltIn。2.然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。驱动的加载过程驱动的加载过程3.安装DLL,给每一个驱动创建一个Active键,然后调用ActivateDevice或者ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。4.ActivateDevice在[HKEY_LOCAL_MACHINE\Drivers\Active下创建一个新的键值。驱动的加载过程驱动加载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,&ch,1,&cBytes,NULL);TransmitCommChar(hSer,‘a’);CloseHandle(hSer);直接使用Win32文件系统API。创建一个流驱动程序1.写一个导出具体流接口的DLL2.编译设备驱动程序3.对注册表进行配置流接口函数函数名说明XXX_Close关闭以hOpenContext标识的设备上下文。XXX_Deinit由设备管理器调用来删除对某一设备的初始化信息。XXX_Init由设备管理器调用来对某一设备进行初始化。XXX_IOControl向设备发送命令XXX_Open打开一个设备以进行读、写或者既读又写。当应用调用CreateFile来打开某一个设备文件名时将间接地调用这一个函数。XXX_PowerDown停止向设备供电。只有在软件控制下关机的设备上才可用。XXX_PowerUp恢复向设备供电XXX_Read从设备读取数据XXX_Seek在设备中移动数据指针XXX_Write向设备写数据构建设备驱动程序构建设备驱动程序与构建一个DLL一样简单。可以使用PlatformBuilder与EVC++。只需创建一个WindowsCEDLL项目,输出适当的入口点,然后编写代码。常犯的一个错误是没有将入口点声明为externC,因此C++编译器就不能处理输出的函数名。注册表设置在Project.reg中:[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Sample]Dll=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编写一个流接口驱动程序并使用它驱动是如何工作的1.WhenCE启动时,Device.exe根据注册表中的设置安装所有的驱动程序。2.当安装mydriver.dll时,device.exe调用DEM1_Init。3.Application程序调用CreateFile(“DEM1”…)驱动是如何工作的(2)4.Coredll.dll处理API调用并切换到device.exe5.Device.exe调用mydriver.dll的DEM1_Open。6.CreateFile返回DEM1_Open的retval设备功能栈硬件WindowsCEDDKAPI设备驱动程序设备管理器(device.exe)应用程序主要内容概述流驱动接口设备驱动程序架构USBmouse驱动开发示例WindowsCE系统服务驱动架构PCIBusPCMCIAHostUSBHost(OHCI/UHCI)1394(OHCI)HIDPrinterMassStoragerNDISATADiskSBP/2AV/CMouseBatteryTouchNotificationLEDDisplayAudioNetworkDeviceGWESI/ORMSerCardNE2000驱动的类型内置与流安装机制通常内置驱动程序根据注册键值安装在GWES进程空间总线驱动由Device.exe根据键值进行安装可安装的流驱动或其它驱动由Device.exe根据总线驱动或注册检查器进行安装。设备管理器用户级进程继续运行与内核、注册表交互的单独应用程序,以及流接口驱动DLL。提供ActivateDevice与DeactivateDeviceAPI。设备管理器包括IO资源管理器安装注册表检查器(RegEnum.dll),并由这一个注册表检查器根据注册表进行驱动的安装提供电源通知回调函数跟踪所有已安装的驱动程序,给设备接口发出拉入或删除的通知设备管理器设备驱动程序的安装过程DEVICE.EXEKernelI/OResourceManager(partofDevice.exe)REGENUM.DLLPCIBUS.DLLloadsloadsloadsDEVICE.EXEI/OResourceManager(partofDevice.exe)REGENUM.DLLPCIBUS.DLL注册表枚举器注册枚举器是RegEnum.dllDevice.exe根据HKEY_LOCAL_MACHINE\Drivers\RootKey安装注册枚举器注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器是可重入的,并支持分级使用当注册枚举器卸载时,同时也御载它安装的所有信息注册枚举器根据Order,检查紧挨着传给它的键的下一级键值。注册枚举器对每一个找到的子键调用ActivateDeviceExActivateDeviceEx由Device.exe提供总线驱动程序当安装设备驱动时调用ActivateDeviceExActivateDeviceEx也在RAM工作区锁定流接口驱动程序这可以防止代码页被丢弃注册检查器对找到的每一个内置子键调用ActivateDeviceExActivateDeviceEx安装驱动并更新注册表接口类驱动程序的接口有以下特征每一个Iclass有一个GUID,一个名字GUID描述类设备接口Name描述接口的实例COM1:,DSK1:等等提供一个驱动接口在注册表中的Iclass子键驱动程序发布接口–AdvertiseInterface应用程序访问接口–RequestDeviceNotifications每个已有的接口的预定义GUIDA32942B7-920C-486b-B0E6-92A702A99B35I/O资源管理(IORM)IORM是设备管理器必备的部分跟踪可用I/O资源(IRQ与I/O基地址)OEM为内置设备预分配的资源当在总线上安装一个客户驱动时,总线驱动请求资源ResourceReleaseResourceRequestResourceCreateList当存在冲突时IORM调用ResourceRequest失败注册表帮助例程从注册表中读取资源初始化信息OpenDeviceKeyDDKReg_GetIsrInfoDDKReg_GetWindowInfoDDKReg_GetPciInfo在COREDLL的API在devload.handddkreg.h
本文标题:7设备驱动程序开发
链接地址:https://www.777doc.com/doc-1305984 .html