Wednesday, March 19, 2008

科技:淺談USB



早期用過PC的人通常會碰到中斷設定衝突的問題。中斷在PC的應用上採串接兩顆8259A PIC(Programmable Interrupt Controller)而成,Master上有幾個固定裝置,譬如IRQ1是Keyboard,IRQ4是COM1、IRQ3是COM2、IRQ7是LPT1、IRQ5是LPT2、IRQ6是Floppy Controller等等。磁帶因為後來少使用,因此IRQ2又接到另一顆Slave上用來擴充,常見的硬碟/光碟機即使用IRQ14。

一開機如果進入BIOS設定,可以調整哪些周邊要使用哪些中斷,設定不對有時會造成無法使用或當機。由於周邊裝置種類越來越多,基於使用的方便與速度的考量,由微軟主推USB作為新一代的傳輸介面。USB最大的特點,我想是熱拔插/隨插即用,其次是支援127個裝置,撇開mini USB不談,每個裝置的接頭都是一樣的。

USB主要有四種傳輸型態,分別是Interrupt、Bulk、Isochronous與Control。Interrupt譬如Keyboard/Mouse,著重在資料的正確性。Bulk則是應用在Printer、Scanner或是Mass Storage上,也是著重在資料的正確性。另外Isochonous譬如Speaker、Video等影音資料則注重即時性,對資料的正確與否比較不考慮。最後則是系統使用的Control Transfer,資料量雖不大,但正確性與即時性都很重要。

為什麼可以熱拔插/隨插即用?事實上USB把PC與周邊的Handshaking大部分的運算量都放在PC的Controller上,以高速Polling(每秒1000次)的方式一直下Request,不管是送、收資料。當裝置一接上PC,Host會下幾個Command,在此忽略有關Hub的,分別是:

Get_Device_Descriptor
Set_Address
Get_Device_Descriptor
Get_Configuration_Descriptor
Set_Configuration

以文字敘述,就是電腦會先問周邊,你是什麼樣的裝置?譬如Keyboard、Mouse、Printer等等,然後電腦會給個編號,然後電腦再問你是什麼樣的裝置?周邊這次會回答我是第幾號什麼裝置,電腦確定後會再問你要用什麼設定?周邊回答完電腦重新設定。到此完成裝置列舉,接下來電腦會依需求存取資料譬如硬碟/光碟機或是WebCam/Keyboard/Mouse等等。以上的過程叫做Enumenation(裝置列舉),至於這些Descriptors裡面放些什麼東西,可以看這裡



這邊講一下周邊的硬體架構,一個獨立的USB SIE,上面會有Memory,又稱為Endpoint供存放資料,一般以0、1、2來說,Endpoint 0是Tx Rx雙向,用來收發Command,Endpoint 1是Tx,用來傳送資料,Endpoint 2是Rx,用來收取資料。資料會透過SIE(Serial Interface Engine)傳到Hub上,通常是Root Hub,也就是PC。有命令或資料進來時,則透過Interrupt通知周邊的CPU,CPU這時進入ISR(Interrupt Service Routine),前述Enumaration的Command則在此Parscing,以解讀/準備相關資訊。通常SIE會整合到MCU上,這時的外部中斷則變成內部中斷了。

以Keyboard/Mouse為例,由於Host Polling的速度遠大於人手指按鍵盤的速度,因此Keyboard/Mouse的CPU在收到資料時會放到Tx Endpoint上,Hub在Polling時會自動把資料收去。就其他Bulk或Isochonous的裝置而言,應用上應該是類似。

延伸閱讀:
usb-in-a-nutshell.pdf

參考資料:
The 80x86 Family / John Uffenbeck / Prentice Hall
USB Design by Example / John Hyde / Wiley

No comments: