小華的部落格: POST Card & Port 80h

搜尋此網誌

星期二, 10月 23, 2007

POST Card & Port 80h

[前言 -什麼是Debug Card]
對於BIOS 工程師來說,常常會因為我們在移植程式碼到不同平台的時候,因為忽略了一些細節而讓BIOS程式碼無法工作,最常見的就是當機。

由於BIOS是屬於一個Loader(引導程式,或是初始化程式),可能當機的地方在VGA還沒辦法顯示的地方,所以錯誤訊息可能沒辦法顯示在螢幕上,因此透過其他的方式來讓我們知道BIOS 程式碼已經執行到了哪個階段,這樣子有助於我們去Debug 。

另外對於ㄧ台已經出貨給使用者的電腦,也可以透過這個方式來維修。而對於BIOS工程師來說I/O Port 80h 是一個很實用的Debug Port,而這個I/O Address已經成為一個標準,所以我們可以透過寫入代碼到Port 80h的方式,將代碼送到ㄧ張有七段顯示器的卡片來顯示,而顯示的那張卡片就稱為Debug Card或是Post Card,而顯示在卡上面的代碼就稱為POST Code(0x00~0xFF),當然也會因為不同BIOS廠商所以代碼也會有所不同。

[IA32 架構下的Port 80h]
Port 80h 與Debug Card 的路徑是如何被初始化的呢? 這部份是討論你寫入Port 80h 的資料是如何經過硬體電路然後解碼到Debug Card?

ㄧ般而言,目前IA32架構下的電腦中POST Card可以連接到PCI/LPC...etc 不同型態的bus,在IA32架構底下I/O Control Host 會負責將寫入到Port 80h的資料往PCI/LPC Bus送,然後我們就可以顯示在七段顯示器上面。

所以,由上述可以得知:
1.BIOS端需要去組態(設定) I/O Control Host ,然後選擇Port 80h資料要送到哪邊(PCI/LPC)。
2.HW需要設計一塊POST Card來負責將I/O Control Host 送過來的資料解碼(decode)成七段顯示器能夠顯示的訊號。

所以看起來很簡單吧,其實實做的時候只要拿著ICH Spec然後ㄧ步一步下去設定就可以了。

可能會有人想問,BIOS不是自己會去初始化這部分嗎,那幹麻還要自己做?
如果你想問這個問題的話,又剛好你是一個BIOS工程師時,你可以自己實驗一樣東西,就是在FFFF_FFF0的指令跳躍之後,你寫一段下面的Code 來做一個簡單的測試,這段code最主要是在POST Card上面ㄧ直顯示99h:

FirstPostCode:
mov al,099h
mov dx,80h
out dx,al
jmp FirstPostCode

由於BIOS一開始執行的地方你就輸出資料到Port 80h,此時系統上面的POST Card 不會顯示99h,這是因為你沒有初始化I/O Control Host 所以會造成系統當機,這也就是這篇文章的重點 "如何自己動手做"。

因為BIOS 能開始讓你寫入資料到Port 80h的地方可能不是一開始的BIOS entry point ,所以如果你想要在更早的地方去輸出ㄧ個代碼到Port 80h時,你就必須這樣子做。

由於我沒觸過PCI介面的POST Card,所以沒研究要如何針對這種類型的POST card初始化,但是對於LPC bus的方式則是去組態LPC中的暫存器以及RCRB中的設定就可以了讓寫入Port 80h的資料正確的送到LPC Bus,相關詳細資訊可參考I/O Control Host Spec中的說明。

[註]
P廠商的BIOS 在Post 階段一開始的時候就會去初始化Port 80h的相關設定,而I廠商的BIOS 則會到PEI 的某個點才會去做這部份的動作。

但是不管是哪一家的BIOS,如果你想更早一點就丟Port 80h,你就必須這樣子做,當然也有例外,例如硬體電路預設就已經是對的路徑的時候(例如預設PCI Bus,而你也用PCI Debug Card),這篇文章就沒有用了...呵呵 ^^


圖 Mini PCI Debug Card

6 則留言:

等待奇蹟 提到...

真高興看到這ㄍ網頁
目前正在為debug card感到困擾
LPC 的debug card在 VIA chipset 平台不會跑...聽說是要自己改code
茫茫大海...該如何是好
請大大指點~
Thanks...

Harrison 提到...

VIA chipset 我沒用過,不過一般LPC Post Card能不能用要先查VIA Chipset Spec,像是Intel 的ICH 上面就會有提到Port 80h這個位址。

ㄧ般 POST Card都是使用80h 這個位址(不管你是用PCI Bus介面還是LPC Bus界面的卡); 所以你要先查看看VIA Chipset 的80h這個I/O Address是走哪個介面,如果只走PCI,那你就不能用LPC。

而我的文章中是因為Intel ICH可以走LPC/PCI Bus,因此我需要寫ㄧ段程式碼去設定ICH Chipset(選擇我是用哪ㄧ種Bus),所以我才寫了一段code去設定他。

因此建議你先去查看看VIA Chipset對於Port 80h這個位址的描述。

簡單描述一下動作:

寫入資料到 Port 80h

Chipset 會知道有人對Port 80h寫資料
然後把資料往LPC/PCI 送(某個Reg控制)
↓ LPC ↓PCI
LPC POST Card PCI POST Card

匿名 提到...

關於VIA chipset 跑LPC port 80h, 要用PCS 的方式去setting.
譬如 PCS address 設成80h,並且enable 對應的PCS. 詳細可能要查此chipset的datasheet了.

匿名 提到...

Intel or VIA chipset both have the 80 port latch selection. You can use it setting your 80 port decode to ISA bus or LPC bus.

匿名 提到...

小華你好,想請問你AMD裡SATA的retry mode的定義是什麼?
謝謝

hYde 提到...

想請教一下,除了 port 80h 的 post code 截取外,還有什麼方法可以做 debug 動作?

是不是各家的 bios 方法都不盡相同呢?