Linux ALSA 之六:ALSA ASoc 架构

news2025/3/1 9:56:49

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介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件著作权申请注意事项

​软著申请需要哪些材料 ①企业申请:企业营业执照副本复印件(加盖公章)、身份证复印件(正反面)。 个人申请:个人身份证复印件。 ②软件设计/使用说明书文档一份 文档可根据要求提供,可以是软件…

c#使用配置文件

在我们开发软件的时候,有时候有很多的配置文件,可以把配置的参数保存到本地,那么肯定要对文件进行读和写的操作,使用SharpConfig可以很简单的实现这个功能。 下面是GitHub的介绍。 https://codeload.github.com/cemdervis/Sharp…

常见的锁策略

文章目录一、常见的锁策略乐观锁 vs 悲观锁轻量级锁 vs 重量级锁自旋锁 vs 挂起等待锁互斥锁 vs 读写锁公平锁 vs 非公平锁可重入锁 vs 不可重入锁二、CAS原子类实现自旋锁ABA问题一、常见的锁策略 我们这里所介绍到的锁策略,不仅仅是java中的,任何涉及…

异常检测-缺陷检测-论文精读PaDiM

Abstract 我们提出了一个新的 Patch 分布建模框架,在单类学习的设置下,PaDiM 同时检测和定位图像中的异常。PaDiM 利用一个预先训练好的卷积神经网络 (CNN) 进行 patch 嵌入,利用多元高斯分布得到正常类的概率表示。它还利用了 CNN 的不同语…

基础1-用于癫痫发作预测的卷积门控递归神经网络

A Convolutional Gated Recurrent Neural Network for Epileptic Seizure Prediction ABSTRACT 在本文中,我们提出了一种卷积门控递归神经网络(CGRNN)来预测癫痫发作,基于从EEG数据中提取的代表信号的时间方面和频率方面的特征。使用波士顿儿童医院收集…

priority_queue的介绍及使用(18)

目录 1、priority_queue的介绍 2、priority_queue的使用 3、priority_queue的模拟实现 1、简单实现一个大堆的 2、带仿函数的 1、初识仿函数 2、priority_queue带仿函数版本 3、其他 1、priority_queue的介绍 1、优先队列是一种容器适配器,根据严格的弱排序…

Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)

Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏。 较为常见的物理处理是在跳跃之后再次落到地上,并没有…

百万级数据的导出解决方案

一、传统POI的的版本优缺点比较首先我们知道POI中我们最熟悉的莫过于WorkBook这样一个接口,我们的POI版本也在更新的同时对这个几口的实现类做了更新;HSSFWorkbook : 这个实现类是我们早期使用最多的对象,它可以操作Excel2003以前&#xff08…

SAP 系统内核版本详解

前言:之前两篇简单介绍了ABAP 7.40的新特性,那么有的时候会有这样的情况,根据新特性写代码的时候校验会不通过,这又是为啥呢?会不会跟SAP的版本有关系呢? 那么,首先我们就来看一下在SAP系统中如…

基于TC397的Bootloader开发过程中遇到的问题记录

问题11 现象:刷新流程结束之后上位机通过22服务AFFC读取刷新计数时,刷新计数会偶发地置12 分析思路:尝试用单步调试的方法复现该现象,程序中涉及到刷新计数的更新有两处,一是在34服务中擦flash前,二是在31服…

【数据结构】栈及其经典面试题详解

目录前言一、栈的介绍二、数据类型重定义三、栈的结构四、栈中的常见操作五、测试栈六、栈的常见面试题前言 前面学习的线性表中包含顺序表和链表,这两种数据结构允许在任意位置进行插入和删除,那么有没有一种数据结构是不能在任意位置进行插入删除&…

全面解读MinION纳米孔测序技术及应用

全面解读MinION纳米孔测序技术及应用 link:https://www.seqchina.cn/467.html 【测序中国】 paper:The Oxford Nanopore MinION: delivery of nanopore sequencing to the genomics community https://pubmed.ncbi.nlm.nih.gov/27887629/ 纳米孔测序技术…

知识蒸馏 Knowledge distillation(学习笔记)

知识蒸馏概述 蒸馏:把大的 复杂的东西变成小的纯净的东西 在知识蒸馏中 大的模型为 教师模型(teacher)臃肿 集成 牛逼 复杂的 小的 为 学生模型(student)小的精干的 轻量化的 这里有一个知识的迁移 因为落地实…

相关性模型与回归模型(例题代码)

一、相关性模型(SPSS) 相关性模型涉及到两种最为常用的相关系数: 皮尔逊person相关系数斯皮尔曼spearman等级相关系数 1、皮尔逊相关系数 相关性可视化 总结: 1.如果两个变量本身就是线性的关系,那么皮尔逊相关系…

儿子小伟再婚,新儿媳紧锁眉头,农民歌唱家大衣哥有些过分了

虽然都知道大衣哥儿子小伟结婚,这一天早晚都要到来,但是却没有想到来得那么快,大衣哥儿子小伟的婚礼,在悄无声息中结束了。说起大衣哥儿子小伟,这已经不是第一次结婚了,因为结过婚有经验,这一次…

Linux CFS调度器之pick_next_task函数

文章目录前言一、pick_next_task二、pick_next_task_fair参考资料前言 在内核执行__schedule函数,进程任务切换的时候,__schedule函数函数会调用pick_next_task让调度器从就绪队列中选择最合适的一个进程运行,如下所示: static …

Nerdctl 原生支持 Nydus 加速镜像

文|李楠(GitHub ID : loheagn) 北京航空航天大学 21 级研究生 云原生底层系统的开发和探索工作。 本文 6369 字 阅读 16 分钟 OSPP 开源之夏是由中科院软件研究所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动。旨在鼓励在…

关于whl,你想知道的

一、whl是什么?whl文件时以wheel格式保存的python安装包,Wheel是Python发行版的标准内置包格式。WHL文件包含Python安装的所有文件和元数据,其中还包括所使用的Wheel版本和打包的规范。WHL文件使用Zip压缩进行压缩,实际上也是一种…

二、TCO/IP---Ethernet和IP协议

TCP/ip协议栈 OSI模型TCP/IP协议栈应用层,表示层,会话层应用层传输层主机到主机层(传输层)网络层网络层数据链路层,物理层网络接入层 Ethernet协议 以太网,实现链路层的数据传输和地址封装(MA…

【Qt】Qt中的拖放操作实现——拖放文件以及自定义拖放操作

文章目录Qt的拖放操作使用拖放打开文件自定义拖放操作文章参考《Qt Creator快速入门(第三版)》。 Qt的拖放操作 拖放操作分为拖动Drag和放下Drop,Qt提供了强大的拖放机制,可在帮助文档中通过Drag and Drop关键字查看。 在Qt中&a…