资源预览内容
第1页 / 共81页
第2页 / 共81页
第3页 / 共81页
第4页 / 共81页
第5页 / 共81页
第6页 / 共81页
第7页 / 共81页
第8页 / 共81页
第9页 / 共81页
第10页 / 共81页
亲,该文档总共81页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式软件开发导论嵌入式软件开发导论同济大学软件学院同济大学软件学院20067. 设备驱动程序开发设备驱动程序开发主要内容主要内容l l概述概述l l流驱动接口流驱动接口l l设备驱动程序架构设备驱动程序架构l lUSB mouse 驱动开发示例驱动开发示例l lWindows CE 系统服务系统服务什么是设备驱动程序什么是设备驱动程序设备驱动程序是与硬件设备进行通信的系统设备驱动程序是与硬件设备进行通信的系统程序。一个设备可以是物理设备,也可以是程序。一个设备可以是物理设备,也可以是一个逻辑实体。通常,这些实体需要操作系一个逻辑实体。通常,这些实体需要操作系统对其进行控制,资源管理。设备驱动程序统对其进行控制,资源管理。设备驱动程序就是管理这些物理设备或者虚拟设备,协议就是管理这些物理设备或者虚拟设备,协议 或者系统服务的软件模块。或者系统服务的软件模块。 对于每一个基于对于每一个基于Windows CE的设备,设备驱动程序都是必的设备,设备驱动程序都是必不可少。不可少。-译自译自 MSDN“一般一般”驱动程序开发的理解驱动程序开发的理解l l必须使用汇编语言对端口进行读写必须使用汇编语言对端口进行读写l l设备驱动程序是操作系统的一部分,难于设备驱动程序是操作系统的一部分,难于开发与调试。开发与调试。l l设备驱动程序控制硬件设备驱动程序控制硬件l l中断比较难于处理中断比较难于处理必须使用汇编语言读写端口必须使用汇编语言读写端口l l 提供提供 APIs与硬件进行通信与硬件进行通信HalGetBusDataHalGetBusDataREAD_PORT_UCHARREAD_PORT_UCHARWRITE_REGISTER_ULONGWRITE_REGISTER_ULONGl l对于逻辑设备驱动程序,采用对于逻辑设备驱动程序,采用Win32 APIs 从硬件获取数据从硬件获取数据设备驱动程序是操作系统的一设备驱动程序是操作系统的一部分,难于开发与调试部分,难于开发与调试l l对于对于UNIX或者是或者是 Windows 9x,设备驱动程设备驱动程序是与操作系统映像连接的,并运行于系序是与操作系统映像连接的,并运行于系统内核态。统内核态。l l对于对于windows CE,大多数的设备驱动程序大多数的设备驱动程序运行于用户态,简单的来说就是一个运行于用户态,简单的来说就是一个DLL文件。文件。设备驱动程序控制硬件设备驱动程序控制硬件l l大多数的设备驱动程序用来控制硬件。大多数的设备驱动程序用来控制硬件。l l对于某些硬件,是没有驱动的。对于某些硬件,是没有驱动的。CPUCPU内存内存内存内存l l对于虚拟设备驱动程序,没有物理设备。对于虚拟设备驱动程序,没有物理设备。文件系统驱动程序文件系统驱动程序文件系统驱动程序文件系统驱动程序RAM diskRAM disk中断有时难于处理中断有时难于处理l lWindows CE提供逻辑中断提供逻辑中断 (SYSINTRs) l l中断由一个用户态的线程进行处理中断由一个用户态的线程进行处理 (IST)为什么应当写驱动程序?为什么应当写驱动程序?l l当我们设计硬件时,就需要提供这一硬件当我们设计硬件时,就需要提供这一硬件的驱动软件。的驱动软件。l l硬件硬件OEM厂商不提供基于厂商不提供基于Windows CE的的硬件驱动,但是提供硬件的规格说明。硬件驱动,但是提供硬件的规格说明。l l对于一个现有硬件驱动的功能进行扩展。对于一个现有硬件驱动的功能进行扩展。驱动分类驱动分类整体整体 l lWindows CE 整体上将设备驱动分为三种整体上将设备驱动分为三种: 内置驱动内置驱动内置驱动内置驱动总线总线总线总线流接口流接口流接口流接口内置驱动内置驱动l l硬件所必须的驱动程序,这些驱动程序通硬件所必须的驱动程序,这些驱动程序通常由设计常由设计OEM厂商进行设计。厂商进行设计。l l如如:键盘,触摸屏,音频设备。键盘,触摸屏,音频设备。l l可能不支持一般的驱动接口,也有可能带可能不支持一般的驱动接口,也有可能带有扩展的接口或者完全提供一个用户自定有扩展的接口或者完全提供一个用户自定义的接口。义的接口。l l内置驱动通常需要针对具体的操作系统进内置驱动通常需要针对具体的操作系统进行小幅改动。行小幅改动。总线驱动总线驱动l l管理系统总线如管理系统总线如PCI总线等。总线等。PCMCIA与与 CompactFlash也在其列。也在其列。l l负责处理总线上硬件的询问,以及资源的负责处理总线上硬件的询问,以及资源的分配。分配。 l l同时也请求设备管理器为总线上的硬件安同时也请求设备管理器为总线上的硬件安装适当驱动程序。装适当驱动程序。驱动分类驱动分类 详细详细l lAudio DriversAudio Drivers l lBattery DriversBattery Drivers l lBlock DriversBlock Drivers l lBluetooth HCI Transport DriverBluetooth HCI Transport Driver l lDirect3D Device Driver InterfaceDirect3D Device Driver Interface l lDirectDraw Display DriversDirectDraw Display Drivers l lDisplay DriversDisplay Drivers l lDVD-Video RendererDVD-Video Renderer l lIEEE 1394 DriversIEEE 1394 Drivers l lKeyboard DriversKeyboard Drivers l lNotification LED DriversNotification LED Drivers l lParallel Port DriversParallel Port Drivers l lPC Card DriversPC Card Drivers l lPrinter DriversPrinter Drivers l lSerial Port DriversSerial Port Drivers l lSmart Card DriversSmart Card Drivers l lStream Interface DriversStream Interface Drivers l lTouch Screen DriversTouch Screen Drivers l lUSB DriversUSB Drivers 参见文档参见文档:Driver Development - Driver Development - Driver CategoriesDriver Categories驱动的加载过程驱动的加载过程l l大多数的设备驱动由设备管理器大多数的设备驱动由设备管理器(Device.exe)进程在系统启动时进行加载。进程在系统启动时进行加载。l l另一方面,其中一部分内置驱动程序由进另一方面,其中一部分内置驱动程序由进行加载。这些驱动包括显示器驱动行加载。这些驱动包括显示器驱动 ()、键键盘驱动、鼠标驱动、触摸屏驱动等。盘驱动、鼠标驱动、触摸屏驱动等。驱动的加载过程驱动的加载过程1.1.当当对设备驱动程序进行安装时将在注册表对设备驱动程序进行安装时将在注册表的的HKEY_LOCAL_ MACHINEDrivers项项下检查一个字符串,其值为下检查一个字符串,其值为 RootKey,传统传统地,其名字为地,其名字为 BuiltIn 。2.2.然后设备管理器在进行初始化时使用注册然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取信息检查器为它需要安装的各个驱动读取值为值为RootKey的键。的键。 驱动的加载过程驱动的加载过程驱动的加载过程驱动的加载过程3.3.安装安装DLL,给每一个驱动创建一个给每一个驱动创建一个Active 键,键,然后调用然后调用ActivateDevice 或者或者 ActivateDeviceEx将将DLL注册为系统中的注册为系统中的一个设备驱动程序。一个设备驱动程序。 4.4.ActivateDevice在在 HKEY_LOCAL_MACHINEDriversActive下创建一个新的键值。下创建一个新的键值。驱动的加载过程驱动的加载过程驱动加载驱动加载APIl l设备驱动程序也能通过应用程序进行手动设备驱动程序也能通过应用程序进行手动的安装,这是的安装,这是ActivateDeviceEx的一个首的一个首选的功能。选的功能。l l安装驱动一个更老的方法是使用安装驱动一个更老的方法是使用RegisterDevice 与与 DeregisterDevice 主要内容主要内容l l概述概述l l流驱动接口流驱动接口l l设备驱动程序架构设备驱动程序架构l lUSB mouse 驱动开发示例驱动开发示例l lWindows CE 系统服务系统服务什么是流接口什么是流接口l l流接口驱动包括所有提供流接口函数的驱流接口驱动包括所有提供流接口函数的驱动程序,不管由这个驱动控制的设备是什动程序,不管由这个驱动控制的设备是什么类型。么类型。 l l典型的流接口驱动程序有:典型的流接口驱动程序有:文件系统驱动文件系统驱动文件系统驱动文件系统驱动 (iostream, fstream) (iostream, fstream)COM, LPTCOM, 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.1.写一个导出具体流接口的写一个导出具体流接口的DLL2.2.编译设备驱动程序编译设备驱动程序3.3.对注册表进行配置对注册表进行配置流接口函数流接口函数函数名函数名函数名函数名说明说明说明说明XXX_CloseXXX_Close关闭以关闭以hOpenContexthOpenContext标识的设备上下文。标识的设备上下文。XXX_DeinitXXX_Deinit由设备管理器调用来删除对某一设备的初始化信息。由设备管理器调用来删除对某一设备的初始化信息。XXX_InitXXX_Init由设备管理器调用来对某一设备进行初始化。由设备管理器调用来对某一设备进行初始化。XXX_IOControlXXX_IOControl向设备发送命令向设备发送命令XXX_OpenXXX_Open打开一个设备以进行读、写或者既读又写。当应用调用打开一个设备以进行读、写或者既读又写。当应用调用CreateFileCreateFile来打开某一个设备文件名时将间接地调用这来打开某一个设备文件名时将间接地调用这一个函数。一个函数。XXX_PowerDownXXX_PowerDown停止向设备供电。只有在软件控制下关机的设备上才可用。停止向设备供电。只有在软件控制下关机的设备上才可用。XXX_PowerUpXXX_PowerUp恢复向设备供电恢复向设备供电XXX_ReadXXX_Read从设备读取数据从设备读取数据XXX_SeekXXX_Seek在设备中移动数据指针在设备中移动数据指针XXX_WriteXXX_Write向设备写数据向设备写数据构建设备驱动程序构建设备驱动程序l l构建设备驱动程序与构建一个构建设备驱动程序与构建一个DLL一样简一样简单。单。 l l可以使用可以使用Platform Builder与与EVC+。只只需创建一个需创建一个Windows CE DLL项目项目, 输出输出适当适当 的入口点,然后编写代码。的入口点,然后编写代码。l l常犯的一个错误是没有将入口点声明为常犯的一个错误是没有将入口点声明为 extern C,因此因此 C+编译器就不能处理输编译器就不能处理输出的函数名。出的函数名。注册表设置注册表设置l l在在 中中:HKEY_LOCAL_MACHINEDriversBuiltInSampleHKEY_LOCAL_MACHINEDriversBuiltInSample Dll = Dll = Prefix = DEM Prefix = DEM Index = dword:1 Index = dword:1 Order = dword:0 Order = dword:0 FriendlyName = Demo Driver FriendlyName = Demo Driver Ioctl = dword:0 Ioctl = dword:0注册表设置注册表设置l lOrder给所有的驱动设置相对安装顺序。给所有的驱动设置相对安装顺序。给所有的驱动设置相对安装顺序。给所有的驱动设置相对安装顺序。Order Order 为为为为0 0的驱动先安装,依次安装的驱动先安装,依次安装的驱动先安装,依次安装的驱动先安装,依次安装OrderOrder为为为为1,2,1,2,的驱的驱的驱的驱动。动。动。动。OderOder可以让开发者保证有相到依赖关系可以让开发者保证有相到依赖关系可以让开发者保证有相到依赖关系可以让开发者保证有相到依赖关系的多个驱动以适当的顺序进行安装。的多个驱动以适当的顺序进行安装。的多个驱动以适当的顺序进行安装。的多个驱动以适当的顺序进行安装。l lIndex指定在文件系统中的驱动名的数字部分。在默指定在文件系统中的驱动名的数字部分。在默指定在文件系统中的驱动名的数字部分。在默指定在文件系统中的驱动名的数字部分。在默认情况下,带有前缀认情况下,带有前缀认情况下,带有前缀认情况下,带有前缀COMCOM的驱动在文件系统的驱动在文件系统的驱动在文件系统的驱动在文件系统中分配名字为中分配名字为中分配名字为中分配名字为 COM1COM1,下一个即为下一个即为下一个即为下一个即为COM2COM2。为为为为了保证驱动总是安装成了保证驱动总是安装成了保证驱动总是安装成了保证驱动总是安装成COM2COM2,必须提供必须提供必须提供必须提供Index = 2Index = 2。演示演示 :使用使用emulator编写一个流接口驱动编写一个流接口驱动程序并使用它程序并使用它驱动是如何工作的驱动是如何工作的1.1.When CE启动时启动时根据注册表中的设置安装所根据注册表中的设置安装所有的驱动程序。有的驱动程序。2.2.当安装当安装时,时, 调用调用 DEM1_Init。3.3.Application程序调用程序调用CreateFile(“DEM1”)驱动是如何工作的驱动是如何工作的(2)4.4. 处理处理API调用并切换到调用并切换到5.5.Device.exe 调用调用 的的DEM1_Open。6.6.CreateFile返回返回DEM1_Open的的retval设备功能栈设备功能栈硬件硬件Windows CE DDK API设备驱动程序设备驱动程序设备管理器设备管理器(device.exe)应用程序应用程序主要内容主要内容l l概述概述l l流驱动接口流驱动接口l l设备驱动程序架构设备驱动程序架构l lUSB mouse 驱动开发示例驱动开发示例l lWindows CE 系统服务系统服务驱动架构驱动架构驱动的类型驱动的类型内置与流安装机制内置与流安装机制l l通常内置驱动程序根据注册键值安装在通常内置驱动程序根据注册键值安装在 GWES进程空间进程空间l l总线驱动由根据键值进行安装总线驱动由根据键值进行安装l l可安装的流驱动或其它驱动由根据总线驱可安装的流驱动或其它驱动由根据总线驱动或注册检查器进行安装。动或注册检查器进行安装。设备管理器设备管理器l l用户级进程继续运行用户级进程继续运行l l与内核、注册表交互的单独应用程序,以与内核、注册表交互的单独应用程序,以及流接口驱动及流接口驱动DLL。l l提供提供ActivateDevice 与与 DeactivateDevice API。设备管理器设备管理器l l包括包括IO资源管理器资源管理器l l安装注册表检查器安装注册表检查器() ,并由这一个注册表并由这一个注册表检查器根据注册表进行驱动的安装检查器根据注册表进行驱动的安装l l提供电源通知回调函数提供电源通知回调函数跟踪所有已安装的驱动程序,给设备接口发出跟踪所有已安装的驱动程序,给设备接口发出跟踪所有已安装的驱动程序,给设备接口发出跟踪所有已安装的驱动程序,给设备接口发出拉入或删除的通知拉入或删除的通知拉入或删除的通知拉入或删除的通知设备管理器设备管理器 l l设备驱动程序的安装过程设备驱动程序的安装过程KernelKernelI/O Resource Manager(part of Device.exe)loadsloadsloadsloadsloadsloadsI/O Resource ManagerI/O Resource Manager(part of Device.exe)(part of Device.exe)注册表枚举器注册表枚举器l l注册枚举器是注册枚举器是注册枚举器是注册枚举器是l l根据根据根据根据HKEY_LOCAL_MACHINEDriversRootKeyHKEY_LOCAL_MACHINEDriversRootKey安安安安装注册枚举器装注册枚举器装注册枚举器装注册枚举器l l注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器给每一个要安装的驱动程序扫描表项l l注册枚举器是可重入的,并支持分级使用注册枚举器是可重入的,并支持分级使用注册枚举器是可重入的,并支持分级使用注册枚举器是可重入的,并支持分级使用l l当注册枚举器卸载时,同时也御载它安装的所有信当注册枚举器卸载时,同时也御载它安装的所有信当注册枚举器卸载时,同时也御载它安装的所有信当注册枚举器卸载时,同时也御载它安装的所有信息息息息l l注册枚举器根据注册枚举器根据注册枚举器根据注册枚举器根据Order,Order,检查紧挨着传给它的键的下检查紧挨着传给它的键的下检查紧挨着传给它的键的下检查紧挨着传给它的键的下一级键值。一级键值。一级键值。一级键值。l l注册枚举器对每一个找到的子键调用注册枚举器对每一个找到的子键调用注册枚举器对每一个找到的子键调用注册枚举器对每一个找到的子键调用ActivateDeviceExActivateDeviceExActivateDeviceExl l由提供由提供由提供由提供l l总线驱动程序当安装设备驱动时调用总线驱动程序当安装设备驱动时调用总线驱动程序当安装设备驱动时调用总线驱动程序当安装设备驱动时调用ActivateDeviceExActivateDeviceExl lActivateDeviceExActivateDeviceEx也在也在也在也在RAMRAM工作区锁定流接口驱工作区锁定流接口驱工作区锁定流接口驱工作区锁定流接口驱动程序动程序动程序动程序l l这可以防止代码页被丢弃这可以防止代码页被丢弃这可以防止代码页被丢弃这可以防止代码页被丢弃l l注册检查器对找到的每一个内置子键调用注册检查器对找到的每一个内置子键调用注册检查器对找到的每一个内置子键调用注册检查器对找到的每一个内置子键调用ActivateDeviceExActivateDeviceExl lActivateDeviceExActivateDeviceEx安装驱动并更新注册表安装驱动并更新注册表安装驱动并更新注册表安装驱动并更新注册表接口类接口类l l驱动程序的接口有以下特征驱动程序的接口有以下特征驱动程序的接口有以下特征驱动程序的接口有以下特征每一个每一个每一个每一个IclassIclass有一个有一个有一个有一个GUIDGUID,一个名字一个名字一个名字一个名字GUIDGUID描述类设备接口描述类设备接口描述类设备接口描述类设备接口NameName 描述接口的实例描述接口的实例描述接口的实例描述接口的实例 COM1:, DSK1: COM1:, DSK1: 等等等等等等等等l l提供一个驱动接口提供一个驱动接口提供一个驱动接口提供一个驱动接口在注册表中的在注册表中的在注册表中的在注册表中的IclassIclass子键子键子键子键驱动程序发布接口驱动程序发布接口驱动程序发布接口驱动程序发布接口 AdvertiseInterfaceAdvertiseInterfacel l应用程序访问接口应用程序访问接口应用程序访问接口应用程序访问接口 RequestDeviceNotificationsRequestDeviceNotificationsl l每个已有的接口的预定义每个已有的接口的预定义每个已有的接口的预定义每个已有的接口的预定义GUIDGUIDA32942B7-920C-486b-B0E6-92A702A99B35 A32942B7-920C-486b-B0E6-92A702A99B35 I/O 资源管理资源管理(IORM)l lIORM是设备管理器必备的部分是设备管理器必备的部分l l跟踪可用跟踪可用I/O资源资源 (IRQ与与I/O基地址基地址)l lOEM为内置设备预分配的资源为内置设备预分配的资源l l当在总线上安装一个客户驱动时,总线驱动当在总线上安装一个客户驱动时,总线驱动请求资源请求资源ResourceReleaseResourceReleaseResourceRequestResourceRequestResourceCreateListResourceCreateListl l当存在冲突时当存在冲突时IORM调用调用 ResourceRequest失败失败注册表帮助例程注册表帮助例程l l从注册表中读取资源初始化信息从注册表中读取资源初始化信息从注册表中读取资源初始化信息从注册表中读取资源初始化信息OpenDeviceKeyOpenDeviceKeyDDKReg_GetIsrInfoDDKReg_GetIsrInfoDDKReg_GetWindowInfoDDKReg_GetWindowInfoDDKReg_GetPciInfoDDKReg_GetPciInfo在在在在COREDLLCOREDLL的的的的APIAPI在在在在 and and 的函数原型的函数原型的函数原型的函数原型l l在在在在publiccommonoakdriverspubliccommonoakdrivers中的例子中的例子中的例子中的例子wavedevpddes1371wavepdd.cpp - wavedevpddes1371wavepdd.cpp - GetRegistryConfigGetRegistryConfig电源管理电源管理l l电源管理器电源管理器灵活的系统级与外设级电源管理灵活的系统级与外设级电源管理灵活的系统级与外设级电源管理灵活的系统级与外设级电源管理使设备智能化地管理它们的电源使设备智能化地管理它们的电源使设备智能化地管理它们的电源使设备智能化地管理它们的电源在设备与系统或应用之间充当协调者在设备与系统或应用之间充当协调者在设备与系统或应用之间充当协调者在设备与系统或应用之间充当协调者使使使使OEMOEM修改调用修改调用修改调用修改调用PowerOffSystem()PowerOffSystem()的相关代的相关代的相关代的相关代码码码码电源管理电源管理l l系统级电源状态系统级电源状态系统级电源状态系统级电源状态l l设备设备设备设备( (外设外设外设外设) )级电源状态级电源状态级电源状态级电源状态打开打开打开打开系统空闲系统空闲系统空闲系统空闲用户空闲用户空闲用户空闲用户空闲挂起挂起挂起挂起D0 D0 全供电全供电全供电全供电D3 D3 睡眠睡眠睡眠睡眠D1 D1 降级模式降级模式降级模式降级模式D4 D4 关闭关闭关闭关闭D2 D2 备用模式备用模式备用模式备用模式电源管理器架构电源管理器架构驱动驱动电源管理器电源管理器 ()PM APIs应用程序应用程序通知消息队列通知消息队列通知消息队列通知消息队列驱动驱动驱动驱动APIsAPIs应用应用应用应用APIAPI物理内存物理内存64 MB64 MBRAMRAM32 MB32 MBFlashFlashDbg Serial PortDbg Serial Port2 2 GGB BU Us se er r5 51 12 2 MMB BU Un nc ca ac ch he ed d5 51 12 2 MMB BC Ca ac ch he ed d64 MB RAM64 MB RAM32 MB Flash32 MB Flash64 MB RAM64 MB RAM32 MB Flash32 MB Flash物理内存物理内存内核虚拟地址内核虚拟地址ReservedReserved0400000004000000820000008200000080000000800000008000000080000000A0000000A0000000C0000000C00000000 0Not UsedNot UsedSlot 0Slot 0Slot 32Slot 3264 KB64 KB32 MB32 MB64 MB64 MB2 GB2 GB3 GB3 GB4 GB4 GBMemory mapped filesMemory mapped filesAbove 2G-3GAbove 2G-3GMapped to physical Mapped to physical memorymemoryVirtual Virtual address address spacespaceSlot 1Slot 1Slot 32Slot 32NULL pointers NULL pointers 虚拟地址空间虚拟地址空间512M Cached512M Cached 512M Non-Cached512M Non-Cached 0x800000000x800000000xA00000000xA0000000Accessable via Accessable via MmMapiIoSpaceMmMapiIoSpace内存管理函数内存管理函数l l设备驱动程序是用户态模块设备驱动程序是用户态模块 必须将物理内存映射成虚拟内存必须将物理内存映射成虚拟内存必须将物理内存映射成虚拟内存必须将物理内存映射成虚拟内存l lVirtualAlloc, VirtualFree: 预留预留,释放虚拟释放虚拟内存内存MEM_RESERVEMEM_RESERVEl lVirtualCopy: 将一个物理内存区域映射到将一个物理内存区域映射到一个虚拟内存区域一个虚拟内存区域PAGE_NOCACHEPAGE_NOCACHEPAGE_PHYSICALPAGE_PHYSICAL驱动的内存访问与映射驱动的内存访问与映射l lMapPtrToProcess将一个地址空间的指针映射成另外一个指针将一个地址空间的指针映射成另外一个指针将一个地址空间的指针映射成另外一个指针将一个地址空间的指针映射成另外一个指针 l lGetCurrentProcess / SetProcPermissions重新找回进程重新找回进程重新找回进程重新找回进程IDID用于用于用于用于MapPtrToProcessMapPtrToProcess函数函数函数函数 l lMmMapIoSpace将一个物理地址空间映射成一个不分页的,由将一个物理地址空间映射成一个不分页的,由将一个物理地址空间映射成一个不分页的,由将一个物理地址空间映射成一个不分页的,由进程决定的地址空间进程决定的地址空间进程决定的地址空间进程决定的地址空间CEDDKl lCE v2.1x CE v2.1x 以及后来的版本支持独立于平台的以及后来的版本支持独立于平台的以及后来的版本支持独立于平台的以及后来的版本支持独立于平台的I/OI/O配配配配置置置置l l让让让让OEMOEM以及驱动开发人员使用它们以及驱动开发人员使用它们以及驱动开发人员使用它们以及驱动开发人员使用它们总线管理总线管理总线管理总线管理 内存管理内存管理内存管理内存管理I/OI/O管理管理管理管理l l从从从从NTDDKNTDDK拿来的拿来的拿来的拿来的CEDDK APICEDDK API直到以后的版本才有文档直到以后的版本才有文档直到以后的版本才有文档直到以后的版本才有文档但在大多数版中都有但在大多数版中都有但在大多数版中都有但在大多数版中都有CEDDK 简介简介l l设备驱动使用设备驱动使用设备驱动使用设备驱动使用CEDDKCEDDKl l正常开发的驱动是跨平正常开发的驱动是跨平正常开发的驱动是跨平正常开发的驱动是跨平台二进制兼容的台二进制兼容的台二进制兼容的台二进制兼容的跨跨跨跨CPUCPU的源代码兼容的源代码兼容的源代码兼容的源代码兼容设备管理器设备管理器设备驱动设备驱动硬件硬件CEDDK 内容内容部分部分部分部分函示例函示例函示例函示例总线管理总线管理总线管理总线管理HalGetBusDataByOffset()HalGetBusDataByOffset()HalGetBusDataByOffset()HalGetBusDataByOffset()HalGetBusData()HalGetBusData()HalGetBusData()HalGetBusData()HalSetBusDataByOffset()HalSetBusDataByOffset()HalSetBusDataByOffset()HalSetBusDataByOffset()HalSetBusData()HalSetBusData()HalSetBusData()HalSetBusData()HalTranslateBusAddress()HalTranslateBusAddress()HalTranslateBusAddress()HalTranslateBusAddress()HalTranslateSystemAddress()HalTranslateSystemAddress()HalTranslateSystemAddress()HalTranslateSystemAddress()内存管理内存管理内存管理内存管理MmMapIOSpace MmUnmapIOSpaceMmMapIOSpace MmUnmapIOSpaceHalAllocateCommonBufferHalAllocateCommonBufferI/O I/O 存取存取存取存取 XXXX = XXXX = UCHAR/USHORT/ULONG UCHAR/USHORT/ULONGREAD_REGISTER_XXXXREAD_REGISTER_XXXXWRITE_REGISTER_XXXXWRITE_REGISTER_XXXXREAD_PORT_XXXXREAD_PORT_XXXXWRITE_PORT_XXXXWRITE_PORT_XXXX中断架构中断架构l l中断只是异常处理的一部分中断只是异常处理的一部分在内核代码中被获取在内核代码中被获取在内核代码中被获取在内核代码中被获取在恢复到用户态之间进行处理在恢复到用户态之间进行处理在恢复到用户态之间进行处理在恢复到用户态之间进行处理但是硬件是独立于操作系统的但是硬件是独立于操作系统的但是硬件是独立于操作系统的但是硬件是独立于操作系统的l lCE使用二阶段中断服务模式使用二阶段中断服务模式少量的代码进行中断的记录少量的代码进行中断的记录少量的代码进行中断的记录少量的代码进行中断的记录调度中断服务程序代码进行处理调度中断服务程序代码进行处理调度中断服务程序代码进行处理调度中断服务程序代码进行处理l l操作系统提供操作系统提供API来使能来使能IRQ信号,设置中信号,设置中断的优先级,等等。断的优先级,等等。l l与硬件有关的操作在与硬件有关的操作在OAL,以及设备驱动代以及设备驱动代码中进行。码中进行。关于关于ISR与与IST的一些的一些 解释解释l lIST是老的用户模式代码是老的用户模式代码有完整的有完整的有完整的有完整的CE .NET APICE .NET API与与与与CRTCRT库库库库CE .NETCE .NET调度程序根据线程的优先级控制调度程序根据线程的优先级控制调度程序根据线程的优先级控制调度程序根据线程的优先级控制ISTIST的执行的执行的执行的执行运行态绑定到运行态绑定到运行态绑定到运行态绑定到SYSINTRSYSINTRl l从异常处理函数调用从异常处理函数调用ISR没有操作系统服务没有操作系统服务没有操作系统服务没有操作系统服务堆栈空间大小有限堆栈空间大小有限堆栈空间大小有限堆栈空间大小有限可设置为可重入的可设置为可重入的可设置为可重入的可设置为可重入的 ( (在在在在OALOAL进行设置进行设置进行设置进行设置) )MIPS, SHxMIPS, SHx汇编语言汇编语言汇编语言汇编语言ISRl lIRQ IRQ 优先级的设定依赖于不同优先级的设定依赖于不同优先级的设定依赖于不同优先级的设定依赖于不同CPUCPU的系统架构的系统架构的系统架构的系统架构在在在在x86x86上由上由上由上由PICPIC硬件进行设置硬件进行设置硬件进行设置硬件进行设置在在在在MIPSMIPS上用上用上用上用OALOAL的的的的IntrPriority, IntrMask IntrPriority, IntrMask 进行设置进行设置进行设置进行设置l l通过让通过让通过让通过让ISTIST进程推断进程推断进程推断进程推断ISRISR服务,服务,服务,服务,OALOAL能够增加实时能够增加实时能够增加实时能够增加实时性。性。性。性。l l在中在中在中在中, ,所有的所有的所有的所有的ISRISR代码都是代码都是代码都是代码都是OALOAL的一部分的一部分的一部分的一部分没有特殊的扩展没有特殊的扩展没有特殊的扩展没有特殊的扩展IRQIRQ绑定到绑定到绑定到绑定到OEMInitOEMInit的事件的事件的事件的事件IDID没有支持没有支持没有支持没有支持PNP, PNP, 共享共享共享共享IRQ (PCIIRQ (PCI总线总线总线总线) )l lCE .NET CE .NET 通过通过通过通过IRS(IISR)IRS(IISR)链解决了这些限制。链解决了这些限制。链解决了这些限制。链解决了这些限制。CE .NET 可安装可安装ISRl lCE 3.0 ISR CE 3.0 ISR 架构的首选扩展架构的首选扩展架构的首选扩展架构的首选扩展l lDLL DLL 代码代码代码代码, ,在运行时进行绑定在运行时进行绑定在运行时进行绑定在运行时进行绑定l l源代码可以是独立于源代码可以是独立于源代码可以是独立于源代码可以是独立于CPUCPU的的的的一般用一般用一般用一般用C C编写编写编写编写有一些限制有一些限制有一些限制有一些限制 不能调用不能调用不能调用不能调用CRT, Windows API, CRT, Windows API, 或其它的或其它的或其它的或其它的DLLDLLl l不可推断的不可推断的不可推断的不可推断的ISR,ISR,或或或或 IST IST发布发布发布发布l l支持硬件共支持硬件共支持硬件共支持硬件共IRQIRQ共享共享共享共享从同一个从同一个从同一个从同一个IRQIRQ关联的不同关联的不同关联的不同关联的不同SYSINTR IDSYSINTR IDI II IS SR R CE .NET中断处理中断处理内内核核OOA AL L驱驱动动硬硬件件设置事件设置事件异常处函数异常处函数ISRISRPSRPSRSYSINTR_SYSINTR_IDIDSYSINTR_xxSYSINTR_xxSYSINTR_NOPSYSINTR_NOPISTISTIISRIISR1 1NKCallIntChain(IRQ)NKCallIntChain(IRQ)IISRIISRn nSYSINTR_CHAINSYSINTR_CHAINIISRIISR2 2中断服务线程中断服务线程l l是内置设备的驱动程序的作户态线程是内置设备的驱动程序的作户态线程l l进行实际的中断处理进行实际的中断处理l l调用调用CreateEvent 创建一个与逻辑中断相关创建一个与逻辑中断相关联的事件对象联的事件对象l lIST在大多数时间里都是处于空闲状态,以在大多数时间里都是处于空闲状态,以内核用信号通知事件对象时被唤醒内核用信号通知事件对象时被唤醒l lIST通常运行的优先级高于普通优先级,其通常运行的优先级高于普通优先级,其优先级由优先级由 CeSetThreadPriority函数设定函数设定中断服务线程中断服务线程l lInterruptInitialize调用调用调用调用InterruptInitializeInterruptInitialize将事件与将事件与将事件与将事件与ISRISR的中断标识的中断标识的中断标识的中断标识符关联起来符关联起来符关联起来符关联起来l lWaitForSingleObject用来等待一个用信号通知的事件用来等待一个用信号通知的事件用来等待一个用信号通知的事件用来等待一个用信号通知的事件这一调用通常放在一个循环中,以使和中断处这一调用通常放在一个循环中,以使和中断处这一调用通常放在一个循环中,以使和中断处这一调用通常放在一个循环中,以使和中断处理时,理时,理时,理时,ISTIST可以回到这一个调用等待下一个要处可以回到这一个调用等待下一个要处可以回到这一个调用等待下一个要处可以回到这一个调用等待下一个要处理的中断理的中断理的中断理的中断l lInterruptDone中断数据处理完以后,中断数据处理完以后,中断数据处理完以后,中断数据处理完以后,ISTIST必须调用必须调用必须调用必须调用 InterruptDoneInterruptDone函数函数函数函数使内核使能与这一个线程相使内核使能与这一个线程相使内核使能与这一个线程相使内核使能与这一个线程相关的中断关的中断关的中断关的中断典型的典型的IST启动启动struct ISTData / Declare the Strucure to pass to the ISTstruct ISTData / Declare the Strucure to pass to the IST HANDLE hThread; / IST Handle HANDLE hThread; / IST Handle DWORD sysIntr; / Logical ID DWORD sysIntr; / Logical ID HANDLE hEvent; / handle to the event to wait for interrupt HANDLE hEvent; / handle to the event to wait for interrupt volatile BOOL abort; / flag to test to exit the IST volatile BOOL abort; / flag to test to exit the IST;ISTData g_KeypadISTData;ISTData g_KeypadISTData;/ Create event to link to IST / Create event to link to IST = CreateEvent(NULL, FALSE, FALSE, NULL); = CreateEvent(NULL, FALSE, FALSE, NULL);/ Translate IRQ to an logical ID (x86 CEPC)/ Translate IRQ to an logical ID (x86 CEPC) =Mapirq2Sysintr(5); =Mapirq2Sysintr(5);/ start the thread/ start the thread = CreateThread(NULL,0,&KeypadIST, = CreateThread(NULL,0,&KeypadIST, &g_KeypadISTData, 0, NULL); &g_KeypadISTData, 0, NULL);典型的典型的IST启动启动/Change the threads priority/Change the threads priorityCeSetThreadPriority(g_KeypadISTData.hThread,0);CeSetThreadPriority(g_KeypadISTData.hThread,0);/disconnect any previous event from logical ID/disconnect any previous event from logical ID););/ Connect Logical ID with Event/ Connect Logical ID with Event, g_KeypadISTData., g_KeypadISTData.hEvent,NULL,0);hEvent,NULL,0);l l设置设置设置设置ISTIST的优先级的优先级的优先级的优先级l l与以前的事件断开与以前的事件断开与以前的事件断开与以前的事件断开l l与与与与ISRISR关联关联关联关联典型的典型的IST启动启动DWORD KeypadIST(void *dat)DWORD KeypadIST(void *dat) ISTData* pData= (ISTData*)dat; ISTData* pData= (ISTData*)dat; / loop until told to stop / loop until told to stop While(!pData-abort) While(!pData-abort) / wait for the interrupt event. / wait for the interrupt event. WaitForSingleObject(pData-hEvent, INFINITE) WaitForSingleObject(pData-hEvent, INFINITE) if(pData-abort) if(pData-abort) break; break; / Handle the interrupt. / Handle the interrupt. / Let OS know the interrupt processing is done / Let OS know the interrupt processing is done InterruptDone(pData-sysIntr); InterruptDone(pData-sysIntr); Return 0; Return 0; 典型的典型的IST结束结束/ set abort flag to true to let thread know/ set abort flag to true to let thread know/ that it should exit/ that it should exit =TRUE; =TRUE;/disconnect event from logical ID/disconnect event from logical ID/this internally sets which in turn/this internally sets which in turn/sets through the kernel/sets through the kernel););/wait for thread to exit/wait for thread to exitWaitForSingleObject(g_KeypadISTData.hEvent,INFINITE);WaitForSingleObject(g_KeypadISTData.hEvent,INFINITE);););););l l设置一个会导致设置一个会导致IST退出的标志退出的标志总线驱动概览总线驱动概览l lPCMCIAI82365 (ISA)I82365 (ISA)TI-1250 (PCI)TI-1250 (PCI)l lUSB Host多主控制器多主控制器多主控制器多主控制器 OHCI OHCI 与与与与 UHCI (PCI) UHCI (PCI)PCMCIA Hostl lPCMCIAPCMCIA总线驱动有三个主要的线程总线驱动有三个主要的线程总线驱动有三个主要的线程总线驱动有三个主要的线程 状态改变线程状态改变线程状态改变线程状态改变线程 ( (卡的插入与移除卡的插入与移除卡的插入与移除卡的插入与移除) ) 中断线程中断线程中断线程中断线程( (处理卡的功能性中断请求处理卡的功能性中断请求处理卡的功能性中断请求处理卡的功能性中断请求) ) 回调线程回调线程回调线程回调线程 ( (通知事件相关的设备卡通知事件相关的设备卡通知事件相关的设备卡通知事件相关的设备卡) ) l l总线驱动支持总线驱动支持总线驱动支持总线驱动支持Card ServCard Serv消息的一个子集,从回调消息的一个子集,从回调消息的一个子集,从回调消息的一个子集,从回调线程中用回调函数发送线程中用回调函数发送线程中用回调函数发送线程中用回调函数发送l l中断以回调的形式发送到客户端驱动中断以回调的形式发送到客户端驱动中断以回调的形式发送到客户端驱动中断以回调的形式发送到客户端驱动l l对新插入的卡进行扫描以确定是否对新插入的卡进行扫描以确定是否对新插入的卡进行扫描以确定是否对新插入的卡进行扫描以确定是否PnPPnP元组,并与元组,并与元组,并与元组,并与注册表中的相关项进行比较注册表中的相关项进行比较注册表中的相关项进行比较注册表中的相关项进行比较l l如果没有发现相匹配的信息,则候选的驱动程序就如果没有发现相匹配的信息,则候选的驱动程序就如果没有发现相匹配的信息,则候选的驱动程序就如果没有发现相匹配的信息,则候选的驱动程序就运行与卡相关的运行与卡相关的运行与卡相关的运行与卡相关的“detect”“detect”例程对卡进行识别例程对卡进行识别例程对卡进行识别例程对卡进行识别可能显示出一个对话框询问可能显示出一个对话框询问可能显示出一个对话框询问可能显示出一个对话框询问DLLDLL的名字的名字的名字的名字USB Hostl l兼容版兼容版兼容版兼容版l l完全支持完全支持完全支持完全支持OHCIOHCI与与与与UHCIUHCIl l支持所有的传输类型支持所有的传输类型支持所有的传输类型支持所有的传输类型Isoch, bulk, interrupt, controlIsoch, bulk, interrupt, controll lUSBDUSBD支持多个支持多个支持多个支持多个HCHC的复用的复用的复用的复用l l总线设备驱动典型地采用总线设备驱动典型地采用总线设备驱动典型地采用总线设备驱动典型地采用LoadDriverLoadDriver进行安装,进行安装,进行安装,进行安装,使用使用使用使用USBDUSBD操作与操作与操作与操作与HCHC进行通信进行通信进行通信进行通信l l总线设备驱动能可选地调用总线设备驱动能可选地调用总线设备驱动能可选地调用总线设备驱动能可选地调用ActivateDeviceEx()ActivateDeviceEx()以以以以提供一个流接口给应用程序提供一个流接口给应用程序提供一个流接口给应用程序提供一个流接口给应用程序l l检测并识别新装设备检测并识别新装设备检测并识别新装设备检测并识别新装设备l l按照注册表中的描述安装驱动按照注册表中的描述安装驱动按照注册表中的描述安装驱动按照注册表中的描述安装驱动可能显示一个对话框询问可能显示一个对话框询问可能显示一个对话框询问可能显示一个对话框询问DLLDLL的名字的名字的名字的名字OEM硬件硬件单块驱动单块驱动单块驱动单块驱动( (显示显示显示显示) )GWE 子系统子系统设备管理器设备管理器设备管理器设备管理器MDDMDDPDDPDDMDDMDDPDDPDDDDIDDIDDSIDDSIDDSIDDSI编程模型编程模型USB USB 总线设备驱动总线设备驱动总线设备驱动总线设备驱动USBDUSBDMDDMDDPDDPDD主要内容主要内容l l概述概述l l流驱动接口流驱动接口l l设备驱动程序架构设备驱动程序架构l lUSB mouse 驱动开发示例驱动开发示例l lWindows CE 系统服务系统服务USB 驱动传输类型驱动传输类型l l控制传输控制传输USB USB 打印机打印机打印机打印机, USB, USB数码相机数码相机数码相机数码相机l l同步传输同步传输USB USB 网络电话网络电话网络电话网络电话l l中断传输中断传输鼠标鼠标鼠标鼠标, ,键盘键盘键盘键盘, ,游戏控制器游戏控制器游戏控制器游戏控制器l l批量传输批量传输USB USB 相机相机相机相机必须的入口点必须的入口点l lUSBDeviceAttach当设备挂接时,当设备挂接时,当设备挂接时,当设备挂接时,USBUSB驱动模块调用这个函数驱动模块调用这个函数驱动模块调用这个函数驱动模块调用这个函数l lUSBInstallDriver当一个不明设备挂接到当一个不明设备挂接到当一个不明设备挂接到当一个不明设备挂接到USBUSB上时,上时,上时,上时,USBUSB驱动驱动驱动驱动模块调用这个函数模块调用这个函数模块调用这个函数模块调用这个函数l lUSBUnInstallDriver总线设备驱动能调用这个函数从总线设备驱动能调用这个函数从总线设备驱动能调用这个函数从总线设备驱动能调用这个函数从USBUSB驱动注消驱动注消驱动注消驱动注消USB鼠标模型鼠标模型usbd.dllUSB鼠标驱动鼠标驱动硬件硬件应用应用演示演示:USB鼠标驱动代码鼠标驱动代码主要内容主要内容l l概述概述l l流驱动接口流驱动接口l l设备驱动程序架构设备驱动程序架构l lUSB mouse 驱动开发示例驱动开发示例l lWindows CE 系统服务系统服务系统服务的概念与历史系统服务的概念与历史l l在以前在以前,没有系统服务没有系统服务l l所谓的所谓的 “设备驱动设备驱动”被写成一个工作区被写成一个工作区l l在以后在以后,引入了系统服务管理器引入了系统服务管理器系统服务注册系统服务注册系统服务体系架构系统服务体系架构l lCE的系统服务是一个的系统服务是一个DLL,这个这个DLL的构的构建几乎与流设备驱动一模一样建几乎与流设备驱动一模一样l l与流设备驱动一样,与流设备驱动一样,Windows CE系统服系统服务提供同样的务提供同样的10个入点口,从个入点口,从xxx_Init到到 xxx_PowerDownl l系统服务有三个前缀字符系统服务有三个前缀字符系统服务系统服务IOCTL命令命令l lIOCTL_SERVICE_STARTl lIOCTL_SERVICE_STOPl lIOCTL_SERVICE_REFRESHl lIOCTL_SERVICE_INSTALLl lIOCTL_SERVICE_STATUSl lIOCTL_SERVICE_SUPPORTED_OPTIONS系统服务的应用控制系统服务的应用控制l lActivateServicel lRegisterServicel lGetServiceHandlel lServiceIoControll lDeregisterService作业作业读的在线帮助,自已实现关于读的在线帮助,自已实现关于 Windows CE 的系统服务。的系统服务。 应用程序发送应用程序发送I/O控制命令,然后服务例程将控制命令,然后服务例程将当前时间写到日志文件当前时间写到日志文件
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号