Fork me on GitHub
0%

CODEC移植开发总结

CODEC移植开发流程

  1. 准备原理图、外设(codec、pa)手册。查看硬件音频通路,mic位置、喇叭位置、功放位置等等

  2. 准备相关代码,移植到平台中。支持驱动中没有的函数保证编译通过

  3. I2C通信成功,可以读出codec、pa的设备ID

    • 配置设备驱动设备树。配置对应设备节点的compatible字段,保证设备可以正常调用probe函数
    • 配置I2C设备树。根据原理图判断在哪一组的I2C,并根据原理图查看设备地址(固定地址+选通地址)保证通讯成功可以读出ChipID
    • (如果I2C失败,通常有以下几个原因:上拉电阻、上拉电阻电压、设备地址不正确)
  4. 注册声卡

    • 定义声卡的硬件描述。定义声卡硬件的描述信息,包括声卡的名称、DAI(Digital Audio Interface)和 CODEC 的连接配置等。这通常是在设备树中完成的,使用特定的设备树节点来描述声卡的硬件连接。
    • 创建声卡驱动代码:编写相应的 ALSA 声卡驱动代码,该驱动代码将负责与设备树中的声卡节点进行匹配,并在匹配成功时注册声卡。在驱动代码中,你需要实现 snd_soc_card 结构体,并填充相应的字段,包括声卡的名称、DAI 链路、CODEC 控制等。
    • 注册声卡:在驱动代码中,通过调用 snd_soc_register_card() 函数来注册声卡。该函数将会在 ALSA 框架中注册声卡,并建立与硬件之间的连接关系。
    • 声卡初始化:在声卡注册成功后,你可以在声卡的 probe 函数中进行必要的初始化操作,如设置 DAI 和 CODEC 的配置参数、请求 IRQ、创建 ALSA 控制接口等。
  5. 根据ASoc框架,配置platform和codec(这个步骤和上一步高度耦合,上面介绍比较泛泛,具体配置流程如下)

    • 通常数据路径:(playback)RAM -> DMA -> (xxx) -> cpu dai -> codec dai -> pa
    • 板级端platform。根据不同的平台的使用要求,配置route table和dapm。该通路需要保证数据从RAM到cpu dai
    • 设备端codec。根据手册和相关文档,查看相关流程是否正确
    • 设备端pa。根据手册和相关文档,进行配置
  6. 放音测试正常即可

  7. 优化codec寄存器配置

问题及解决方案

  1. codec与cpu不能进行i2c通信?

    • 检查设备地址
    • 检查设备供电是否有问题
    • 示波器查看I2C时序
    • 最终定位在codec供电是3.3v,而codec的i2c上拉是1.8v。将i2c上拉电压更改正常通信
  2. request_firmware 函数不能正常加载固件?

    • 路径不正确。拼写错误
    • 权限不正确
      • 检查SElinux安全模块,是否是权限问题导致禁止读
      • 检查文件系统的权限,是否可以读
      • 内核配置问题。内核找到函数的实现部分,定位出现错误的位置,最终定位到是某一个宏未选中导致使用的函数未实现
    • 代码有误。在固件加载过程中不同编译器不同平台对于无符号/有符号的处理可能不同。
  3. codec、板级通路检查正常,录音报错?

    1
    2
    3
    4
    / # arecord -D hw:0,5 -c 2 -r 16000 -d 10 -t wav baic0_16000-2.wav
    Recording WAVE 'baic0_16000-2.wav' : Unsigned 8 bit, Rate 16000 Hz, Stereo
    arecord: set_params:1312: Broken configuration for this PCM: no configurations available
    / #

    CONFIG_SND_ASOC_INGENIC_DMA_PREALLOC_PAGES内核中这个宏配置较小,改成128正常(ingenic平台)

    最终宏的值配置在了 struct snd_pcm_hardware 结构体 .buffer_bytes_max成员变量上,该成员变量表示 PCM 设备的最大缓冲区大小(以字节为单位),说明该成员变量的值不能太小,否则会出现以上错误。

    另一种解决办法:在命令行加入 -B 参数,表示buffer的大小

  4. 录放音通路?

    对于录音,通常会有dmic和amic,dmic采样之后已经是数字输出,数字数据输出到CODEC内部对于adc的配置与模拟数据是不一致的,需要调整。

    • 录音:mic –> codec(adc) –> codec dai –> I2S –> cpu dai –> DMA –> RAM

    • 放音:RAM –> DMA –> cpu dai –> I2S –> codec dai –> codec(dac) –> pa

  5. 录音通路正常,但是使用arecord录音没有数据?

    使用示波器对硬件管脚进行检查,定位是在哪一个环节数据没有进一步传输。在此过程中对于时钟也要进行测量。

    在上述问题出现的情况下,测量MCLK正常,LRCLK、WS是没有的。通过软件检查发现:对于x2000-soc aic控制器支持独立时钟和共享时钟两种模式,在硬件上codec通常只有一组I2S,五根pin(MCLK、LRCLK、WS、R_DATA、T_DATA),但是对于SOC每一组的I2S时钟都是独立的,需要硬件和软件进行匹配。最后的问题在于将接受数据的clk输出到另外一个管脚(悬空)上,通过修改设备树配置正确输出时钟即可。

  6. 耳机录放音无声?

    通过示波器检查输出波形,如果存在波形检查硬件是否存在将其拉地的地方

    对于录音无声可以检查MICBIAS电压是否存在,通常,麦克风需要一个稳定的直流电压来极化麦克风的电容式元件或其他传感器,以便能够正确地工作和产生音频信号。Micbias电压通常是3.3V、5V或其他适合麦克风工作的电压。具体的Micbias电压值取决于麦克风的类型和规格。

    对于ES8326这款codec,不能使用VMID来当做耳机的micbias

  7. 不论是否插入HP设备,都会一直来中断?

    首先需要检查中断IO是否配置正确,其次验证对应IO的电平是否发生翻转。最终解决是在设备树中hp_detect_gpio需要配置成HIZ,不能配置成NOBIAS(关闭偏振电压)。

  8. 耳机录音的时候发现很强的滋啦滋啦声音?

    如果有飞线查看是否存在虚焊

参考资料