ALSA ASoc 架构

  • 一、ASOC 由来
  • 二、从 HW 角度
  • 三、从 SW 角度
  • 四、重要数据结构关联图
    • 1、基于 Linux 3.0 数据结构图
    • 2、基于 Linux 4.0 数据结构图

一、ASOC 由来

ASoC–ALSA System on Chip,是建立在标准 ALSA 驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频 Codec 的一套软件体系,它依赖于标准 ALSA 驱动框架。内核文档 https://www.kernel.org/doc/html/v5.4/sound/soc/overview.html中详细介绍了 ASoc 的设计初衷,ASoc 正是为了解决下面种种问题而提出的:

  • Codec 驱动与 SoC CPU 的底层耦合过于紧密,这种不理想会导致代码的重复。例如,仅是 wm8731 的驱动,当前 Linux 中有分别针对 4个平台的驱动代码。
  • 音频事件没有标准的方法来通知用户,例如耳机、麦克风的插拔和检测,这些事件在移动设备中都是非常普通的,而且通常都需要特定于机器的代码进行重新对音频路径进行配置。
  • 当进行播放或录音时,驱动会让整个 codec 处于上电状态,这对于 PC 没问题,但对于移动设备来说,这意味着浪费大量的电量。同时也不支持通过改变采样频率和偏置电流来达到省电的目的。

二、从 HW 角度

ASoC 硬件设备驱动的三大构成:Codec、Soc(Platform) 和板载硬件 Machine 三大部分。

  • Machine:是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出 Machine 几乎是不可重用的,每个 Machine 上的硬件实现可能都不一样,CPU 不一样,Codec 不一样,音频的输入、输出设备也不一样。Machine 为 CPU、Codec、输入输出设备提供了一个载体,可以认为是 Platform 和 Codec 之间的粘合剂。
  • Platform:一般是指某一个 SoC 平台,比如 MT8167,MT8173 等等,与音频相关的通常包含该 SoC 中的时钟、DMA、I2S、PCM 等。只要指定了 SoC,那么我们可以认为它会有一个对应的Platform,它只与 SoC 相关,与 Machine 无关,这样我们就可以把 Platform 抽象出来,使得同一款 SoC 不用做任何改动就可以用在不同的 Machine 中。实际上,把 Platform 认为是某个 SoC 更好理解。
  • Codec:字面上的意思就是编解码器,Codec 里面包含了 I2S 接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM) 和多个输出(耳机、喇叭、听筒,Line-out),Codec 和 Platform 一样,是可重用的部件,同一个 Codec 可以被不同的 Machine 使用。嵌入式 Codec 通常通过 I2C 对内部寄存器进行控制。

三、从 SW 角度

在软件层面,ASoC 也把嵌入式设备的音频系统同样分为 3 大部分,Machine,Platform 和 Codec.

  • Machine Driver:负责处理机器特有 Machine control (如 AMP on/off);单独的 Platform 和 Codec Driver 是不能工作的,它必须
    由 Machine Driver 把它们结合在一起才能完成整个设备的音频处理工作。
  • Platform Driver:包含了该 SoC 平台的音频 DMA 和音频接口的配置和控制(I2S,PCM,AC97 等等)。它也不能包含任何与板子或机器相关的代码。
  • Codec Driver:ASoC 中的一个重要设计原则就是要求 Codec 驱动是平台无关的。任何特定于平台和机器的代码都要移到 Platform 和 Machine 驱动中。所有的 Codec 驱动都要提供以下特性:
    ① Codec DAI 和 PCM 的配置信息;
    ② Codec 的 IO 控制方式(I2C,SPI 等等);
    ③ Mixer 和其他的音频控件;
    ④ Codec 的 ALSA 音频操作接口;

四、重要数据结构关联图

在分析整个 ASoC 的过程中,出现了众多的数据结构,在此先理清重要的数据结构的关系,如下图:

1、基于 Linux 3.0 数据结构图

2、基于 Linux 4.0 数据结构图

基于 linux-4.0 之后对于 platform & codec driver 均使用 component driver 来定义,其数据结构关系如下图所示:

ASoc 将声卡实现为一个 Platform Device(Machine Driver),然后利用 platform_device 结构中的 dev 字段:dev_set_drvdata(card->dev,card),即指向一个 snd_soc_card 结构。可以认为 snd_soc_card 是整个 ASoc 数据结构的根本,由它开始,引出一系列的数据结构用于表述音频的各个特性和功能。snd_soc_card 结构引出 snc_soc_dai_link 结构,而 snd_soc_dai_link 结构中又根据 cpu_dai_name、codec_dai_name、platform_name(platform_of_node)匹配到相应的 Platform(PCM DMA & CPUDAI)和 Codec DAI. 在 Machine 中会对 num_link 分配 snd_soc_pcm_runtime,将成功匹配的 snd_soc_dai & component 填充到 snd_soc_pcm_runtime,最后将所有的 snd_soc_pcm_runtime 都通过 list 形式 add 到 snd_soc_card->rtd_list 中。

参考链接:
linux-alsa详解4 ASOC介绍

Linux ALSA 之六:ALSA ASoc 架构相关推荐

  1. Linux ALSA声卡驱动之六:ASoC架构中的Machine

    前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...

  2. Linux ALSA声卡驱动之八:ASoC架构中的Platform

    1.  Platform驱动在ASoC中的作用 前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过C ...

  3. Linux ALSA声卡驱动之七:ASoC架构中的Codec

    1.  Codec简介 在移动设备中,Codec的作用可以归结为4种,分别是: 对PCM等信号进行D/A转换,把数字的音频信号转换为模拟信号 对Mic.Linein或者其他输入源的模拟信号进行A/D转 ...

  4. Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介

    ALSA声卡驱动: 1.Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介 2.Linux ALSA声卡驱动之二:Platform 3. Linux ALSA声卡驱动之三:Platf ...

  5. Linux ALSA驱动框架(六)--ASoC架构中的Platfrom

    (1) Platform驱动在ASoC中的作用 ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(D ...

  6. Linux项目设计:ALSA库安装(声卡)、语音识别、文字转语音、语音转文字

    文章目录 一.ALSA库的安装使用 (一)基本概念 (二)交叉编译 ALSA 库及其工具集 (三)ALSA程序模块 二.科大讯飞语音识别 (一)下载语音识别包 (二)文字转语音包使用 (三)语音转文字 ...

  7. 嵌入式linux ASoC架构声卡驱动开发

    嵌入式linux ASoC架构声卡驱动开发 文章目录 嵌入式linux ASoC架构声卡驱动开发 需求分析 ASoC架构下声卡驱动代码结构 codec驱动 snd_soc_register_codec ...

  8. linux内核之alsa,Linux操作系统Alsa音频编程

    一.前序 这里了解一下各个参数的含义以及一些基本概念. 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每 ...

  9. Linux 音频驱动(一) ASoC音频框架简介

    目录 1. ALSA简介 2. ASoC音频驱动构成 3. PCM数据流 4. 数据结构简介 5. ASoC音频驱动注册流程 1. ALSA简介 Native ALSA Application:tin ...

最新文章

  1. pytorch 查看模型参数,查看模型特定层输入输出,模型结构图绘制总结
  2. 基于移动机器人的拣货系统研究进展
  3. 类的构造函数和析构函数详解
  4. 《JavaScript高级程序设计》Chapter 5 引用类型
  5. HTML5 VIDEO标签播放事件流水
  6. LHF Objective-C语法(7)id类型、动态判断与选择器
  7. Java锁的升降级及synchoronized优化
  8. 阶段3 2.Spring_06.Spring的新注解_1 spring的新注解-Configuration和ComponentScan
  9. C# System.DirectoryServices.DirectoryEntry 域用户验证
  10. 华旭 身份证读卡器测试软件_华旭身份证读卡器阅读软件8.0版本 支持免驱
  11. 百度站点Logo权限获取与使用说明
  12. s5p6818 Smart6818 nanopi3开发板,uboot启动linux,配置nfs文件系统,设置bootargs
  13. delphi mysql 删除_Delphi如何清空日志文件
  14. 用友U9V28应用中设置sa密码问题
  15. 实践:手把手教你写滴滴打车 APP
  16. 【阿里内推一面】记我人生中的处女面
  17. RT-Thread Studio 字体放大 缩小快捷键
  18. python小白系列2
  19. RESIZE DATAFILE与ORA-03297
  20. 2021年将新推188部动画,爱优腾加上B站你选谁?

热门文章

  1. 群发邮件很多都进了垃圾箱,怎么办?
  2. CCNA 初学(第二课)
  3. NLP自然语言处理学习
  4. 设计模式学习笔记(C++实现)(七)--适配器模式
  5. 统计学:描述性统计分析
  6. javascript instaceof
  7. 新BOS2.0物流业务逻辑
  8. 2021百度Create大会(暨百度AI开发者大会)
  9. 100000以内的质数表
  10. 【CSS3动画】利用CSS3制作“百度浏览器”官网奔跑的北极熊效果(不含背景移动)