备注:来源于网络和高通文档,做个记录。
1.发送通路(TX)—表示本地到远端,即发送给对方的声音通路
声音一开始是从MIC 进入,这里有2个MIC ,默认MIC1用于手机(handset),MIC2用于耳机(headset)。之后声音进过2个可选增益的AP,注意第一个AP只能选择0db或+24db,而第二个AP的增益范围就大了很多,从-6db~+24db,步长1.5db。通过codec的寄存器,可以选择AP的增益,以及使用哪个AP(全选,全不选,或则只用一个,另一个bypass)。经过ADC之后,有两个滤波器HPF和SLOPE,HPF滤出120Hz以下信号,SLOPE会增强1kHz以上的高频信号。在进入QDSP前,有一个可编程增益CodecTxGain,范围-84dB~12dB。这里还有直连到RX后级的侧音增益控制side_tone_gain。进入QDSP后,首先经过EC(回声消除器),然后经过NS(噪声抑制器)和TX AGC,到这里声音信号已经达到最大信噪比。然后通过Tx PCM Filter,这是个FIR滤波器,根据自身的幅频和相频特性影响SFR(发送频响)。最后还有一级可编程增益TxVolume,也会影响到SLR(发送响度)。
2.接收通路(RX)—表示远端到本地,即本地听到声音的通路
与TX部分类似。需要补充一点,除图中所示外,SPEAKER还会在PMIC中进行最后一级放大,声音从MIC进来以后,流到CODEC,然后从AUXOP,AUXON输出,流到SPKR_IN_M,SPKR_IN_P, 即进入PMIC,这时可以通过PMIC的API pm_set_speaker_gain(PM_SPKR_GAIN_PLUS12DB)定义增益大小(在sndhw_init()中),放大增益范围为[-16,-12,-8,-4,0,4,8,12]dB ,最后通过SPKR_OUT_P,SPKR_OUT_M输出到喇叭。
3、如何理解 tinymix “MI2S_RX Channels” “One”
MI2S RX 线路上通道的个数:One or Two
如何理解 tinymix “RX2 MIX1 INP1” “RX1”
表示 SPK 以内部的 Rx Mix2 作为 mixer 作为输入,在 mixer 端又以 mixer的 Rx1 作为输入
如何理解 tinymix “RDAC2 MUX” “RX2”
表示音源右声道的前端数据来自 DAC2 模数转换器,而 DAC2 的又以 RDAC2 的 Rx2 作为输入
如何理解 tinymix “HPHR” “Switch”
表示右声道是打开还是关闭,其值为 Switch or Zero
如何理解 tinymix “Ext Spk Switch” “On”
表示打开外部 SPK,一般的,外部SPK都带有 PA 使能引脚,需要特别的打开,其值有 On or Off
则整个外部 SPK 的音频链路可以简化为:
Rx Mix2 –> DAC2 –> HPHR –> SPK
4、数字增益设置
"RXn Digital Volume"
"DECn Volume"
"IIRn INPx Volume"
以上增益按最小 0 阶到最大 124 阶设置, 步长 1 dB。 最小 0 阶代表-84 dB,第 84阶为 0 dB, 最大 124 阶为+40 dB
5、模拟增益
"ADCn Volume"
"LINEOUTn Volume"
"HPHL Volume"
"HPHR Volume"
"EAR PA Gain"
"SPK DRV Volume"
DECn Volume 的增益位置在Tx端:
6、对于Voice:voice的基本架构和数据流图如下所示,不同平台间略有差异,不尽相同,此处只给出例子。
Voice的处理大致如下:
TX方向:能量转换(mic)–> A/D转换(Codec)–> 音频前处理(DSP)–>混音器 –> 协议栈 –> RF
RX方向:RF –> 协议栈 –> 音频分离(Audio/Voice)–> 音频后处理 (DSP)–> D/A转换(Codec)–> 能量转换(Speaker/Headset)
7、
msm8996平台的stereo speaker链路的widgets路径就是:
CPU : "MultiMedia1 Playback"-->
DSP : "MM_DL1"-->"SLIMBUS_0_RX Audio Mixer("MultiMedia1")"-->"SLIMBUS_0_RX"-->
"Slimbus Playback(dai)"-->
CODEC : "AIF Mix Playback(dai)"-->"AIF MIX1 PB"-->"SLIM RX0 MUX("AIF_MIX1_PB")"-->
"SLIM RX0"-->"RX INT7_1 MIX1 INP0"("RX0")-->"RX INT7_1 MIX1"-->
"RX INT7 SPLINE MIX"-->"RX INT7 SEC MIX"-->"RX INT7 MIX2"-->"RX INT7 INTERP"-->
"RX INT7 CHAIN"-->"SPK1 OUT"-->
PA : "SpkrLeft IN"-->"SpkrLeft SWR DAC_Port Switch"-->"SpkrLeft RDAC"-->
"SpkrLeft SPKR PGA"-->"SpkrLeft SPKR"
上面只写了left的,right是一样的,然后pa中的widgets的name是已经加上了prefix的,而pa driver中route定义的是没有加prefix的,这里有坑,需注意。
"MultiMedia1 Playback"-->"MM_DL1"是通过fe的cpu dai driver在probe时创建的一个dai-->aif的链接,为什么?因为fe的cpu dai链接的是一个dummy codec,是需要dynamic绑定的,所以没办法通过dai link进行链接,所以这里只能通过aif的方式,在cpu dai这边指定cpu dai的输出接口,在be的paltfom driver中把此aif作为输入,进行route。
"SLIMBUS_0_RX"-->"Slimbus Playback(dai)"链接则是通过be的cpu dai driver在probe时创建的一个aif-->dai的链接。
"Slimbus Playback(dai)"-->"AIF Mix Playback(dai)"则是通过dai link进行链接的,因为这里的两个dai是静态的link,在创建声卡时就链接好了的。
"SPK1 OUT"-->"SpkrLeft IN"的链接是在dts文件描述声卡时定义的。
其余的链接都是各dirver中的route,加上xml对mix或mux的配置进行的链接。