NXP MCU 技术论坛
直播中

斗地主之神

9年用户 882经验值
擅长:嵌入式技术
私信 关注
[问答]

求助,关于SGTL5000 LINE-IN声音录制问题

我在定制载板上运行带有 IMX8MQ 处理器的 Android 11作系统。我正在使用SGTL5000编解码器。
我正在尝试通过将麦克风连接到芯片的 Line-In 引脚来录制声音SGTL5000。但是,帧编号不同于 0,也就是说,尽管帧大小随着录制时间的增加而增加,但在录制xxx.wav文件中听不到声音。
我确信麦克风连接,因为在我们其他基于 Linux 的自定义设备中,相同的连接适用于相同的 sgtl5000 编解码器。
在我的研究中,我看到有些人有这个问题,但他们在录制后测量的帧数为 0。我没有这样的情况,我看到帧大小会随着录制时间的增加而增加。
As stated in SGTL5000 document, Line-In can bypass ADC and go to Headphone output. In order to cancel this, I cleared CHIP_ANA_CTRL -> SELECT_HP bit. I write the value 0x0036 to the CHIP_ANA_CTRL register on the driver side. Therefore, I think Line-In does not go directly to the HP output, it goes to the adc.
此外,我还了解到,要启用 ADC,应0x1数据表中指定的 CHIP_DIG_POWER 寄存器中的 ADC_POWERUP 位值,当我检查驱动器侧时,ADC_POWERUP 位和 DAC_POWERUP 位值显示为0x1。所以那里也没有问题。
我使用 tinycap 进行录音。
我用 tinyplay 打开声音文件。我通过争边球引脚获得声音。我可以听普通的 wav 文件,只有我录制的文件没有声音。
我注意到 tinymix 设置中有一个 capture mux 变量。即使我将其更改为 LINE_IN,我仍然无法正确录制声音。
下面,我将默认设置保存为 tinymix as tinymix_default.txt。
下面,我将保存我所做的更改,以便能够通过 tinymix 将声音录制为 tinymix_changed.txt。
我通过 Tinymix 进行的更改
控制器名称 |默认值|更新值 |
--------------------------------------------
CAPTURE VALUME | 0 0 >               | 12 12 |
--------------------------------------------
CAPTURE SWITCH | OFF >               | ON |
--------------------------------------------
Mic Volume | 0 >                             | 3 |
--------------------------------------------
Capture Mux | MIC_IN >                 | LINE_IN |
--------------------------------------------
SGTL5000 电源连接:
VDDIO:1.8V
VDDD:1.8V(VDDD 上电 VDDIO 和 VDDA 根据勘误表上电。我们已经通过硬件配置解决了)
VDDA:3.3

回帖(1)

温暖镜头

2025-4-16 18:01:41

根据您描述的问题,以下是一步步的排查和解决方案:


1. 检查音频路由配置



  • 文件位置: vendor/etc/audio_policy_configuration.xml

  • 确保Line-In输入设备已正确声明,例如:


      
                     samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
      



      


      


  • 确认录音时使用的音频源(如AudioSource.DEFAULT)是否正确路由到Line-In。


2. 使用 ALSA 工具验证底层录音



  • 进入ADB Shell,尝试直接通过ALSA录制:
    tinymix -D 0 'ADC Input' 'LINE_IN'  # 设置输入源为Line-In
    tinymix -D 0 'Capture Volume' 63    # 设置最大增益(0-63)
    tinycap /sdcard/test.wav -d 1 -c 2 -r 48000 -b 16

  • 播放生成的test.wav,若仍无声,继续排查。


3. 检查混音器控件状态



  • 运行 tinymix -D 0 查看所有控件,关键控件可能包括:

    • ADC Input Select: 设为 LINE_IN(值可能为2)

    • Line-In Volume: 调整至适当电平(如20-30)

    • Capture Switch: 确保为 on

    • PGA Volume: 适当增益(例如40)



4. 验证设备树配置



  • 检查SGTL5000的I2C节点配置(如 arch/arm64/boot/dts/freescale/your-board.dts):
    &i2c3 {
    sgtl5000: codec@0a {
      compatible = "fsl,sgtl5000";
      reg = <0x0a>;
      clocks = <&clk IMX8MQ_CLK_SAI1_ROOT>;
      VDDA-supply = <®_3v3>;
      VDDIO-supply = <®_3v3>;
      #sound-dai-cells = <0>;
      fsl,line-in-routing = <2>; // 确认Line-In输入通道配置
    };
    };


5. 检查驱动初始化



  • 确认驱动正确初始化SGTL5000寄存器:

    • CHIP_ANA_CTRL (0x0020): 应设置位[8:9]为 0x01(选择LINE_IN到ADC)

    • CHIP_ANA_ADC_CTRL (0x0024): 确认ADC输入路径未静音,增益适当。


  • 使用 i2cdump 检查寄存器值:
    adb shell i2cdump -f -y 3 0x0a  # 假设I2C总线3,地址0x0a


6. 信号路径与硬件检查



  • 示波器检测: 测量SGTL5000的LINE_IN引脚(如L/RIN1/2)是否有音频信号。

  • 电路检查: 确认耦合电容(如1uF)正确连接,无短路/开路。


7. 对比Linux环境配置



  • 在正常工作的Linux设备上运行:
    tinymix
    arecord -D hw:0,0 --dump-hw-params

  • 对比混音器设置、ALSA配置和寄存器状态,调整Android配置至一致。


8. 检查Android HAL层



  • 确认音频HAL正确实现,audio.primary..so 是否正确处理输入流。

  • 检查 /vendor/etc/audio_effects.xml/vendor/etc/audio_platform_info.xml 是否有冲突配置。


9. 调试日志分析



  • 收集内核日志:
    adb shell dmesg | grep sgtl5000

  • 检查是否有I2C错误或寄存器写入失败信息。


10. 固件/驱动更新



  • 确认使用最新内核版本或SGTL5000驱动补丁,某些版本可能存在已知问题。


示例修复步骤


假设混音器输入源未正确设置:


adb shell tinymix -D 0 'ADC Input Select' 2  # 设置LINE_IN
adb shell tinymix -D 0 'Capture Volume' 50
adb shell tinymix -D 0 'Capture Switch' on
adb shell tinycap /sdcard/fix.wav -d 2 -r 48000 -c 2 -b 16

完成以上步骤后,若问题仍未解决,请提供以下信息以便进一步诊断:



  • audio_policy_configuration.xml 相关片段

  • tinymix -D 0 的输出

  • 设备树中SGTL5000的配置部分

  • 异常时的dmesg日志

举报

更多回帖

发帖
×
20
完善资料,
赚取积分