Linux 下的 A2B

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值