BIOS开发笔记 – 音频

前言

在PC中,音频输出是一个重要的功能之一,目前大多数采用的是英特尔高清晰音效(英语:Intel High Definition Audio,简称为HD Audio或IHD)方案,它是由Intel于2004年所提出的音效技术,能够展现高清晰度的音质效果,且能进行多声道的播放,在音质(音效质量)上超越过去的其他集成型音效编解码器(Integrated Audio Codec),如AC97(Audio Codec 97)。HD-Audio还有AC97所没有的多音效系统Multi-Streaming功能。

硬件架构

一个完整的音频系统由CPU - Memory Controller - HDA Controller - HDA Codec 组成,如下所示:

HDA Controller:High Definition Audio 控制器是一个总线主控 I/O 外设,它通过 PCI 或其他典型的 PC 外设连接主机接口连接到系统内存。 它包含一个或多个 DMA 引擎,每个引擎都可以根据 DMA 类型设置为将单个音频“流”从编解码器传输到内存或从内存传输到编解码器。

Link(链接):HDA Controller可以通过Link物理连接到一个或多个编解码器(Codec), 控制器和编解码器之间可以通过Link传送序列化数据。

Codec(编解码器):编解码器可以从Link中提取音频流,并通过转换器将它们转换为输出流。 转换器通常将数字流转换为模拟信号(反之亦然)。

用一句话来概括这个流程就是,HDA控制器将音频流信号传送到Link,Codec从Link提取流信号并根据需要转换成所需的模拟或数字信号,最后输出声音。

线路

HDA控制器位于桥片上,其接口有5个信号,分别是:SDI,SDO,SYNC,BCLK和RST,如果桥片支持多个Codec,可能还有有多个SDI或SDO,如SDI0,SDI1,SDO0,SDO1。

Codec

Codec即编解码器,它是可发现和可配置的,其内部是由多个节点(Node)组成。它分三个层次结构:根节点(Root Node)、功能组节点(Function Group Node)和小部件节点(Widget Node),按照分层或树状结构组织而成。

每个连接到链路的编解码器在初始化时都被分配一个唯一的编解码器地址 (CAd,Codec Address),同样,在编解码器内每个节点也有一个唯一的NID, CAd 和 NID 组成了一个节点唯一的地址,通过该地址,便可对每个节点进行配置。

功能组内的这些定向目的模块称为小部件(Widget),例如 I/O 引脚小部件或 D/A 转换器小部件。 单个功能组可能包含某些小部件类型的多个实例(例如多个 Pin 小部件),从而实现多个通道的并发操作。

根节点是所有编解码器的顶级节点,并且始终在分配给该编解码器的编解码器地址 (CAd) 处作为节点零 (NID = 0) 寻址。 根节点包含设备级信息,包括该编解码器中功能组的数量和第一个功能组的 NID。

配置Codec

Codec是挂在HDA控制器上的,可在HDA控制器的PCI配置空间查看Codec分配的资源。

通过查看桥片手册可知,0x10,0x14是Codec的地址。此处双击0x10可直接访问到相应的内存空间。

Codec的内存空间是有标准的,High Definition Audio Specification有详细的定义,Intel桥片手册也有相关的说明。

对于节点的配置,数据包的大小为4个byte,且需要满足以下格式:

Bits Description
31:28 Codec Address
27:20 Node Index
19:8 Command
7:0 Data

 

其中的Command在High Definition Audio Specification有定义,但最好还是看Codec厂商提供的手册,因为厂商可能会根据需要对command进行扩充。

 

访问Codec有两种方法:CORB/RIRB 接口和Immediate接口

具体操作可参照High Definition Audio Specification说明。

VerbTable

Verb Table是一系列配置Codec寄存器的命令,可以根据Audio的设计,实现相应的功能。看一个Verb Table实例:

;===================================================================================================
;
;                               Realtek Semiconductor Corp.
;
;===================================================================================================

;Realtek High Definition Audio Configuration - Version : 5.0.3.1
;Realtek HD Audio Codec : ALC887-VD
;PCI PnP ID : PCI\VEN_10EC&DEV_0887&SUBSYS_088710EC
;HDA Codec PnP ID : HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_10EC0887
;The number of verb command block : 17

;    NID 0x11 : 0x40000000
;    NID 0x12 : 0x411111F0
;    NID 0x14 : 0x01014012
;    NID 0x15 : 0x90170120
;    NID 0x16 : 0x411111F0
;    NID 0x17 : 0x411111F0
;    NID 0x18 : 0x01819030
;    NID 0x19 : 0x02A1103F
;    NID 0x1A : 0x01813040
;    NID 0x1B : 0x0201E010
;    NID 0x1C : 0x411111F0
;    NID 0x1D : 0x40258629
;    NID 0x1E : 0x411111F0
;    NID 0x1F : 0x411111F0


;===== HDA Codec Subsystem ID Verb-table =====
;HDA Codec Subsystem ID  : 0x10EC0887
dd 00172087h
dd 00172108h
dd 001722ECh
dd 00172310h


;===== Pin Widget Verb-table =====
;Widget node 0x01 :
dd 0017FF00h
dd 0017FF00h
dd 0017FF00h
dd 0017FF00h
;Pin widget 0x11 - S/PDIF-OUT2
dd 01171C00h
dd 01171D00h
dd 01171E00h
dd 01171F40h
;Pin widget 0x12 - DMIC
dd 01271CF0h
dd 01271D11h
dd 01271E11h
dd 01271F41h
;Pin widget 0x14 - FRONT (Port-D)
dd 01471C12h
dd 01471D40h
dd 01471E01h
dd 01471F01h
;Pin widget 0x15 - SURR (Port-A)
dd 01571C20h
dd 01571D01h
dd 01571E17h
dd 01571F90h
;Pin widget 0x16 - CEN/LFE (Port-G)
dd 01671CF0h
dd 01671D11h
dd 01671E11h
dd 01671F41h
;Pin widget 0x17 - SIDESURR (Port-H)
dd 01771CF0h
dd 01771D11h
dd 01771E11h
dd 01771F41h
;Pin widget 0x18 - MIC1 (Port-B)
dd 01871C30h
dd 01871D90h
dd 01871E81h
dd 01871F01h
;Pin widget 0x19 - MIC2 (Port-F)
dd 01971C3Fh
dd 01971D10h
dd 01971EA1h
dd 01971F02h
;Pin widget 0x1A - LINE1 (Port-C)
dd 01A71C40h
dd 01A71D30h
dd 01A71E81h
dd 01A71F01h
;Pin widget 0x1B - LINE2 (Port-E)
dd 01B71C10h
dd 01B71DE0h
dd 01B71E01h
dd 01B71F02h
;Pin widget 0x1C - CD-IN
dd 01C71CF0h
dd 01C71D11h
dd 01C71E11h
dd 01C71F41h
;Pin widget 0x1D - BEEP-IN
dd 01D71C29h
dd 01D71D86h
dd 01D71E25h
dd 01D71F40h
;Pin widget 0x1E - S/PDIF-OUT1
dd 01E71CF0h
dd 01E71D11h
dd 01E71E11h
dd 01E71F41h
;Pin widget 0x1F - S/PDIF-IN
dd 01F71CF0h
dd 01F71D11h
dd 01F71E11h
dd 01F71F41h
;Widget node 0x20 :
dd 02050007h
dd 020409C8h
dd 02050007h
dd 020409C8h

Widget node 0x14这一组:

dd 01471C12h 
dd 01471D40h 
dd 01471E01h 
dd 01471F01h

分析第一行数据,根据前面所述数据包的格式,可知:

通过查手册,可知Command 0x71c是用于配置Configuration Default Register的,命令还包括0x71D,0x71E,0x71F,每个命令负责配置8bit的数据,组成一个32bit的寄存器。如下所示:

 

该寄存器用于描述PIN Widget(当做音频输出接口)的配置,其中:

Port Connectivity:指示该Widget的连接类型,共有4种情况,如下

Location:指示Widget的物理位置,如内部,外部,前面板,后面板等。

Default Device:配置设备的类型,如Line In、Line Out、Mic In、Aux、Speaker Out等。

Connection Type:指示连接的类型,手册上定义了十多种

网上找了张图,大致对应关系如下:

1/8 stereo指的是3.5mm立体声,也就是常见的耳机接口。其它类型可百度。

Color:标记接口的颜色,台式机比较常见。

MISC:仅最低位有效,用于指示是否支持Jack插入检测功能。

Default Association:将每个Widget分组,值越低,处理优先级越高。

Sequence:指示插口在组中的顺序。

回到前面的那组Verb Table值,组成一个Configuration Default Register后为:0x1014012,结合前面的说明,可知该配置是:

配置的就是前面示图中的台式机后面板音频的绿色插孔。

最后,对于BIOS来说,Porting Audio需要做的就只是添加一个VerbTable而已,Verbtable也是由Codec厂商提供的,有些小公司可能没有厂商的支持,那只能自己用HDACfg配置生成一个了。

附件

high-definition-audio-specification.pdf

版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1144/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>