• Bios工程师手边事—HDA Audio


     转自:Bios工程师手边事—HDA Audio

       

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


     

    本文来自博客园,作者:王楼小子,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/15768362.html

  • 相关阅读:
    java之redis篇(spring-data-redis整合) (转)
    web.xml
    点击类名方法名如何连接到相应的Android源代码
    eclipse能够自动提示变量名.
    Android自定义ActionBar
    Android 自定义View
    android 自定义titlebar
    Android SharedPreferences登录记住密码
    Android 正则表达式验证手机和邮箱格式是否正确
    Android 首次进入应用时加载引导界面
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/15768362.html
Copyright © 2020-2023  润新知