https://github.com/jakemoroni/audio_async_loopback
https://lkml.org/lkml/2019/12/9/738https://lkml.org/lkml/2019/12/9/738
从上面的解释中,跟之前对其理解A2B网络是一个提前预定义好的网络结构,非热插拔网络.
/work/adi/a2b/opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/src$ patch -p0 < ./opt/analog/a2b-alsa-driver/0.1.0/a2bpatch/a2bpatchfile
patching file buildroot/linux/linux-kernel/arch/arm/boot/dts/sc584-ezkit.dts
patching file buildroot/linux/linux-kernel/arch/arm/boot/dts/sc58x.dtsi
patching file buildroot/linux/linux-kernel/arch/arm/configs/sc584-ezkit_defconfig
patching file buildroot/linux/linux-kernel/arch/arm/mach-sc58x/include/mach/sc58x.h
patching file buildroot/linux/linux-kernel/arch/arm/mach-sc58x/sc58x-ezkit.c
patching file buildroot/linux/linux-kernel/include/sound/sc5xx-dai.h
patching file buildroot/linux/linux-kernel/include/sound/sc5xx-sru.h
patching file buildroot/linux/linux-kernel/sound/soc/adi/Kconfig
patching file buildroot/linux/linux-kernel/sound/soc/adi/Makefile
patching file buildroot/linux/linux-kernel/sound/soc/adi/sc5xx-asoc-card.c
patching file buildroot/linux/linux-kernel/sound/soc/adi/sc5xx-i2s.c
patching file buildroot/linux/linux-kernel/sound/soc/adi/sc5xx-sport.c
patching file buildroot/linux/linux-kernel/sound/soc/adi/sc5xx-tdm.c
patching file buildroot/linux/linux-kernel/sound/soc/codecs/a2b24xx.c
patching file buildroot/linux/linux-kernel/sound/soc/codecs/a2b24xx.h
patching file buildroot/linux/linux-kernel/sound/soc/codecs/a2b24xx-i2c.c
patching file buildroot/linux/linux-kernel/sound/soc/codecs/adi_a2b_i2c_commandlist.h
patching file buildroot/linux/linux-kernel/sound/soc/codecs/Kconfig
patching file buildroot/linux/linux-kernel/sound/soc/codecs/Makefile
硬件设备跟下面的驱动打印完全对应的上。
Linux ALSA 音频系统架构大致如下:
+--------+ +--------+ +--------+
|tinyplay| |tinycap | |tinymix |
+--------+ +--------+ +--------+
| ^ ^
V | V
+--------------------------------+
| ALSA Library API |
| (tinyalsa, alsa-lib) |
+--------------------------------+
user space ^
-------------------------------|---------------------
kernel space V
+--------------------------------+
| ALSA CORE |
| +-------+ +-------+ +------+ |
| | PCM | |CONTROL| | MIDI |...|
| +-------+ +-------+ +------+ |
+--------------------------------+
|
+--------------------------------+
| ASoC CORE |
+--------------------------------+
|
+--------------------------------+
| hardware driver |
| +-------+ +--------+ +-----+ |
| |Machine| |Platform| |Codec| |
| +-------+ +--------+ +-----+ |
+--------------------------------+
- Native ALSA Application:tinyplay/tinycap/tinymix,这些用户程序直接调用 alsa 用户库接口来实现放音、录音、控制
- ALSA Library API:alsa 用户库接口,常见有 tinyalsa、alsa-lib
- ALSA CORE:alsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC)
- ASoC CORE:asoc 是建立在标准 alsa core 基础上,为了更好支持嵌入式系统和应用于移动设备的音频 codec 的一套软件体系
- Hardware Driver:音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec
ALSA/ASoC 中硬件设备关系:
+------------------------------------------+
| Machine |
| +--------------+ +--------------+ |
| | Platform | | Codec | |
| | | I2S | | |
| | cpu_dai|<---->|codec_dai | |
| | | | | |
| +--------------+ +--------------+ |
+------------------------------------------+
- Platform:指某款 SoC 平台的音频模块,如 exynos、omap、qcom 等等。Platform 又可细分两部分:
- cpu dai:在嵌入式系统里面通常指 SoC 的 I2S、PCM 总线控制器,负责把音频数据从 I2S tx FIFO 搬运到 CODEC(这是回放的情形,录制则方向相反)。cpu_dai 通过 snd_soc_register_dai() 来注册。注:DAI 是 Digital Audio Interface 的简称,分为 cpu_dai 和 codec_dai,这两者通过 I2S/PCM 总线连接;AIF 是 Audio Interface 的简称,嵌入式系统中一般是 I2S 和 PCM 接口。
- pcm dma:负责把 dma buffer 中的音频数据搬运到 I2S tx FIFO。值得留意的是:某些情形下是不需要 dma 操作的,比如 Modem 和 CODEC 直连,因为 Modem 本身已经把数据送到 FIFO 了,这时只需启动 codec_dai 接收数据即可;该情形下,Machine 驱动 dai_link 中需要设定 .platform_name = "snd-soc-dummy", 这是虚拟 dma 驱动,实现见 sound/soc/soc-utils.c。音频 dma 驱动通过 snd_soc_register_platform() 来注册,故也常用 platform 来指代音频 dma 驱动(这里的 platform 需要与 SoC Platform 区分开)。
- Codec:对于回放来说,userspace 送过来的音频数据是经过采样量化的数字信号,在 codec 经过 DAC 转换成模拟信号然后输出到外放或耳机,这样我们就可以听到声音了。Codec 字面意思是编解码器,但芯片里面的功能部件很多,常见的有 AIF、DAC、ADC、Mixer、PGA、Line-in、Line-out,有些高端的 codec 芯片还有 EQ、DSP、SRC、DRC、AGC、Echo-Canceller、Noise-Suppression 等部件。
- Machine:指某款机器,通过配置 dai_link 把 cpu_dai、codec_dai、modem_dai 各个音频接口给链结成一条条音频链路,然后注册 snd_soc_card。和上面两个不一样,Platform 和 CODEC 驱动一般是可以重用的,而 Machine 有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:SoC Platform 与 Codec 的差异;DAIs 之间的链结方式;通过某个 GPIO 打开 Amplifier;通过某个 GPIO 检测耳机插拔;使用某个时钟如 MCLK/External-OSC 作为 I2S、CODEC 的时钟源等等。
下面的图中说明了Machine,Platform,Codec,cpu_dai,codec_dai