2019/7/311简介•USB编码以及总线数据结构•USB数据流模型•USB的PNP管理•USB的电源管理•USB数据包与应用程序2019/7/312USB编码以及总线数据结构•USB编码•USB总线数据结构1.包2.传输事务3.帧结构2019/7/313USB编码•USB接口针脚结构:•同步时钟+数据:采用了NRZI(NonReturntoZeroInvert)反向非归零编码;既能保证数据传送的完整,也不需要独立的时钟信号2019/7/314包(Package)•包的格式:令牌包,数据包,握手包2019/7/315用7个0和1个1作为同步序列USB传输事务(Transaction)2019/7/316每个传输事务由三个包组成。帧结构(Frame)•每个帧内数据由传输事务组合组成2019/7/317USB总线数据结构由于有许多设备都接到了USB上,因此每1ms产生的传输帧是混合的。其中中断传输(Interrupt)和同步传输(Isochronous)对时间要求高,因此占用了约90%的总带宽,控制传输(Control)占用了约10%的带宽,而批量传输(Bulk)则使用剩下的可用带宽2019/7/318USB数据流模型•USB协议简介•USB外设与总线•数据流模型1.模型整体框架2.参与通信抽象对象3.实际数据流向4.驱动程序与系统内核之间的关系5.USB驱动例程中的一些回调接口2019/7/319USB协议简介•USB协议:1.USB采用轮询的广播机制传输数据,即“令牌包,数据包,握手包”;2.根据包标识符PID字段,用于识别数据包类型;3.字段-包-传输事务-帧;4.不同传输模式是通过相应的传输事务序列下实现的。2019/7/3110USB外设与总线2019/7/3111PC机上USB接口设备的连接拓扑结构数据流模型USB必须分层理解:1.用户应用程序;2.IO管理器层;3.驱动程序;4.硬件抽象层(HAL);5.硬件外设2019/7/3112模型整体框架I.客户软件:对设备功能进行操作软件,它是针对物理设备功能开发的。II.USB系统:它包括操作系统对USB支持,USB控制器总线驱动,既占硬件也占软件,好比一个翻译。III.USB设备驱动:客户端软件与USB系统的之间的接口。IV.USB控制器将IRP译码成USB协议数据传输到USB总线上;2019/7/3113参与通信的抽象对象通道(pipe):就是主机与设备之间传输的数据的模型共有两种类型的管道:无格式的流管道(StreamPipe)和有格式的信息管道(MessagePipe)2019/7/3114参与通信的抽象对象•逻辑设备(device):驱动程序对应硬件实际功能暴露给操作系统内核接口的抽象对象;每个设备都有一个默认的控制端点。•配置(Configuration):用于设置一些结构来设定设备功能接口。•接口(Interface):逻辑设备中功能相近相同的一些端点的集合。•端点(EndPonit):位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)2019/7/3115实际数据流如右图所示:1.客户软件通过USB设备驱动(USBD)发送IRQ请求请求传送数据;2.主机控制器驱动(HCD)将接收IRQ请求解析成USB传输和传输事务。3.主机控制器将这些USB传输和传输事务打包成USB协议数据包通过USB总线传输给USB设备交互2019/7/3116驱动程序与操作系统之间的关系USB总线的设备也属于即插即用设备,由上一小节可知,USB驱动程序主要还是通过IRP包进行数据交换,操作系统主要就是通过PNP管理器与IO管理器与以及部分内核对USB驱动程序的中断,内存资源进行管理;2019/7/3117操作系统用户模式IO管理器即插即用PNP管理器操作系统内核USB驱动程序硬件抽象层USB硬件设备USB驱动程序一些例程函数接口•在USB驱动程序入口例程DriverEntry中,DRVER_OBJECT对象专门在majorFuction数组预留以下接口处理相对应的IRP:1.IRP_MJ_CREATE以文件形式打开设备准备读写,调用其做准备;2.IRP_MJ_CLOSE当前用户关闭文件(closeHandle)时,调用它清扫系统;3.IRP_MJ_PNP处理即插即用的操作4.IRP_MJ_READ处理读文件操作(ReadFile)5.IRP_MJ_WRITE处理写文件操作(WriteFile)6.IRP_MJ_DEVICE_CONTROL处理来之硬件对操作系统的IO控制码。2019/7/3118IRP_MJ_CREAT1.以文件形式打开设备,检查设备状态,是否正常工作;2.取消设备挂起,打开管道,并将此管道与文件的变量相关联;3.OpenHandleCount内核对象计数加一;4.这是creafile相关联的;2019/7/3119检查设备工作状态打开设备管道内核对象计数加一IRP_MJ_READ和IRP_MJ_WRITE初始化•初始化URB•取得管道建立缓冲区•检查MDL•设置URB标志位内存交换•映像数据•构造URB请求单独一个例程完成他们:1.初始化URB,并判断通道工作方式,并从文件中获取管道信息。2.检查IRP的MDL(amemorydescriptorlist),根据读写变量设置URB标志位。3.根据MDL开辟内存,上层用户模式数据映像,构造URB请求;2019/7/3120PNP即插即用管理器•PNP管理器概述以及相关组件•即插即用IRP•PNP管理器在USB驱动程序的操作2019/7/3121PNP管理器概述•什么是PNP管理器呢?PNPplugandplay即插即用设备管理,其主要有以下四个作用:1.操作系统能检测新设备插入,也能检测得到设备的拔出;2.如果总线接口允许,设备可以实现热插拔,并保证操作系统正常工作;3.设备允许软件配置。4.操作系统应该知道哪些是正确的驱动程序,并智能地加载。2019/7/3122•PNP即插即用管理器相关组件2019/7/3123即插即用管理程序(用户模式)用户模式内核模式注册表IO管理器执行体即插即用管理程序电源管理程序设备wdm驱动程序总线驱动程序硬件抽象层HAL即插即用IRP•即插即用IRP(IRP_MJ_PNP):1.由即插即用管理器发送给设备驱动程序的;2.在驱动对象的主功能函数内有一个回调派遣函数用于处理PNP的IRP包;3.不用的IRP代表不同的功能,如下表所示:2019/7/31242019/7/3125子功能代码描述IRP_MN_START_DEVICE配置并初始化设备IRP_MN_QUERY_REMOVE_DEVICE设备可以被安全的删除IRP_MN_REMOVE_DEVICE关闭并删除设备IRP_MN_CANCEL_REMOVE_DEVICE忽略以前的QIERY_REMOVEIRP_MN_STOP_DEVICE关闭设备IRP_MN_QUERY_STOP_DEVICE询问设备可以关闭了吗IRP_MN_CANCEL_STOP_DEVICE忽略以前的QUERY_STOPIRP_MN_DEVICE_RELATIONS给出指定特征的设备列表IRP_MN_QUERY_INTERFACE获得调用函数接口地址IRP_MN_CAPABILITIES取得设备能力IRP_MN_QUERY_RESOURCES取得引导配置IRP_MN_QUERY_RESOURCES_REQUIREMENTS取IO资源需求IRP_MN_QUERY_DEVICE_TEXT获得描述信息或位置串IRP_MN_QUERY_PNP_DEIVCE_STATE获取设备状态IRP_MN_QUERY_BUS_INFORMATION*获取父总线类型IRP_MN_SUPPRISE_REMOVE通知设备意外被删除PNP管理器对USB总线的管理2019/7/3126设备未插设备已插设备已枚枚举且驱动程序已初始化用户插入设备PnP管理器或总线驱动对设备进行枚举PnP管理器等核心部件鉴定以及调用驱动(即调用DriverEntry)等待卸载状意外卸载状等待停止状态停止状态设备启动状态FD0和FilterDO已创建且链接好PnP管理器分配资源且发送IRP_MN_START_DEVICEPnP管理器调用AddDevice例程IRP_MN_REMOVE_DEVICE(设备还在)IRP_MN_STOP_DEVICEIRP_MN_START_DEVICEIRP_MN_CANCEL_STOP_DEVICEIRP_MN_SURPRISE_REMOVALIRP_MN_REMOVE_DEVICEIRP_MN_QUERY_STOP_DEVICEIRP_MN_CANCEL_REMOVE_DEVICEIRP_MN_QUERY_REMOVE_DEVICEIRP_MN_REMOVE_DEVICE(设备已被卸载)USB驱动程序在完成即插即拔PNP整过所操作数据结构:1.URP(USBRequstPackage)USB请求包,这个数据结构也是通过操作IRP的内核函数传送直总线驱动层上。2.通过操作URP进行对USB设备热插拔的枚举,配置和删除。3.通过对URP的PNP管理操作我们可以得到来自硬件数据描述,如:设备描述符,配置描述符,接口描述符,端点描述符。4.如图可见这些数据的树状结构:2019/7/31272019/7/3128设备描述符设备配置描述设备配置描述接口描述符设备配置描述端点描述符接口描述符接口描述符端点描述符端点描述符端点描述符端点描述符端点描述符USB电源管理•WDM电源管理模型概述1.基本概念2.电源状态和设备状态•关于USB电源管理策略1.USB处理电源管理的基本IRP规则2.USB驱动应该响应的电源管理器发出IRP2019/7/3129WDM电源管理模型•基本概念:1.电源管理器:为了于减少系统不必要的功耗,基于ACPI(AdvancedConfigurationPowerInterface)规范作为计算机全局电源策略,操作系统支持一些用户接口,用户可以通过这些接口控制最终的电源管理策略。2.电源管理是操作系统通过处理驱动程序来实现的。3.支持PNP的驱动必须支持电源管理,支持电源管理的驱动程序必须支持PNP,两者是被集成而相互依赖。2019/7/3130•电源状态分以下六个状态:2019/7/3131系统电源状态含义SO(Working)CPU全功率运行S1(Sleeping1)CPU停止,RAM被刷新S2(Sleeping2)CPU不通电,RAM被刷新S3(Sleeping3)CPU不通电,RAM处于低速刷新模式,电源功率输出降低S4(Hibemate)系统停止,RAM被保存到磁盘S5(Shutdown)系统停止并关闭,需要完全引导以恢复操作•设备电源状态:操作系统不直接处理设备的电源状态,而是有驱动程序专门处理。设备至少要支持D0与D3。2019/7/3132设备电源状态含义D0设备全功率运行D1设备运行于低功耗模式,设备环境可能被保留D2设备运行低功率模式,设环境可能无效D3设备没有电,环境丢失关于USB电源管理策略•USB电源管理策略:1.USB处理电源管理的基本IRP规则2.USB驱动应该响应的电源管理器发出IRP2019/7/3133用户模式的USB数据读写与应用程序•用户模式与驱动包IRP对应关系•IRP_MJ_CREATE,IRP_MJ_READ,IRP_MJ_WRITE•用户模式应用程序打开设备•用户模式应用程序读取USB设备2019/7/3134USB设备数据读写•用户模式下API与驱动程序的IPR对应关系:2019/7/3135用户API函数IRP说明CreateFileIRP_MJ_CREATE打开设备ReadFileIRP_MJ_READ从设备获取数据WriteFileIRP_MJ_WRITE向设备发送数据CloseFileI