目前正在做一款至强服务器平台,发现居然有接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结构

bioshd音频控制器开不开 bios hd音频控制器_ec


从该图可以看出:

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真实数据


bioshd音频控制器开不开 bios hd音频控制器_ec_02



从上图可以看出来。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分别执行即可。


传道书:“我又专心察明智慧、狂妄和愚昧,乃知这也是捕风。因为多有智慧,就多有愁烦;加增知识的,就加增忧伤。”