Some USB legacy support

最近工作是在x86 平台上 Porting 某家BIOS, 本來主要是驗證Function, 理論上除非是做非常新的平台, 否則BIOS Vendor 本身應該差不多都Debug 到一個蠻Stable 的階段, 但是因為種種原因, 目前個人手上的版子不是很stable, 所以要常常K EDS(External Design Specification)/Datasheet, 與寫些Test program(跑在FreeDOS下,用OpenWatcom v1.8開發, 用之前買的TDK 8G USB Disk),又這是個人第一個x86 平台的BIOS/EC porting 工作項目, 所以倍覺要讀的東西特多, 雖說電腦每天在用, 但是底層的東西, 平常是碰不太到的, 由其是脫離了DOS 後更是如此!

回想以前在DOS下還寫過VGA/VESA Interface的程式, 研究過DOS下程式中的動態 Driver 的實作 (這個機制很簡單, 基本上Driver 只要是64K/.COM type 透過 DOS allocate a segment memory 然後透過自製的Header就行了, 不過實際上現在OS的機制也基於這個原理,  只是加上比較複雜的Relocate/Loader 機制)

這幾天在看SMI (System Management Interrupt), 網路上有提到了USB legacy support 的實作, 以前看到這部分一直以為是CPU本身有 IO trap 機制, 這幾天研究過 ICHx 才發現, 實際上是SouthBridge 實作了I/O trap, 當IO Trap 的configarution register 設定過後, 當SW對這些I/O address 作動作會引發 SMI 的動作, 使得CPU進入所謂SMM 運作(請參閱 Intel Software Developer Manual Vol 3), 會進入SMRAM 的SMI Handle, 因此可以透過軟體模擬I/O 的動作, 進而達到Virtual I/O Device 的目的.(SMRAM 的Address 是透過 MSR指定 ISD Vol 3b會有各系列處理器家族的MSR對應表, 對應的關鍵字是SMRR (System Management Range Registers, 不過按照內容來看是只能WO, 且要在SMM模式下才能寫),BIOS 應該要在Default 30000H+8000h(Section 26.4 SMRAM in ISD Vol.3b) 先跑一個 stub+3000h 才能設定到正確SMI handle segments, )

現代的PC 為了保持從IBM XT/AT 以來的軟體相容性設計, 所以一直疊床架屋作了很多模擬的動作, 用以確保以往的軟體投資能得到保障, 這是PC成功的原因, 但也是包袱, 在未來的3年內, 因UEFI 的使用, 將會逐漸拋棄這些傳統架構下的產物, 不過可見的是某些Embedded System (主要在工業/軍用產業, DOS仍未完全消失!!)仍然持續需要這些服務!


Intel ICH9 Datasheet , Update

ICH9  的 IO Trap register 是在 Section 10.1.46 ~ 49 IOTRn — I/O Trap Register (0-3),

不過看起來 USB legacy support 有專用的暫存器 16.1.23 USB_LEGKEY—USB Legacy Keyboard/Mouse Control
Register, (在某些Platform 上是透過上面的IO Trap 直接實做)

另外可以發出SMI的裝置主要還有APIC/EC 等, APIC 是透過所謂APM contoller(這也是時代產物), 在Intel platform 通常是 IO -0B2h/0B3h, 當所謂的SW SMI 都是透過上述機制去產生SMI#信號.

推薦閱讀 USB键盘背后的那些事儿–Legacy USB实现

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: