• Linux音频系统编程之芯片平台适配功放Codec Driver解读


    1、概述

    针对音箱日常工作项目开展的前期,需要快速的适配音频子模块,方便项目的声学评估和开展,期间遇到不少的问题,其中有一些细节往往会忽略掉,然而正好是问题的所在。在此背景下,遇到问题一步一步梳理,方便快速的定位出问题所在 。

    适用范围 : 通用的Android / Linux 平台皆可适用

    2、硬件相关准备

    2.1 确保硬件通路正常

    • 确保硬件板子相关连接都已经准备好,例如包括使用到的 I2C_SDA、I2C_SCK 以及
      I2S_MCLK、I2S_BCLK、I2S_LRCK、I2S_DIN、I2S_DOUT 等是否都已连接好,硬件上时
      钟及数据脚通路是否都以确定 OK;
    • 主控端 I2S 模块及外挂模块供电正常

    2.2 硬件原理图

    • 通过项目相应原理图确认使用的哪组 I2S 及其相应的引脚、复用;
    • 通过相应原理图确认为实现外挂 Codec 与主控间的通讯而使用的哪组 I2C;
      • 例如麦克风 PDM接口的接线图,一方面保证引脚配置,另一方避免引脚冲突

    2.3 外挂 Codec 相关 datasheet

    • 确认其使用的主/从模式?(master/slave?)
    • 确认其正常工作的模块时钟频率?
    • 确认其使用的数据传输模式及时钟信号翻转情况?(I2S/PCM?)
    • 确认其使用的数据格式配置?(最大位宽?pcm_lrck_period 周期等?)
    • 外挂 I2C 的 I2C 地址?
      • 例如TAS5805 Datasheet 中的从机地址 ,一定要根据项目实际的电路图中ADR引脚的上拉电阻决定的
        在这里插入图片描述

    3. 软件相关准备

    3.1 I2S 驱动及外挂驱动

    • 主控端 I2S 接口模块实现驱动确认支持;
    • 外挂 Codec 实现驱动确认支持;

    3.2 软件相关配置修改

    • 主控端 I2S 模块 daudio 相关数据格式配置项参数确认及配置;
    • 主控端 I2S 模块 snddaudio 节点用于与外挂 Codec 绑定用的节点配置确认(外挂 Codec 的 codec name 与 codec_dai name 可通过外挂 Codec 驱动源码等方式确认);
    • 外挂 Codec 的相关节点配置添加确认;

    3.3 驱动模块使能

    • 主控端 I2S 模块使能,包括 board.dts 配置文件模块使能及内核配置 menuconfig 模块使能;
    • 外挂 Codec 驱动模块使能,包括 board.dts 配置文件模块使能及内核配置 menuconfig模块使能;

    3.4 编译通过并打包

    • 板型编译通过 make;
    • 打包固件;

    4. 实际验证

    4.1 确认模块声卡注册并绑定成功;

    • 通过指令:cat /proc/asound/cards 查看当前上机启动后是否有成功注册并绑定生成相应的外挂 Codec 名称的声卡; 针对Linux 平台也可以通过 arecord / aplay -l 查看声卡列表
    root@:/# cat /proc/asound/cards 
     0 [snddmic        ]: snddmic - snddmic
                          snddmic
     1 [audiocodecex   ]: audiocodec-ex - audiocodec-ex
                          audiocodec-ex
     2 [sndacm8625     ]: sndtas5805 - sndtas5805
                          sndtas5805
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 通过 tinymix / amixer 查看当前注册声卡的音频控件列表是否正常;
      • tinymix 适用于 Android 平台
      • amixer 适用于 Linux 平台
    root@:/# amixer  
    Simple mixer control 'Master',0
      Capabilities: pvolume pvolume-joined
      Playback channels: Mono
      Limits: Playback 0 - 578
      Mono: Playback 0 [0%]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2 确认 I2C 通讯正常;

    • 可通过指令:dmesg | grep I2C 来查看当前是否有 I2C 相关的错误打印,如timeout / error 等;
      • 一般I2C timeout 的原因主要有 : device端本身就没有回ACK,表现为I2C_ACKERR,大多是slave(从设备)问题,从设备上电是否符合SPEC等; 另外一种就是问题出在在master端(我们的CPU),表现为I2C_TIMEOUT。 在I2C bus没有上电的情况下去操作I2C
    • 可通过外挂 Codec 提供的模块寄存器调试节点,实时操作节点来读写外挂 Codec 寄存器来确认 I2C 通讯是否正常;
    • 如果I2C 不通,可通过i2c-tool 工具扫描发现的设备,单独操作设备,通过逻辑分析仪KingstVIS抓波形进行分析

    4.3 外挂 Codec 模块音频通路配置

    • 若有需要,通过 tinymix / amixer 指令工具配置相应外挂 Codec 的播放输出通路;
    • 若有需要,通过 tinymix / amixer 指令工具配置相应外挂 Codec 的播放输出通路;

    4.4 功放参数与硬件接法一致

    硬件电路中功放接法是BTL模式,功放软件参数必须配置的也是BTL模式,否则会出现无声音的问题。
    比如在某项目中,硬件电路接法是PBTL模式,但是功放参数中是BTL模式,所以排查一波之后才确定问题

    • I2C读写正常
    • 通过逻辑分析仪查看 I2S波形正常
    • 然后最后才分析到模式这个疑问点

    在这里插入图片描述

    4.5 播放/录音功能验证

    • 通过 tinyplay / aplay 指令工具播放指定 WAV 音频文件进行播放验证;
      • Linux 平台上也可以通过 speaker-test 进行立体声测试
    • 通过 tinycap / arecord 指令工具进行录制指定路径及名称的 WAV 音频文件,并在录音结束后通过
      adb 工具(adb pull)将录音文件拉出并通过音频解析软件进行播放、查看确认等;

    5. FAQ

    • 按要求进行 menuconfig 配置,并且在 board.dts 将 I2S 打开,但无声卡生成。

      • 查看 I2S 所使用的引脚是否被其它模块占用。
    • 按照Codec Datasheet 配置 I2C 从机地址,但I2C 一直Timeout

      • 查看硬件电路 I2C SCK / SDA 是否接反以及从机设备供电是否正常
    • 按照Codec Datasheet 配置 I2C 从机地址,当频繁的操作I2C 的时候,出现少部分写入Timeout

      • 查看从机设备的上拉电阻是否按照Datasheet 标准来的
    • 按照流程配置好Codec的音频通路以及I2C Addr,并可以发现音频节点,但是播放没声音

      • 通过逻辑分析仪查看I2S / TDM / PCM 的波形的BCLK设置是否正常
        • 芯片平台 通过dts 中的pcm_lrck_period 字段调整 可配置 16/32/64/128/256 个 bclk
    • I2C 通讯失败 i2c_drv_core_process()972 - [i2c2] Timeout when sending 9th SCL clk

    • 主要原因在于芯片供电电压异常,导致芯片没处于正常的工作状态,从而操作I2C 会Timeout , 波形上显示 SCL 一直是拉低状态。正常状态应该是高电平

  • 相关阅读:
    hadoop 3.0节点管理
    后端Boy转为数据库Boy基础最流行的SQL题,学完可以巩固几乎所有的查询,推荐分享
    关于工作中爬取网站的一些思路记录
    NVMe-MI --- Message Transport(消息传输)
    【Qt】鼠标拖拽修改控件尺寸---八个方位修改
    vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗
    高频故障-桌面图标变成白纸图标的恢复方案
    自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……
    【推荐题目】
    【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】
  • 原文地址:https://blog.csdn.net/z2066411585/article/details/126092326