Windows XP系统USB驱动栈及功能说明
这里主要讲的是Windows XP下USB驱动协议栈的整体结构,以及内部的一些重要数据结构。
USB协议栈是由如下几个驱动文件构成的:
- usbport.sys USB主机控制器共用驱动代码库,供miniport驱动调用。
- usbhub.sys USB总线驱动,USB总线也是USB设备的一种。
- usbehci.sys USB EHCI主机控制器驱动,它是属于miniport驱动。
- usbuhci.sys USB UHCI主机控制器驱动,它是属于miniport驱动。
- usbohci.sys USB OHCI主机控制器驱动,它是属于miniport驱动。
- usbd.sys USB设备驱动共用代码库,供USB设备驱动和总线驱动调用。
USB功能设备
- usbccgp.sys USB复合设备驱动。
- usbstor.sys USB存储设备驱动。
- usbaudio.sys USB声音设备驱动。
- usbvideo.sys USB视频设备驱动。
- hidusb.sys USB HID设备驱动。
主机控制器驱动是USB协议栈的最底层驱动,在它之上就是USB总线驱动,再之上是USB设备驱动。
USB设备驱动上面呢,一般还有其它的驱动。象usbstor上面还有存储设备class驱动,hidusb上面还有HIDclass驱动。不过这上面的驱动,就和USB的驱动协议栈没有多大的关系了。而设备驱动和具体的设备类有千丝万缕的关系,不是我们要讨论的重点。
这里重点要讨论的是控制器和总线,这是USB驱动协议栈的核心。
我们知道,USB2.0有EHCI控制器,USB1.1有UHCI和OHCI控制器。这样一共有三种控制器,它们之间有什么区别呢? 这要先说一说控制器的作用,USB协议栈并不是凭空而建立起来的,它下层就是PCI总线驱动(一般而言,也不一定非得是PCI总线),而控制器的作用就是和PCI总线打交道,将USB的功能和操作转变成PCI总线上的一系列操作,同时还兼任着usb总线的日常管理。
不同的硬件厂商都可以有它自己的一个控制器规范,这在USB协议出现早期尤为突出。但这样各自为政毕竟对整个规范的发展不利,于是大家便开始统一接口规范,这统一规范能满足大家的绝大部分需求,所以大家也就都用标准规范。USB 1.1时,就形成了OHCI和UHCI两大阵营,而USB2.0时,则只有EHCI了,显然,大家还是觉得标准越少麻烦越少。
对比一下UHCI和OHCI,两者都是提供对USB1.1协议的支持,只不过,UHCI硬件实现相对较少而成本相对较低,但软件驱动复杂度相对较高,所以,UHCI多用在PC上,OHCI多用在嵌入设备中。而 EHCI 则是伴随着USB 2.0规范一同出现(因为大家都受够了要同时支持两大规范的痛苦),它同时也向下兼容UHCI和OHCI。
好了,废话就说这么多,再具体的网上可查。下面,就说说控制器驱动的事儿。各大控制器规范和底层PCI总线的接口差别比较大,但它控制USB总线那一块的功能都基本上差不多 — 都是完全符合USB本身规范的。所以,各大控制器的驱动底层接口部分是各自为政,而USB总线管理部分则被提炼出来,形成一个共同的代码库,名为usbport.sys。也就是说,usbport.sys并不是一个独立的驱动,而只是一个供别人调用的动态链接库。而这个动态链接库由于实现了控制器驱动的绝大多数功能,所以,我们习惯地将它当作控制器驱动的主体。
讲了usbport.sys是怎么回事,顺带讲讲usbd.sys。usbd.sys和usbport.sys角色定位类似,它也只是作为一个动态链接库供USB设备驱动和USB总线驱动使用。不过,由于usbd.sys实现的功能很有限,作用没有usbport.sys那么突出,所以就显得比较边缘化,在一般的讨论中将它忽略掉。
原文转自:http://www.17ext.com/Windowsjc/511879.html