转自:https://blog.csdn.net/qq_21186033/article/details/117667075
1.Verb结构
function group和widgets都通过verbs来访问parameters和controls。Parameters为function group或widget的能力或配置选项(只读信息),通过GET_xxx verb来获取。Control是用来改变codec的某些行为,大部分是可读写的,可通过独立的verbs来设定或访问各项控制信息。如RESET这样的control是只写的,不能通过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实际数据格式如下:
当verb和NID均为0时,表示verb是无效的,
否则它就是有效的,一定会得到一个回复。
codec收到一个有效的command后必须返回一个回复,回复的格式如下:
2. widget
widget是功能组中最小的可枚举可寻址模块。单个function组可能包含某些widget的多个实例。对于每个widget,都定义了一组标准参数(功能)和控件(命令和状态寄存器)。同样,每个widget由它自己的一组参数(功能)和控件(命令和状态寄存器)定义。
2.1音频输出转换器widget
音频输出转换器widget主要是用于模拟转换器的DAC或用于数字转换器的数字样本格式化程序(例如,用于S/PDIF)。它的输入总是连接到HDA link,其输出将在其他widget(如Pin widget)的连接列表中可用。这种widget可能包含一个可选的输出放大器,或者一个由其参数定义的处理节点。
2.2音频输入转换器widget
音频输入转换器widget主要由用于模拟转换器的ADC或用于数字转换器的数字样本格式化程序(例如,用于S/PDIF)组成。其输出始终连接到HDA link,其输入将从其自己的输入连接列表中选择。
2.3 Pin widget
Pin widget为音频和其他功能组提供外部(模拟或数字)连接。Pin widget还包括那些与外部连接直接相关的信号,例如jack sense和Vref控制信号。但是,GPIO Pin不是Pin widget的一部分,而是功能组的一个资源。Pin widget的功能是高度参数化的,定义了以下可选支持:
- 输入、输出(或两者),包括放大器的存在和性能
- 立体声或单声道(1或2声道),或2个以上声道插头(存在)检测
- 附加设备阻抗传感
- 支持麦克风的VRef偏置
每个Pin widget必须包含第下面要说的Configuration Default。
在外部输出pin(Pin widget的输入)上播放的频道将从其自己的输入连接列表中选择;外部输入引脚上的通道将在其他widget(如音频输入转换器widget)的连接列表中可用。
2.4混音器(求和放大器)widget
Mixe rwidget提供了任意混合多个频道(源)的功能。它有两个或多个输入和一个输出。每个输入有一个可选的输入放大器(包括一个可选的静音),这是可选的。
2.5选择器(多路复用器)widget
选择器widget提供了一个N选一的信号选择。然而,由于widget的输入通常在需要的地方有一个隐式选择器,所以这个widget可能很少使用。
2.6电源部件
功率widget通过为任意音频widget组提供单点功率状态控制来提供优化音频功能组内的功率管理的方便方法。Powerwidget与其他widget没有连接,但仍然使用其连接列表来指定与之关联并受其控制的widget集。这些关联是在设计时定义的,不是动态的。将电源状态控制写入此widget将有效地将所有关联的widget置于指定的电源状态。然而,在任何情况下,功率widget都不能将任何音频widget置于高于音频功能组的当前功率状态的功率状态。注意,虽然Powerwidget有一个连接列表,但它不包含连接选择器,因为没有到其他widget的直接连接。
7.2.3.7音量旋钮widget
音量旋钮widget提供指定输出引脚的机械音量控制。音量控制的物理性质没有规定——它可以是模拟轮(pot.)、按钮等——但是,它确实具有声明的绝对(例如pot.)或相对(例如按钮)功能。这个widget有一个连接列表,描述哪些其他widget(可能是Pin widget)的音量由音量旋钮widget控制;由于没有形成动态连接,因此没有连接选择器。
音量旋钮可通过软件设置,以直接控制相关的“从属”放大器,或发送未经请求的响应,允许功能驱动器“读取”音量旋钮,然后间接调整相关的“从属”放大器。
7.2.3.8蜂鸣发生器widget
音调或蜂鸣发生器widget是一个选项,用于通过将48 kHz帧标记除以可编程量来生成近似正弦波。当嘟嘟声发生器主动生成音调时,其输出驱动所有引脚部件,这些引脚部件是供应商选择的方法中当前定义的输出引脚,通过将引脚切换到嘟嘟声信号或将音调混合到当前播放流中。此节点从未在任何其他节点的连接列表中列出。
3. Codec Parameters and Controls
function group和widgets都通过verbs来访问parameters和controls。Parameters为function group或widget的能力或配置选项(只读信息),通过GET_xxx verb来获取。Control是用来改变codec的某些行为,大部分是可读写的,可通过独立的verbs来设定或访问各项控制信息。下列为内核中include/sound/hda_verbs.h文件中定义的codec相关的参数和Controls列表。
/*
* GET verbs
*/
#define AC_VERB_GET_STREAM_FORMAT 0x0a00
#define AC_VERB_GET_AMP_GAIN_MUTE 0x0b00
#define AC_VERB_GET_PROC_COEF 0x0c00
。。。
#define AC_VERB_GET_VOLUME_KNOB_CONTROL 0x0f0f
#define AC_VERB_GET_CONFIG_DEFAULT 0x0f1c
/* f20: AFG/MFG */
#define AC_VERB_GET_SUBSYSTEM_ID 0x0f20
#define AC_VERB_GET_CVT_CHAN_COUNT 0x0f2d
#define AC_VERB_GET_HDMI_DIP_SIZE 0x0f2e
。。。
#define AC_VERB_GET_HDMI_CHAN_SLOT 0x0f34
#define AC_VERB_GET_DEVICE_SEL 0xf35
#define AC_VERB_GET_DEVICE_LIST 0xf36
/*
* SET verbs
*/
#define AC_VERB_SET_STREAM_FORMAT 0x200
#define AC_VERB_SET_AMP_GAIN_MUTE 0x300
#define AC_VERB_SET_PROC_COEF 0x400
#define AC_VERB_SET_COEF_INDEX 0x500
#define AC_VERB_SET_CONNECT_SEL 0x701
#define AC_VERB_SET_PROC_STATE 0x703
#define AC_VERB_SET_SDI_SELECT 0x704
#define AC_VERB_SET_POWER_STATE 0x705
#define AC_VERB_SET_CHANNEL_STREAMID 0x706
#define AC_VERB_SET_PIN_WIDGET_CONTROL 0x707
#define AC_VERB_SET_UNSOLICITED_ENABLE 0x708
#define AC_VERB_SET_PIN_SENSE 0x709
#define AC_VERB_SET_CODEC_RESET 0x7ff
。。。
#define AC_VERB_SET_HDMI_DIP_XMIT 0x732
#define AC_VERB_SET_HDMI_CP_CTRL 0x733
#define AC_VERB_SET_HDMI_CHAN_SLOT 0x734
#define AC_VERB_SET_DEVICE_SEL 0x735
/*
* Parameter IDs
*/
#define AC_PAR_VENDOR_ID 0x00
#define AC_PAR_SUBSYSTEM_ID 0x01
#define AC_PAR_REV_ID 0x02
#define AC_PAR_NODE_COUNT 0x04
#define AC_PAR_FUNCTION_TYPE 0x05
#define AC_PAR_AUDIO_FG_CAP 0x08
#define AC_PAR_AUDIO_WIDGET_CAP 0x09
#define AC_PAR_PCM 0x0a
#define AC_PAR_STREAM 0x0b
#define AC_PAR_PIN_CAP 0x0c
#define AC_PAR_AMP_IN_CAP 0x0d
#define AC_PAR_CONNLIST_LEN 0x0e
#define AC_PAR_POWER_STATE 0x0f
#define AC_PAR_PROC_CAP 0x10
#define AC_PAR_GPIO_CAP 0x11
#define AC_PAR_AMP_OUT_CAP 0x12
#define AC_PAR_VOL_KNB_CAP 0x13
#define AC_PAR_DEVLIST_LEN 0x15
#define AC_PAR_HDMI_LPCM_CAP 0x20
3.1 Get Parameters (F00h)
返回payload中指定的parameter的值,可作用于所有node。
parameter的值包括获取codec verdor id、revision id、级联node的个数、Function Group类型、各capability(Volume Knob Capabilities、Processing Capabilities、Amplifier Capabilities、Pin Capabilities、Audio Widget Capabilities、Audio Function Group Capabilities)列表、PCM大小速率、支持的电源管理状态、支持的stream的格式。
3.2 Connection Select Control (F01h/701h):
对于有多个输入的widget来说,Connection Selet用来决定哪一个输入是active的。对于本身硬件上只有一个连接的widget,该verb无效。
3.3 Get Connection List Entry(F02h)
返回payload中指定的index的Connection List Entries。软件可以通过该命令查询widget的完整的connection list。当Connection List Length参数的Long Form位为1时,index的值必须为偶数,收到的回复为两个long form connection list entries。当Long Form位为0时,index的值必须为4的倍数,收到的回复为4个short form connection list entries
3.4 Configuration Default
Configuration Default是每个Pin小部件中所需的32位寄存器。它被软件用来帮助确定连接到codec的插孔和设备的配置。在codec首次通电时,此寄存器内部加载默认值,指示此特定管脚/插孔的典型系统使用。在这个初始加载之后,它完全是codec不透明的,并且它的状态,包括写入寄存器的任何软件,必须在重置事件中保留。它的状态不需要在电源变化时保持不变。下图为Configuration Default结构。
数据结构如下图所示:
端口连接[31:30]表示Pin的外部连接。软件可以使用此值来知道哪些引脚复用连接到插孔、内部设备或根本没有连接。端口连接字段的编码定义下图。
Location [5:0]表示插脚复用连接到的插孔或设备的物理位置。
位置字段分为两个部分,高位[29:28]和低位[27:24]。高位提供一个总位置,例如“外部”(在主系统机箱上,用户可以访问)、“内部”(在主板上,不打开机箱就无法访问)、单独机箱(例如移动箱)或其他。
低位提供几何位置,例如“前”、“左”等,或提供特殊编码来指示位置。
Default Device[23:20]表示插孔或设备的预期用途。这可以指示插孔上的标签或硬接线到端口的设备,如集成扬声器等。编码如下图。
Connection Type[19:16]表示物理连接的类型,例如1/8英寸立体声插孔或光学数字连接器等。软件可以使用此信息向用户提供有用的用户界面描述,或根据codec外部的物理传输功能修改报告的codec功能。连接类型字段的编码如下图。
Color[3:0]表示软件使用的物理插孔的颜色。颜色字段的编码如下图。
Misc[3:0]是一个位字段,用于指示有关插孔的其他信息。目前,只定义了位0。如果设置了位0,则表示插孔没有存在检测功能,因此即使管脚复用表示codec硬件支持插孔上的存在检测功能,外部电路也不能支持该功能。Misc字段的位定义如下图。
Default Association和Sequence将引脚复用(因此也包括插孔)组合成功能块,以支持多通道操作。软件可能假设具有相同关联号的所有插孔都要分组在一起,例如提供六通道模拟输出。软件也可以使用默认关联来在受限的情况下确定资源分配的优先级。对于处理节点或输入输出转换器等资源,较低的默认关联值将具有较高的优先级。请注意,这只是默认关联,如果需要,软件可以覆盖此值,特别是如果用户提供有关特定系统配置的附加信息。0000b的值是保留的,不应使用。软件可能会解释此值,以指示引脚配置数据尚未正确初始化。值1111b是指示关联具有最低优先级的特殊值。多个不同的Pin复合物可以共享这个值,并且每一个都打算作为独立的器件公开。
顺序表示关联组中千斤顶的顺序。关联组中编号最低的插孔应分配流中编号最低的通道等。编号不必在组内按顺序排列,只需顺序即可。一组默认关联中的序列号必须是唯一的。
其它具体定义参考High Definition Audio Specification 7.3节。这里就不再详细描述。