1、概述
1.1 概述
本章主要描述
Audio 的相关的概念、代码结构。
1.2 概念
●
CPU DAI:主控端的 Audio Data Interface,比如 I²S,Spdif,Pdm,Tdm
● CODEC DAI:即 Codec
● DAI_LINK:绑定 Cpu_Dai 和 Codec_Dai 为一个声卡,等同于 Machine
driver。
● DMAENGINE:用于 Cpu 和 I²S/Spdif 等 Dai 之间的 Dma 传输引擎,实际是通过 Dma来进行数据的搬运。
● DAPM:动态音频
电源管理,用于动态管理 Codec 等的电源管理,根据通路的开启配置开关,以达到保证功能的前提下功耗尽量小。
● JACK:耳机的接口检测,大部分使用 Codec 自身的检测机制,小部分使用 IO 来进行模拟。
1.3 代码结构
项目 | 功能 | 路径 |
Sound SOC | 主要包含公共部分代码,包括 dapm 控制,jack, dmaengine, core等等 | sound/soc/ |
rockchip platform | Rockchip平台的cpu dai的驱动, 比如I2S, spdif等以及自定义声卡 machine driver | sound/soc/rockchip |
generic platform | SIMple card Framework | sound/soc/generic |
codec driver | 所有的codec driver存放位置 | sound/soc/codecs |
2、Audio开发指南
2.1 概述
本章描述如何添加声卡,调试声卡以及通路等。
2.2 音频开发指南
一个声卡包含 cpu_dai, codec_dai, 以及 dai_link 组成,分别对应 cpu dai 的 dirver,比如I²S driver, spdif driver;codec driver, 比如 rt5640 codec driver;dai_link driver,也就是 machine driver, 比如 sound/soc/rockchip/rockchip_rt5640.c。 4.4 的
内核中支持两种方式创建声卡,一种是通用的 simple-card framework,一种是传统的编写自定义的 machine driver 来创建。本文档均以 rt5640 为例。
2.2.1 simple-card
Simple card 即简单通用的 machine driver, 如果 simple-card 框架足够满足需求,建议优先使用 simple card 框架,简单,方便,且易用。
1. 添加 codec driver,比如添加:sound/soc/codec/rt5640.c
2. 修改 sound/soc/codec/Kconfig 以及
MAKEfile 加入驱动编译。
sound/soc/codec/Kconfig:
config SND_SOC_RT5640
tristate "Rea
LTEk
ALC5640 CODEC"
depends on
I2C
sound/soc/codec/Makefile:
snd-soc-rt5640-objs := rt5640.o
obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
3. menuconfig 中
enable simple card 以及 codec
make menuconfig
device Drivers --->
Sound card support ---> Advanced linux Sound Architecture ---> ALSA for SoC audio support ---> ASoC support for Rockchip Rockchip I2S Device Driver
CODEC drivers ---> REALTEK ALC5640 CODEC ASoC Simple sound card support
......
2.2.2 DRM HDMI Audio
Rk 的 4.4 内核中,目前 HDMI 存在两套框架,一套是 RK 自定义 HDMI 框架,一套是 DRM标准的 HDMI 框架,相应的,音频也有两套。所以,HDMI 的音频配置需要和使用的 HDMI 框架相匹配。如下以 RK3399 为例,其他芯片类似。
1. RK 自定义 HDMI 框架音频配置,对应的 HDMI 驱动选择如下时:
hdmi_rk_fb: hdmi-rk-fb@ff940000 {
compatible = "rockchip,rk3399-hdmi";
……
2.2.4 声卡调试
1. 通过如下命令确认声卡是否注册成功
root@rk3366:/ # cat /proc/asound/cards
0 [rockchiprt5640c]: rockchip_rt5640 - rockchip,rt5640-codec
rockchip,rt5640-codec
root@rk3366:/ # ls -l /dev/snd/
crw-rw---- system audio 116, 2 2013-01-18 08:51 controlC0
crw-rw---- system audio 116, 4 2013-01-18 08:51 pcmC0D0c
crw-rw---- system audio 116, 3 2013-01-18 08:51 pcmC0D0p
2. 通过命令行播放录制调试声卡:
播放:一般播放 1khz 0db 正弦波,然后在 codec 输出端示波器简单测量是否失真,杂音,然后再使用音频分析仪测试指标。
root@rk3366:/ # tinyplay
Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]
|root@rk3366:/ # tinyplay /sdcard/test44.wav -D 0 -d 0 -p 1024 -n 3
Playing sample: 2 ch, 44100 hz, 32 bit
......
3. 通过命令行调试声卡的通路:
一般复杂的 codec 可提供各种通路的配置,如下图:分别是数字部分通路和模拟部分通路,通路旁边都有标注控制的寄存器 bit,codec driver 负责将这些控制实例化为 kcontrol,提供给上层设置切换通路使用,实际的调试方法为从数字部分的通路开始,比如 DACDAT 然后顺着找出一条最优的路径到达模拟输出端,比如 HPOUT。然后通过 tinymix 控制路径上的相应节点开关,打通通路。