目前正在做一款至強服務器平台,發現居然有接ALC282聲卡。一個服務器要聲卡做什么呢?百思不得其解。不過既然原理圖都畫出來了,BIOS就需要將其調試出來。畢竟BIOS就是不做它,也省不了啥成本。
我們先來看下兩個最基本的概念:
1, HDA控制器:計算機的核心部件是CPU,執行計算機功能的是IO設備。但是同種IO設備有很多,廠商也會有很多,自然各個廠商的IO設備實現方法也不一樣。CPU是怎么兼容那么多設備的呢?答案是控制器。CPU廠商將控制器做出來,IO設備廠商都需要照着這種控制器的接口來做。現在聲卡控制器最流行的就是HDA。
2, HDA Codec:就是我們常說的聲卡。有了控制器,只是提供了統一的接口。真正功能的實現,還需要設備來完成。HDA Codec就是負責將我們的模擬信號轉成數字信號,有時將數字信號轉成模擬信號。總之,將現實的聲音轉成可以存儲在計算機的二進制,或將二進制轉換成人耳能聽到的模擬信號。說白了,聲卡就是干DSP干的事。
那么做BIOS需要對聲卡功能做哪些部分呢?其實挺簡單的,只要按照我們的線路圖配一個verbtable,然后將其寫入HDA Codec即可。
Verb table是由N多Verb組成。那么Verb是什么樣子呢?請看下圖所示:
圖1,Verb結構
從該圖可以看出:
1, CAD占4個BIT,0xF的功能為廣播,所以一個HDA控制器原則上可以連接15個Codec。
2, 配置HDA Codec是以節點為對象。節點域占了7位,但HDA控制器要求必須有一個節點作為root節點,而且許多節點作為group node,將widget進行分類,所以真正作為widget節點並不會占滿128個。
3, 真正的數據是通過verb&Commanddata傳入HDA Codec的。
這個Verb table並不是一個很困難的東西。但很慚愧,本人到現在都不會配置Verb table。我現在所在的公司不是一個專業的主板公司,所以HW工程師也都不懂如何配置。以前公司的HW還是挺牛的,他們都能根據自己設計的原理圖配置Verb table。那么Verb table究竟包括哪些東西呢?讓我們來看一下下圖所示:
圖2,Verb真實數據

從上圖可以看出來。Verb可以配置連接的Port,位置,連接部件類型,聲道,顏色等等。但有了上述信息,我們是不是可以手動填寫一個verb table嗎?理論上可以,但最好不要這樣做。廠商會有相應的配置工具,像realtek的HDACfg.exe,會給我們提供極大的便利。
我們怎么將VerbTable寫入Codec呢?我們需要借助三個寄存器:ICW,IRR和ICS。在Intel的橋片上,我們可以在HDA Controller上的BAR所映射的內存空間里找到這三個寄存器。
操作這一個寄存器的步驟是:
1, 將verb寫入ICW里。
2, 將ICS的低2位寫1s。
3, 檢查ICS的BIT0,確認Command執行完畢。
4, 從IRR中將結果讀出來。
上述步驟,就是我們寫一個verb到codec的步驟。從第3步可以看到,該方法效率並不高。所以我們將其稱為PIO的方式。像寫verb table這樣的小數據還行,如果放歌曲,錄制東西等,這種方式肯定不行了。所以HDA控制器還支持DMA的方式。
對於BIOS工程師而言,發現設備管理器下沒有相應的HDA CODEC,又看不太懂HW線路圖,怎么辦?INTEL橋片的HDA控制器一般支持三個CAD,所以我們可以使用工具找到上面三個寄存器所映射的內存處,分別執行NID=0,Verb ID=0xF00,Parameter ID=0x0的Verb Command。三次即可。如果都看不到正確的VID,DID返回,那么很有可能硬件沒有上料。如果有ICS的BUSY位一直為1,很有可能硬件供電有問題。
下面,我們來看一下BIOS代碼怎么操作verb table的:
(1) reset HDA控制器
(2) 遍歷HDA控制器上所有的CAD,讀取VID和DID
(3) 找到VID和DID后,和代碼注冊的verb table數組分別比較一遍。如果有相同的,便讀取Jack總數。
(4) Verb table包括4*Jack個verb。按照PIO方式將各個verbcommand分別執行即可。