【ASOC全解析(一)】ASOC架构简介和欲解决的问题

【ASOC全解析(一)】ASOC架构简介和欲解决的问题

  • 一、什么是ASOC以及ASOC解决的三个问题
  • 二、ASOC的组成与功能
    • 解决第一个问题
    • 解决第二个问题
    • 解决第三个问题
  • 三、ASOC基本工作原理

/*****************************************************************************************************************/

声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!

创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢

/*****************************************************************************************************************/

一、什么是ASOC以及ASOC解决的三个问题

在没有推出音频框架之前,我们一般用字符型设备驱动来定义设备上的音频设备。但是随着使用场景的多样化和复杂化,用字符型设备驱动模型来定义音频设备出现了很大的局限性,例如:

  • 问题1:编解码器驱动程序通常与底层 SoC CPU 紧密耦合。例如音频有关产品需要音频外设厂商与CPU/SOC厂商紧密合作来完成音频设备驱动
  • 问题2:用户与硬件交互麻烦,例如需要调节喇叭音量则可能要完成相关的驱动程序或者向用户提供API接口,故不同厂商的实现方式都有很大区别
  • 问题3:耗电量高,通过通过节点就直接打开了音频外设(上电),没有尽可能的减少耗电量

如此,音频ASoC(ALSA System on Chip)便诞生了(中间还有用OSS,但后续已经逐渐被ASOC取代了)!ASOC是Linux内核中的一个音频子系统,专门为嵌入式系统上的SoC(System on Chip)音频接口设计。ASoC提供了一种高度模块化和可扩展的方式来处理SoC音频功能

请注意:

1、ASOC是ALSA的一部分,它们之间是包含关系,ALSA包括了ASOC在内所有代码

2、ASOC侧重于与硬件交互的部分,更加偏向底层;ALSA Framework侧重于应用层,主要侧重Linux user层与Kernel层的交互。

二、ASOC的组成与功能

Linux官方描述:

ASoC 层旨在解决这些问题并提供以下功能:-

1.编解码器独立性。允许在其他平台和机器上重用编解码器驱动程序。
2.编解码器和 SoC 之间的简单 I2S/PCM 音频接口设置。每个 SoC 接口和编解码器都会向内核注册其音频接口功能,并在已知应用硬件参数时进行匹配和配置。
3.动态音频电源管理 (DAPM)。DAPM 始终自动将编解码器设置为最低功耗状态。这包括根据内部编解码器音频路由和任何活动流来打开/关闭内部电源模块。
4.减少爆音和咔嗒声。通过以正确的顺序打开/关闭编解码器电源(包括使用数字静音),可以减少爆裂声和咔嗒声。ASoC 向编解码器发出何时更改电源状态的信号。
5.机器特定控制:允许机器向声卡添加控制(例如扬声器放大器的音量控制)。

为了实现这一切,ASoC 基本上将嵌入式音频系统拆分为多个可重复使用的组件驱动程序:-

1.Codec class drivers:codec class driver与平台无关,包含音频控件、音频接口功能、编解码器 DAPM 定义和编解码器 IO 函数。如果需要,此类可扩展到 BT、FM 和 MODEM IC。codec class driver应该是可以在任何体系结构和机器上运行的通用代码。
2.Platform class drivers:平台类驱动程序包括音频 DMA 引擎驱动程序、数字音频接口 (DAI) 驱动程序(例如 I2S、AC97、PCM)以及该平台的任何音频 DSP 驱动程序。
3.Machine class driver:机器驱动程序类充当粘合剂,描述并将其他组件驱动程序绑定在一起以形成 ALSA“声卡设备”。它处理任何机器特定的控制和机器级音频事件(例如在播放开始时打开放大器)。

Linux官方描述还是非常准确和专业的,给它点个赞!

我这边解释一下,

ASOC可以分为三大块,如下图:
在这里插入图片描述

先说一下芯片控制音频外设的基本操作方法:
CPU通过内部总线控制片内外设(I2S、PCM等等),然后片内外设再去控制音频外设,其中片内外设会根据音频外设厂商给出的方法按照一定的顺序去读取或者发送相关音频数据

理解一下这三大块:

  1. Codec:指的是音频编解码IC的代码,这部分代码通常就是音频编解码厂商需要提供,这部分代码会告知片内外设要以何种时序去读取或者发送数据。
  2. Platform:指的是平台端的代码,也就是CPU端和片内外设的初始化
  3. Machine:指的是中间层,会连接codec和machine。例如设备支持多个Codec,你现在想用某个codec就在这里指定。或者你有一个codec,想在某个平台用,也在machine中指定。

解决第一个问题

根据上图的ASOC宽假,我们便可以解决了第一个问题(问题1:编解码器驱动程序通常与底层 SoC CPU 紧密耦合)。在这种逻辑下:

CPU/SOC厂商就只关注platform的代码

外设音频编解码器厂商只关注codec代码

生产厂商就只关注Machine层,将某个CPU/SOC 与 音频外设连接便可。

但是通常情况下,这三部分人员都需要互相懂对方,以方便大家沟通。

解决第二个问题

ASOC提供了如下的测量解决第二个问题(用户与硬件交互麻烦):

机器特定控制:允许机器向声卡添加控制(例如扬声器放大器的音量控制)。

描述一下,ASOC主要提供了一种方法供使用者选择,这种方法是ASOC Common的,如果使用这种方法,那么就会让用户更加便捷控制,并且由于是ALSA提供的,其安全性和可靠性更加优秀。

此处,ASoC提供了一套标准化的控制接口指的是kcontrols,这些控制接口允许用户空间的应用程序通过标准的ALSA控制接口与音频硬件进行交互。这些控制接口可以用来调节音量、切换音频路径、控制音效等。

解决第三个问题

ASOC提供了下面的方法来解决第三个问题(耗电量高):

3.动态音频电源管理 (DAPM)。DAPM 始终自动将编解码器设置为最低功耗状态。这包括根据内部编解码器音频路由和任何活动流来打开/关闭内部电源模块。

Linux官方说的是一个总结性的内容,具体来讲它省电的方法在于:

打开节点的时候,音频的设备不一定会上电,并且当你设置kcontrols给音频硬件上电的时候,硬件也不一定上电了。设备要有数据传输(有数据传输便意味着硬件已经打开,由先open后write/read的软件流程决定)且kcontrols设置上电才会真正的去给硬件上电

如此便可以解决上电但没有使用造成的电量空损耗的问题了。

三、ASOC基本工作原理

其基本的原理是:

在ASOC框架下,

主控IC厂商将其IC特有的操作封装成一系列的标准ASOC接口函数提供给ASOC;

而编解码厂商则会在codec侧将其音频IC的特定操作封装成一系列的标准ASOC接口函数提供给ASOC。

产品厂商在machine层会整合主控IC和编解码IC的内容。

最后在实际录音或者播放的时候,ASOC会按照一定的顺序去调用这两组ops,例如执行open的时候,就会先去调用Platform层的ops去初始化CPU侧的环境,为codec的使用提供环境,再去调用codec端的ops完成特定的外设的初始化。

下图展现其基本的原理:

在这里插入图片描述

指的注意的是codec的ops是不一定与platform的ops对应,其是两种ops,这两种ops会由ASOC统一去管理与调用,以完成指定的动作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Parade Series - Android Studio

硬件支持 CPU i7 RAM 16Gb -------------- ------- Java 3Gb Android 33GbJava Enviroment C:\ ├─ Java │ ├─ jdk1.8.0_181 │ ├─ jre1.8.0_181 │ ├─ maven-3.8.5 │ └─ gradle-6.5 └─ Cache├─ gr…

基于中文垃圾短信数据集的经典文本分类算法实现

垃圾短信的泛滥给人们的日常生活带来了严重干扰,其中诈骗短信更是威胁到人们的信息与财产安全。因此,研究如何构建一种自动拦截过滤垃圾短信的机制有较强的实际应用价值。本文基于中文垃圾短信数据集,分别对比了朴素贝叶斯、逻辑回归、随机森…

哈希--73. 矩阵置零/medium 理解度A

73. 矩阵置零 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,…

Overleaf(LaTeX文档在线编写平台)使用学习记录

一、LaTeX简概[1] LaTeX,是一种基于TEX的排版系统,是一种可以处理排版和渲染的标记语言。由美国计算机科学家莱斯利兰伯特在20世纪80年代初期开发,利用这种格式系统的处理,即使用户没有排版和程序设计的知识也可以充分发挥由TEX所…

CACTER邮件安全网关独家安全解决方案——保障企业邮件系统安全

随着科技的不断发展,网络攻击技术也在不断演变,尤其是在电子邮件领域,各种高级变种威胁层出不穷,比如定制化的钓鱼邮件和带有高级恶意软件的邮件等。这些威胁邮件往往能够绕过传统的安全防护措施,包括反垃圾邮件、反钓…

软件安全测试的重要性简析,专业安全测试报告如何申请?

在当今数字化时代,软件在我们的日常生活中扮演着至关重要的角色,但也带来了各种潜在的安全威胁。为了保障用户的信息安全和维护软件的可靠性,软件安全测试显得尤为重要。 软件安全测试是指通过一系列的方法和技术,对软件系统中的…

pikachu_csrf通关攻略

csrf(get) 打开pikachu靶场: 1. 根据提示给的账户密码进行登录 2. 打开代理拦截数据包将拦截数据发送到已打开的burp中: 修改数据进行发包: 从上面的url可见,修改用户信息的时候,是不带任何不…

性能优化(CPU优化技术)-NEON指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 NEON 指令相关的知识,首先通过讲解 arm 指令集的分类,NEON寄存器的类型,树立基本概念。然后进一步梳理了 NEON 汇编以及 intrinsics 指令的格式。最后结合指令的分类,使用例…

如何基于 ESP32 芯片测试 WiFi 连接距离、获取连接的 AP 信号强度(RSSI)以及 WiFi吞吐测试

测试说明: 测试 WiFi 连接距离,是将 ESP32 作为 WiFi Station 模式来连接路由器,通过在开阔环境下进行拉距来测试。另外,可以通过增大 WiFi TX Power 来增大连接距离。 获取连接的 AP 信号强度,一般可以通过 WiFi 扫描…

机器学习_从线性回归到逻辑回归原理和实战

文章目录 介绍分类问题用线性回归阶跃函数完成分类通过 Sigmiod 函数进行转换逻辑回归的假设函数逻辑回归的损失函数用逻辑回归解决二元分类问题 介绍分类问题 机器学习两个主要应用是回归和分类问题。 逻辑回归算法的本质其实仍然是回归。这个算法也是通过调整权重w和偏置b来…

GBASE南大通用提供给.NET 应用程序访问 GBase 数据库、获取数据、管理数据的一套完整的解决方案

GBase ADO.NET(全称是 .NET Framework Data Provider For GBase)提 供给.NET 应用程序访问 GBase 数据库、获取数据、管理数据的一套完整的解决 方案。 GBase ADO.NET 的四个核心类及若干功能类具有以下功能:  建立和管理与 GBase 数据库连…

java web mvc-04-Apache Wicket

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

21.云原生之ArgoCD CICD实战(部分待补充)

云原生专栏大纲 文章目录 部署项目介绍项目结构介绍GitLab CI/CDGitLab CI/CD主要特点和功能 部署测试argocd的cd过程CICD工作流准备工作github中工作流文件创建gitlab中工作流文件创建【实操待补充】GitLab CI示例 数据加密之seale sealedBitnami Sealed Secrets介绍Bitnami …

11.前端--CSS-背景属性

1.背景颜色 样式名称: background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明: 元素背景颜色默认值是 transparent(透明)      background-color:transparent; 代码演示: 背景色…

盖子的c++小课堂:第二十六讲:双向链表

前言 谢谢各位粉丝的支持,望我早日突破1000粉 双向链表 干货!单链表从原理到实现——附python和C++两个版本 - 知乎单链表是链表家族中的一员,每个节点依旧由 数据域(data)和指针域(next)组成,链表的具体概念下面有介绍: 机器学习入坑者:程序员基本功——链表的基…

大数据学习之Flink算子、了解(Source)源算子(基础篇二)

Source源算子(基础篇二) 目录 Source源算子(基础篇二) 二、源算子(source) 1. 准备工作 2.从集合中读取数据 可以使用代码中的fromCollection()方法直接读取列表 也可以使用代码中的fromElements()方…

“探索C语言操作符的神秘世界:从入门到精通的全方位解析“

各位少年,我是博主那一脸阳光,今天来分享深度解析C语言操作符,C语言操作符能帮我们解决很多逻辑性的问题,减少很多代码量,就好比数学的各种符号,我们现在深度解剖一下他们。 前言 在追求爱情的道路上&…

Google ASPIRE框架:赋予大型语言模型(LLMs)自我评估的新动力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue生命周期;综合案例;工程化开发入门

Vue的生命周期 和 生命周期的四个阶段 思考: 什么时候可以发送初始化渲染请求?(越早越好:最早可以早到什么时候?) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命…

【C++】C++入门(一)

个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. C关键字3. 命名空间3.1 命名空间定义3.2 命名空间的使用 4. C输入&输出 1. 前言 C是在C的基础之上,容纳进去了面向对象编程思想&#xff0…