设备驱动程序开发培训课程(PPT 81页).ppt_第1页
设备驱动程序开发培训课程(PPT 81页).ppt_第2页
设备驱动程序开发培训课程(PPT 81页).ppt_第3页
设备驱动程序开发培训课程(PPT 81页).ppt_第4页
设备驱动程序开发培训课程(PPT 81页).ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式软件开发导论 同济大学软件学院2005 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 MACHINE Drivers项下检查一个字符串 其值为RootKey 传统地 其名字为BuiltIn 然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键 驱动的加载过程 驱动的加载过程 安装DLL 给每一个驱动创建一个Active键 然后调用ActivateDevice或者ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序 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 直接使用Win32文件系统API 创建一个流驱动程序 写一个导出具体流接口的DLL编译设备驱动程序对注册表进行配置 流接口函数 构建设备驱动程序 构建设备驱动程序与构建一个DLL一样简单 可以使用PlatformBuilder与EVC 只需创建一个WindowsCEDLL项目 输出适当的入口点 然后编写代码 常犯的一个错误是没有将入口点声明为externC 因此C 编译器就不能处理输出的函数名 注册表设置 在Project reg中 HKEY LOCAL MACHINE Drivers BuiltIn Sample Dll mydriver Dll Prefix DEM Index dword 1 Order dword 0 FriendlyName DemoDriver Ioctl 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 MACHINE Drivers RootKey安装注册枚举器注册枚举器给每一个要安装的驱动程序扫描表项注册枚举器是可重入的 并支持分级使用当注册枚举器卸载时 同时也御载它安装的所有信息注册枚举器根据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的函数原型在public common oak drivers中的例子wavedev pdd es1371 wavepdd 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 虚拟地址空间 0 x80000000 0 xA0000000 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 DeclaretheStrucuretopasstotheIST HANDLEhThread 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 以提供一个流接口给应用程序检测并识别新装设备按照

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论