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

news2024/11/23 20:06:40

【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统一去管理与调用,以完成指定的动作。

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

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

相关文章

使用Sobel算子把视频转换为只剩边缘部分

效果展示 原始视频 修改后的视频 整体代码 import cv2vc cv2.VideoCapture(test.mp4)if vc.isOpened():open, frame vc.read() else:open Falsei 0 while open:ret, frame vc.read()if frame is None:breakif ret True:i 1# 转换为灰度图gray cv2.cvtColor(frame, cv…

RabbitMQ进阶篇【理解➕应用】

🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 一.什么是交换机 1.概念释义 2.例…

聚观早报 | 苹果将开放第三方NFC支付;华为P70系列参数曝光

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 1月23日消息 苹果将开放第三方NFC支付 华为P70系列参数曝光 Celestiq已正式开始量产 岚图汽车官宣与华为合作 美…

LLM + RecSys 初体验(上)

最近在逛小红书的时候,发现了一个新的GPU算力租赁平台,与AutoDL和恒源云等平台类似。正巧,官网有活动,注册即送RTX 4090三个小时,CPU 5 小时。正巧最近在测试 LLM推荐系统的 OpenP5 平台,果断入手测试! 用…

力扣精选算法100道——x的平方根(二分查找专题)

x的平方根 首先看到这个题目的时候,我们需要对上一个二分查找专题的题目进行深度理解,然后了解模板,这题是完全利用的上一题的模板知识进行,如果直接看这个题目可能是有点懵的,因为我这里直接利用模板进行解题。力扣…

nexus清理docker私库

下载nexus-cli客户端,并非必须下载到服务器,理论上只要能访问到nexus就行 wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli这个链接下载不了了,末尾有资源下载,里面包含了完整包和脚本&#xff0…

Mysql主从复制、读写分离、分库分表

大数据处理 1.主从复制1.1 概述1.2 原理1.3 搭建 1.主从复制 主从复制 1.1 概述 主从复制指: 将主数据库的DDL和DML操作通过二进制日志传递到从库服务器中, 然后从库根据日志重新执行(也叫重做), 从而使从库和主库的数据保存同步 MYSQL支持一台主库同时向多台从库进行复制,…

Kafka-服务端-KafkaController

Broker能够处理来自KafkaController的LeaderAndIsrRequest、StopReplicaRequest、UpdateMetadataRequest等请求。 在Kafka集群的多个Broker中,有一个Broker会被选举为Controller Leader,负责管理整个集群中所有的分区和副本的状态。 例如:当某分区的Le…

解密.dataru被困的数据:如何应对.dataru勒索病毒威胁

导言: 在数字时代,勒索病毒如.dataru正在不断演变,威胁着用户的数据安全。本文91数据恢复将深入介绍.dataru勒索病毒的特点、被加密数据的恢复方法,以及预防措施,帮助您更好地了解并对抗这一数字威胁。当面对被勒索病…

Armv8-M的TrustZone技术之SAU寄存器总结

每个SAU寄存器是32位宽。下表显示了SAU寄存器概要。 5.1 SAU_CTRL register SAU_CTRL寄存器的特征如下图和表所示: 5.2 SAU_TYPE register 5.3 SAU_RNR register 5.4 SAU_RBAR register 5.5 SAU_RLAR register 5.6 SAU区域配置 当SAU启用时,未由已启用…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧,本文将帮助大家零门槛的实现模型在多个GPU的并行训练,如果你手头上没有GPU资源,根据本文的介绍也可实现…

Redis应用(1)缓存(1.2)------Redis三种缓存问题

三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了。 一、 缓存穿透: 1、定义: 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。…

C++面试宝典第24题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米;如果为0,就会陷进去无法…

《WebKit 技术内幕》学习之十一(3):多媒体

3 音频 3.1 音频元素 说完视频之后,接下来就是HTML5中对音频的支持情况。音频支持不仅指对声音的播放,还包括对音频的编辑和合成,以及对乐器数字接口(MIDI)等的支持,下面逐次介绍并分析它们。 3.1.1 H…

更改wpf原始默认按钮的样式

样式 代码 <Window x:Class"WpfApp4.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008…

【linux】Debian挂起和休眠

一、挂起和休眠 在Debian桌面系统中&#xff0c;挂起和休眠是两种不同的状态&#xff0c;它们之间有一些区别。 挂起&#xff08;Suspend&#xff09;是将当前系统的状态保存到RAM&#xff08;内存&#xff09;中&#xff0c;然后关闭所有硬件设备&#xff0c;除了RAM之外。在…

详细分析Java中的list.foreach()和list.stream().foreach()

目录 前言1. 基本知识2. 差异之处2.1 执行顺序2.2 串行并行2.3 复杂数据处理2.4 CRUD集合2.5 迭代器 3. 总结4. 彩蛋 前言 典故来源于项目中使用了两种方式的foreach&#xff0c;后面尝试体验下有何区别&#xff01; 先看代码示例&#xff1a; 使用List的forEach&#xff1a…

风丘车辆热管理测试方案

车辆热管理是在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生的。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统&#xff1b;控制和优化车辆的热量传递过程&#xff0c;保证各关键部件和系统安全高效运行&…

麒麟系统—— openKylin 安装到虚拟机以及开放SSH通过工具连接

麒麟系统—— openKylin 安装到虚拟机以及开放SSH通过工具连接 1. 在VMware中安装openKylin麒麟系统步骤1&#xff1a;准备VMware环境步骤2&#xff1a;创建新的虚拟机步骤3&#xff1a;安装openKylin麒麟系统步骤4&#xff1a;调整分别率步骤5&#xff1a;安装SSH 2. 使用Open…

安卓自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局&#xff1a; 我们只需要替换根布局所需的自动缩放&#xff0c;子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout&#xff08;框架布局&#xff…