這里主要講的是Windows XP下USB驅動協議棧的整體結構,以及內部的一些重要數據結構。在寫這些東西時,參考了大牛Tiamo的相關論壇貼子 ,內容很多雷同,說是轉貼也不為過。
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設備驅動和總線驅動調用。
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那么突出,所以就顯得比較邊緣化,在一般的討論中將它忽略掉。
關于USB驅動棧的整體結構就講到這里,后續會具體講講usbhub.sys和usbport.sys所實現的功能。