这设备真奇怪,重新装ubuntu系统之后原来编译完的内核装上,右声道无论如何都没声音。把右扬声器设置为左声道,有声音。左扬声器设置为右声道,无声音。都设为左声道,都有声音。都设为右声道,都没声音。
也许还有其他因素在里面
有一个忽略了的问题,
SND_SOC_DAPM_MUX("Amp Input", SND_SOC_NOPM, 0, 0, &chsa_mux),
这是一个多路选择MUX widget,也就是同时只通一路Left或right,
{"Amp Input", "Left", "AIFINL"}
{"Amp Input", "Right", "AIFINR"},
cset "name='Amp Input' Left"
会只接通 AIFINL
,cset "name='Amp Input' Right"
会只接通 AIFINR
。
但现在硬件接线上已经进行了环接,应该不按声道区分扬声器。所以可以让两个芯片在左右声道下都连通。
//第一芯片
{"Amp Input", "Left", "AIFINL"},
{"Amp Input", "Right", "AIFINR"},
//第二芯片
{"Amp Input1", "Left", "AIFINL1"},
{"Amp Input1", "Right", "AIFINR1"},
或者直接接通
{"AMPE", NULL,"AIFINL"},
{"AMPE", NULL, "AIFINR"},
直接接通试过,不行。之前是Amp Input每个芯片只保留一路,正常使用。后来重装系统就不行了
试试切换声道的时候,amixer手动调整widget配置
cset "name='Amp Input' Left"
cset "name='Amp Input' Right"
如果起效果的话,那就可以在conf文件里配置一个芯片Left 一个芯片Right。
还是一样,使用左声道正常,但是右声道无声音
$ amixer -c0 sset "Amp Input1" Right
Simple mixer control 'Amp Input1',0
Capabilities: enum
Items: 'Left' 'Right'
Item0: 'Right'
$ amixer -c 0|grep -n3 Amp
121:Simple mixer control 'Amp Input',0
122- Capabilities: enum
123- Items: 'Left' 'Right'
124- Item0: 'Left'
125:Simple mixer control 'Amp Input1',0
126- Capabilities: enum
127- Items: 'Left' 'Right'
128- Item0: 'Right'
还有可以试试两个都用0而不用1,rt5659输入端没有分开0,1两个通道
//SND_SOC_DAPM_AIF_IN("AIFINR", "HiFi Playback", 1, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_IN("AIFINR", "HiFi Playback", 0, SND_SOC_NOPM, 0, 0),
真好了。虽然不知道之前这么弄好的,但是你的方案确实有效
rt5659里有专门widget去处理单声道多声道的,参考rt5672的ucm conf文件,通过conf文件可以实现很多功能,让alsa在收到声卡操作时(切换扬声器、耳机、声道等)自动匹配对应的controls操作去配置widget,但是widget太多太杂我没去理清,现在那份几乎只是实现最简单的一种route连通。之前有可能是你的机器里rt5659的widget寄存器存了以前的值,后来重装系统寄存起又重置了也说不定。
现在连通的route,多通道音频DAC转换后再ADC转换至AIF2输出到tfa9890,所以可能tfa9890进来是都混响到一通道,第二通道没有声音。
那样就算玄学了。这几天从C语言0基础变成入门,要学的东西还有很多
加油
我用的这板系统alsa-conf从conf.d移到Intel文件夹下了。另外对比rt5672,修复了音量调整,现在不用使用特定的音频后端(pipewire-pulseaudio高版本带“专业音频”模式),直接pulseaudio-alsa就行。
音量条修正
sound/soc/codecs/rt5659.c
// 音量修复 临时
// static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6562, 37, 0);
HiFi.conf
SectionVerb {
If.Controls {
Condition {
Type ControlExists
Control "name='media0_in Gain 0 Switch'"
}
Before.EnableSequence "0"
True {
Include.pe.File "/platforms/bytcr/PlatformEnableSeq.conf"
Include.pd.File "/platforms/bytcr/PlatformDisableSeq.conf"
}
}
EnableSequence [
cset "name='codec_out0 Gain 0 Volume' 72%"
cset "name='IF2 ADC Mux' DAC_REF"
cset "name='IF3 ADC Mux' IF_ADC1"
# 音量50%
# cset "name='DAC1 Playback Volume' 50%"
# 设置右扬声器使用右声道
cset "name='Amp Input1' Rihgt"
]
DisableSequence [
]
Value {
PlaybackPCM "hw:${CardId}"
# The speaker ampl. path on the 5659 has no speaker vol control
# Use the digital DAC1 master control as MixerElem
# PlaybackMixerElem "DAC1"
# PlaybackVolume "DAC1 Playback Volume"
# PlaybackSwitch "DAC1 Playback Switch"
# PlaybackVolumeScale "0-155:0-100%log"
}
}
SectionDevice."Speaker" {
Comment "Stereo Speakers"
ConflictingDevice [
# 还没实现,取消注释就报错了
# "Headphones"
]
Value {
# The speaker ampl. path on the 5659 has no speaker vol control
# Use the digital DAC1 master control as MixerElem
PlaybackMixerElem "DAC1"
PlaybackVolume "DAC1 Playback Volume"
PlaybackSwitch "DAC1 Playback Switch"
}
EnableSequence [
cset "name='DAC1 Playback Switch' on"
]
DisableSequence [
cset "name='DAC1 Playback Switch' off"
]
}
cht-bsw-rt5659.conf
Syntax 3
SectionUseCase."HiFi" {
File "/Intel/cht-bsw-rt5659/HiFi.conf"
Comment "Default"
}