目前正在做一款至强服务器平台,发现居然有接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分别执行即可。