1 / 81

嵌入式软件开发导论

嵌入式软件开发导论. 7. 设备驱动程序开发. 同济大学软件学院 2006. 主要内容. 概述 流驱动接口 设备驱动程序架构 USB mouse 驱动开发示例 Windows CE 系统服务. 什么是设备驱动程序. 设备驱动程序是与硬件设备进行通信的系统程序。一个设备可以是物理设备,也可以是一个逻辑实体。通常,这些实体需要操作系统对其进行控制,资源管理。设备驱动程序就是管理这些物理设备或者虚拟设备,协议 或者系统服务的软件模块。 对于每一个基于 Windows CE 的设备,设备驱动程序都是必不可少。 -- 译自 MSDN. “ 一般”驱动程序开发的理解.

karim
Download Presentation

嵌入式软件开发导论

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 嵌入式软件开发导论 7. 设备驱动程序开发 同济大学软件学院 2006

  2. 主要内容 • 概述 • 流驱动接口 • 设备驱动程序架构 • USB mouse 驱动开发示例 • Windows CE 系统服务

  3. 什么是设备驱动程序 设备驱动程序是与硬件设备进行通信的系统程序。一个设备可以是物理设备,也可以是一个逻辑实体。通常,这些实体需要操作系统对其进行控制,资源管理。设备驱动程序就是管理这些物理设备或者虚拟设备,协议 或者系统服务的软件模块。对于每一个基于Windows CE的设备,设备驱动程序都是必不可少。 --译自 MSDN

  4. “一般”驱动程序开发的理解 • 必须使用汇编语言对端口进行读写 • 设备驱动程序是操作系统的一部分,难于开发与调试。 • 设备驱动程序控制硬件 • 中断比较难于处理

  5. 必须使用汇编语言读写端口 • CEDDK.dll 提供 APIs与硬件进行通信 • HalGetBusData • READ_PORT_UCHAR • WRITE_REGISTER_ULONG • 对于逻辑设备驱动程序,采用Win32 APIs 从硬件获取数据

  6. 设备驱动程序是操作系统的一部分,难于开发与调试设备驱动程序是操作系统的一部分,难于开发与调试 • 对于UNIX或者是 Windows 9x,设备驱动程序是与操作系统映像连接的,并运行于系统内核态。 • 对于windows CE,大多数的设备驱动程序运行于用户态,简单的来说就是一个DLL文件。

  7. 设备驱动程序控制硬件 • 大多数的设备驱动程序用来控制硬件。 • 对于某些硬件,是没有驱动的。 • CPU • 内存 • 对于虚拟设备驱动程序,没有物理设备。 • 文件系统驱动程序 • RAM disk

  8. 中断有时难于处理 • Windows CE提供逻辑中断 (SYSINTRs) • 中断由一个用户态的线程进行处理 (IST)

  9. 为什么应当写驱动程序? • 当我们设计硬件时,就需要提供这一硬件的驱动软件。 • 硬件OEM厂商不提供基于Windows CE的硬件驱动,但是提供硬件的规格说明。 • 对于一个现有硬件驱动的功能进行扩展。

  10. 驱动分类—整体 • Windows CE 整体上将设备驱动分为三种: • 内置驱动 • 总线 • 流接口

  11. 内置驱动 • 硬件所必须的驱动程序,这些驱动程序通常由设计OEM厂商进行设计。 • 如:键盘,触摸屏,音频设备。 • 可能不支持一般的驱动接口,也有可能带有扩展的接口或者完全提供一个用户自定义的接口。 • 内置驱动通常需要针对具体的操作系统进行小幅改动。

  12. 总线驱动 • 管理系统总线如PCI总线等。PCMCIA与 CompactFlash也在其列。 • 负责处理总线上硬件的询问,以及资源的分配。 • 同时也请求设备管理器为总线上的硬件安装适当驱动程序。

  13. 驱动分类 – 详细 • Audio Drivers • Battery Drivers • Block Drivers • Bluetooth HCI Transport Driver • Direct3D Device Driver Interface • DirectDraw Display Drivers • Display Drivers • DVD-Video Renderer • IEEE 1394 Drivers • Keyboard Drivers • Notification LED Drivers • Parallel Port Drivers • PC Card Drivers • Printer Drivers • Serial Port Drivers • Smart Card Drivers • Stream Interface Drivers • Touch Screen Drivers • USB Drivers 参见文档: Driver Development -> Driver Categories

  14. 驱动的加载过程 • 大多数的设备驱动由设备管理器(Device.exe)进程在系统启动时进行加载。 • 另一方面,其中一部分内置驱动程序由GWES.exe进行加载。这些驱动包括显示器驱动 (DDI.dll)、键盘驱动、鼠标驱动、触摸屏驱动等。

  15. 驱动的加载过程 • 当Device.exe对设备驱动程序进行安装时将在注册表的[HKEY_LOCAL_ MACHINE]\Drivers项下检查一个字符串,其值为RootKey,传统地,其名字为BuiltIn 。 • 然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。

  16. 驱动的加载过程

  17. 驱动的加载过程 • 安装DLL,给每一个驱动创建一个Active键,然后调用ActivateDevice或者 ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。 • ActivateDevice在 [HKEY_LOCAL_MACHINE\Drivers\Active下创建一个新的键值。

  18. 驱动的加载过程

  19. 驱动加载API • 设备驱动程序也能通过应用程序进行手动的安装,这是ActivateDeviceEx的一个首选的功能。 • 安装驱动一个更老的方法是使用RegisterDevice与DeregisterDevice

  20. 主要内容 • 概述 • 流驱动接口 • 设备驱动程序架构 • USB mouse 驱动开发示例 • Windows CE 系统服务

  21. 什么是流接口 • 流接口驱动包括所有提供流接口函数的驱动程序,不管由这个驱动控制的设备是什么类型。 • 典型的流接口驱动程序有: • 文件系统驱动 (iostream, fstream) • COM, LPT

  22. 使用流接口 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。

  23. 创建一个流驱动程序 • 写一个导出具体流接口的DLL • 编译设备驱动程序 • 对注册表进行配置

  24. 流接口函数

  25. 构建设备驱动程序 • 构建设备驱动程序与构建一个DLL一样简单。 • 可以使用Platform Builder与EVC++。只需创建一个Windows CE DLL项目, 输出适当 的入口点,然后编写代码。 • 常犯的一个错误是没有将入口点声明为extern C,因此 C++编译器就不能处理输出的函数名。

  26. 注册表设置 • 在 Project.reg中: [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Sample] "Dll" = "mydriver.Dll" "Prefix" = "DEM" "Index" = dword:1 "Order" = dword:0 "FriendlyName" = "Demo Driver" "Ioctl" = dword:0

  27. 注册表设置 • Order • 给所有的驱动设置相对安装顺序。Order 为0的驱动先安装,依次安装Order为1,2,…的驱动。Oder可以让开发者保证有相到依赖关系的多个驱动以适当的顺序进行安装。 • Index • 指定在文件系统中的驱动名的数字部分。在默认情况下,带有前缀COM的驱动在文件系统中分配名字为 COM1,下一个即为COM2。为了保证驱动总是安装成COM2,必须提供Index = 2。

  28. 演示 :使用emulator编写一个流接口驱动程序并使用它

  29. 驱动是如何工作的 • When CE启动时, Device.exe根据注册表中的设置安装所有的驱动程序。 • 当安装mydriver.dll时, device.exe 调用 DEM1_Init。 • Application程序调用CreateFile(“DEM1”…)

  30. 驱动是如何工作的(2) • Coredll.dll 处理API调用并切换到 device.exe • Device.exe 调用mydriver.dll 的DEM1_Open。 • CreateFile返回DEM1_Open的retval

  31. 设备功能栈 应用程序 设备管理器(device.exe) 设备驱动程序 Windows CE DDK API 硬件

  32. 主要内容 • 概述 • 流驱动接口 • 设备驱动程序架构 • USB mouse 驱动开发示例 • Windows CE 系统服务

  33. 驱动架构

  34. 驱动的类型

  35. 内置与流安装机制 • 通常内置驱动程序根据注册键值安装在 GWES进程空间 • 总线驱动由Device.exe根据键值进行安装 • 可安装的流驱动或其它驱动由Device.exe根据总线驱动或注册检查器进行安装。

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

  37. 设备管理器 • 包括IO资源管理器 • 安装注册表检查器(RegEnum.dll) ,并由这一个注册表检查器根据注册表进行驱动的安装 • 提供电源通知回调函数 • 跟踪所有已安装的驱动程序,给设备接口发出拉入或删除的通知

  38. 设备管理器 • 设备驱动程序的安装过程 DEVICE.EXE DEVICE.EXE Kernel loads loads I/O Resource Manager (part of Device.exe) I/O Resource Manager (part of Device.exe) REGENUM.DLL REGENUM.DLL loads PCIBUS.DLL PCIBUS.DLL

  39. 注册表枚举器 • 注册枚举器是RegEnum.dll • Device.exe根据HKEY_LOCAL_MACHINE\Drivers\RootKey安装注册枚举器 • 注册枚举器给每一个要安装的驱动程序扫描表项 • 注册枚举器是可重入的,并支持分级使用 • 当注册枚举器卸载时,同时也御载它安装的所有信息 • 注册枚举器根据Order,检查紧挨着传给它的键的下一级键值。 • 注册枚举器对每一个找到的子键调用ActivateDeviceEx

  40. ActivateDeviceEx • 由Device.exe提供 • 总线驱动程序当安装设备驱动时调用ActivateDeviceEx • ActivateDeviceEx也在RAM工作区锁定流接口驱动程序 • 这可以防止代码页被丢弃 • 注册检查器对找到的每一个内置子键调用ActivateDeviceEx • ActivateDeviceEx安装驱动并更新注册表

  41. 接口类 • 驱动程序的接口有以下特征 • 每一个Iclass有一个GUID,一个名字 • GUID描述类设备接口 • Name描述接口的实例 • COM1:, DSK1: 等等 • 提供一个驱动接口 • 在注册表中的Iclass子键 • 驱动程序发布接口 – AdvertiseInterface • 应用程序访问接口 – RequestDeviceNotifications • 每个已有的接口的预定义GUID • A32942B7-920C-486b-B0E6-92A702A99B35

  42. I/O 资源管理(IORM) • IORM是设备管理器必备的部分 • 跟踪可用I/O资源 (IRQ与I/O基地址) • OEM为内置设备预分配的资源 • 当在总线上安装一个客户驱动时,总线驱动请求资源 • ResourceRelease • ResourceRequest • ResourceCreateList • 当存在冲突时IORM调用 ResourceRequest失败

  43. 注册表帮助例程 • 从注册表中读取资源初始化信息 • OpenDeviceKey • DDKReg_GetIsrInfo • DDKReg_GetWindowInfo • DDKReg_GetPciInfo • 在COREDLL的API • 在<devload.h> and <ddkreg.h> 的函数原型 • 在public\common\oak\drivers中的例子 • wavedev\pdd\es1371\wavepdd.cpp -> GetRegistryConfig

  44. 电源管理 • 电源管理器 • 灵活的系统级与外设级电源管理 • 使设备智能化地管理它们的电源 • 在设备与系统或应用之间充当协调者 • 使OEM修改调用PowerOffSystem()的相关代码

  45. 电源管理 • 系统级电源状态 • 设备(外设)级电源状态

  46. 电源管理器架构 应用API 应用程序 PM APIs 通知消息队列 电源管理器 (pm.dll) 驱动 驱动 APIs

  47. 物理内存 内核虚拟地址 物理内存 Reserved C0000000 Dbg Serial Port 512 MBUncached 82000000 32 MB Flash 32 MBFlash 64 MB RAM 80000000 A0000000 04000000 64 MBRAM 512 MBCached 32 MB Flash 64 MB RAM 80000000 0 2 GBUser

  48. 512M Non-Cached 512M Cached 虚拟地址空间 4 GB Not Used Accessable via MmMapiIoSpace 3 GB Above 2G-3G Mapped to physical memory 0xA0000000 Virtual address space 0x80000000 2 GB Memory mapped files Slot 32 Slot 32 64 MB Slot 1 32 MB Slot 0 64 KB NULL pointers

  49. 内存管理函数 • 设备驱动程序是用户态模块 • 必须将物理内存映射成虚拟内存 • VirtualAlloc, VirtualFree: 预留,释放虚拟内存 • MEM_RESERVE • VirtualCopy: 将一个物理内存区域映射到一个虚拟内存区域 • PAGE_NOCACHE • PAGE_PHYSICAL

  50. 驱动的内存访问与映射 • MapPtrToProcess • 将一个地址空间的指针映射成另外一个指针 • GetCurrentProcess / SetProcPermissions • 重新找回进程ID用于MapPtrToProcess函数 • MmMapIoSpace • 将一个物理地址空间映射成一个不分页的,由进程决定的地址空间

More Related