ASOC系统简析

news2025/7/11 13:28:02

一 嵌入式音频系统介绍

在这里插入图片描述

上图是音频系统的硬件模拟图,声卡通过I2S接口与cpu进行音频数据传输,通过I2C接口与cpu进行控制通讯。
录音数据通路:麦克风---->声卡------I2S------>DMA---->内存;
播放数据通路:内存------->DMA-----I2S------>声卡----->扬声器;

注意:
可以推测 cpu部分的代码包括DMA控制器部分 和 I2S控制器接口 两个部分的代码;
声卡部分的代码包括声卡寄存器控制(I2C)和 I2S接口数据传输 两个部分的代码;

根据上图 信息,可以很容易的理解在嵌入式设备的音频系统(ASoC)所抽象出来的三部分:

Machine 理解为板载硬件如开发板
Platform 理解为 CPU
Codec 声卡

在这里插入图片描述

在ASoC软件中 cpu部分称作platform,声卡部分被称作codec,两者通过machine进行匹配连接;machine可以理解为对开发板的抽象。

二 ASOC 驱动

ASoC(Alsa System on Chip),称为移动设备中的ALSA。是建立在标准ALSA驱动层上,将声卡和cpu两部分的控制代码分离开来,更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。ASoC不能单独存在,他只是建立在标准ALSA驱动上的一个它必须和标准的ALSA驱动框架相结合才能工作。
 
对应于硬件,软件驱动上也分Machine驱动、Platform驱动、Codec驱动三大部分,其中Platform驱动用于驱动Soc端的音频相关模块,Codec驱动用于驱动音频编解码器,Machine驱动负责Platform驱动和Codec驱动之间的耦合以及部分和设备或板子特定的代码。

Platform驱动:

只与特定的Soc有关,实现Soc的音频DMA驱动和Soc端的dai接口驱动,注册的所有platform驱动都会挂载在全局platform_list链表上。注册的Soc端的cpu_dai接口驱动挂载在全局dai_list上。只要指定了SoC,就会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。

单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。Platform驱动向ASoC注册snd_soc_platform和snd_soc_dai设备

Codec驱动:

只与Codec编解码器驱动有关,与Soc和Machine无关。所有注册的Codec驱动都会挂载在全局codec_list链表上,注册的Codec端的dai接口驱动挂载在全局dai_list上。Codec和Platform一样,要实现为可重用的部件,同一个Codec可以被不同的Machine使用。嵌入式Codec驱动通常通过I2C对编解码芯片进行控制。

Machine驱动:

驱动主要是针对设备的,实现Codec和Platform耦合,Machine驱动是实现板级上的Codec 和SoC中间的桥梁。描述两者如何连接。一般的板卡设计者只需要实现这部分的驱动。Machine驱动的开发主要工作是向内核注册一个snd_soc_card声卡实体。

具体工作将Platform驱动和Codec驱动关联在一起,通过snd_soc_dai_link中的名字指定使用哪个Platform驱动,使用哪个Soc端的dai接口,使用哪个Codec驱动,使用Codec上的哪个dai接口。同时也做一些特定于单板的操作。只要是与Soc和Codec驱动无关的操作,都应该放在Machine驱动中。Machine驱动中注册的and_codec_card放在全局card_list链表上。ASoC的一切都从Machine驱动开始,包括声卡的注册,绑定Platform和Codec驱动等等。

注意:

涉及的三个驱动中涉及的全局链表

soc-core.c中

struct list_head card_list;     /*Machine驱动注册的snd_codec_card放在这个链表上*/
struct list_head dai_list;         /*soundsocsamsungI2s.c中使用snd_soc_register_dai注册的cpu_dai会放在这上面,codec中注册的codec端的dai也会挂在这上面*/
struct list_head platform_list; /*注册的Soc的platform驱动在这个链表上*/
struct list_head codec_list;     /*音频编解码芯片驱动注册的codec挂载在这个链表上*/

snd_soc_card代表着Machine驱动
snd_soc_platform则代表着Platform驱动
snd_soc_codec则代表了Codec驱动
而snd_soc_dai_link则负责连接Platform和Codec。

snd_soc_dai是snd_soc_platform和snd_soc_codec的数字音频接口。
snd_soc_codec的dai是codec_dai
snd_soc_platform的dai为cpu_dai,
snd_pcm是snd_soc_card实例化后注册的声卡类型.

注意 snd_soc_dai_link结构就指明了该Machine所使用的Platform和Codec。在Codec这边通过codec_dai和Platform侧的cpu_dai相互通信,既然相互通信,就需要遵守一定的规则,其中codec_dai和cpu_dai统一抽象为struct snd_soc_dai结构,而将dai的相关操作使用snd_soc_dai_driver抽象。同时也需要对所有的codec设备进行抽象封装,linux使用snd_soc_codec进行所有codec设备的抽象,而将codec的驱动抽象为snd_soc_codec_driver结构。

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

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

相关文章

HaaS EDU物联网项目实战:野外救援项目

HaaS EDU K1是一款高颜值、高性能、高集成度的物联网开发板,板载功能强大的4核(双核300Mhz M33双核1GHz A7)主芯片,2.4G/5G双频Wi-Fi,双模蓝牙(经典蓝牙/BLE),并自带丰富的传感器与小…

Exception in thread “main“ java.lang.NoClassDefFoundError

项目场景: 验证继承情况下子类创建对象时,先调用父类的构造方法,再调用子类的构造方法 问题描述 随机(不同次数的测试下)会产生Exception in thread "main" java.lang.NoClassDefFoundError错误 package e…

Pandas 详解

本文主要介绍python 数据分析模块 Pandas,并试图对其进行一个详尽的介绍。 通过阅读本文,你可以: 掌握 Anaconda 环境的安装及使用了解什么是 Pandas掌握 Series 对象基本操作掌握 DataFrame 对象的基本操作掌握缺值处理掌握 Series 对象和 D…

计算机今年炸了?现在还适合入行吗?

恍惚之间,一年已来到了尾声,对于应届生来说,这是不堪回首的一年,一个字,难。 不但冷门专业就业困难,就连过去的宇宙机专业,也不复盛况,相较于往年的火热,今年的计算机行…

ES6的相关知识点

一:var let const let var区别: 1.let没有变量提升(预解析)我们先定义再使用,Var可以先使用再定义因为他有预解析,var有声明提升>先上车后买票, 2.let不能在同一个作用域中重复定义变量,如…

使用docker容器部署httpd(绝对可用)

众所周知,httpd是一个服务,里面有很多配置要改,通过dockerfile编写很复杂,所以这里,我们【采用进入容器内修改的方式,去生成一个新的httpd容器】 httpd我们平常用yum安装,所以一定要最好是自带…

【小程序】全局配置window和tabBar

目录 全局配置 1. 全局配置文件及常用的配置项 全局配置 - window 1. 小程序窗口的组成部分 2. 了解 window 节点常用的配置项 ​编辑 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 …

Hibernate-Validator(数据校验框架)

目录一、Hibernate-Validator 简介二、项目中为什么要用校验框架三、添加依赖四、看一个入门级案例五、常用注解六、使用groups的校验一、Hibernate-Validator 简介 hibernate-validator是Hibernate项目中的一个数据校验框架,它能够将数据校验从业务代码中脱离出来…

-防火墙-

数据来源 一、防火墙的基本概念 防火墙的定义:是一款具备安全防护功能网络设备 ◆ 隔离网络 将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护 防火墙基本功能: ◆ 访问控制 - ACL ◆ 攻击防护 ◆ 冗余设计 ◆ 路由、交…

基于XMC4800 Ethercat从站的工厂自动化解决方案

背景 随着“工业4.0”与“工业互联网”概念的提出,“互联网制造”的概念被大众所熟知,人们称之为第四次工业革命。在这样的背景下,新的工业自动化孕育而生。智能工厂、提供智能工厂设计与实施的工业4.0解决方案商、技术供应商相继出现。ARRO…

Android---Banner轮播图

轮播图是一种很常见的UI。Banner框架能够帮助我们快速开发,完成首页轮播图效果的需求。 1、导入Banner依赖 implementation io.github.youth5201314:banner:2.2.2 2、activity_main.xml布局。 banner_loop_time: 设置轮播间隔时间,默认3000&#xff…

逆天了!用Numpy开发深度学习框架,透视神经网络训练过程

哈喽,大家好。 今天给大家分享一个非常牛逼的开源项目,用Numpy开发了一个深度学习框架,语法与 Pytorch 基本一致。 今天以一个简单的卷积神经网络为例,分析神经网络训练过程中,涉及的前向传播、反向传播、参数优化等核…

制作圣诞帽其实特简单(附 Python 代码)

圣诞将至,虽然咱不过这洋节,但是热闹还是要凑一下的,相信已经有很多圣诞帽相关的周边在流传了,今天咱们就自己动手,给头像增加一个圣诞帽。 文章目录基础知识准备数字图像图像通道ROI和mask矩阵(Numpy&…

BaseAdapter实现的投票案例

BaseAdapter实现的投票案例 1.知识补充 android:descendantFocusability"blocksDescendants",关键是让谁先去获取焦点beforeDescendants:viewgroup会优先其子类控件而获取到焦点afterDescendants:viewgroup只有当其子类控件不需要获…

Flink Process Function

处理函数: ProcessFunction: 含有状态流的特性 处理函数面对的是数据流中的最基本元素: 数据事件 event, 状态 state, 时间 time 文章目录1.基本处理函数 ProcessFunction1.1 处理函数的功能和使用1.2 ProcessFunction 解析2.处理函数的分类2.1 按键分区处理函数 KeyedProces…

LaTex期刊模板下载与使用

1 LaTex期刊模板下载与使用 接上文介绍了LaTex的下载安装和基本语法使用规则。 上文地址:科研人快速入门LaTex到日常使用,下载安装配置,语法使用说明等 一般来说,LaTeX主要用在论文提交,书籍排版过程中,提…

Kubernetes:Pod

文章目录1、Pod 定义2、Pod 使用2.1、init 容器2.2、容器生命周期处理函数2.3、容器的探测2.3.1、探测机制2.3.2、探测结果2.3.3、探测类型startupProbereadinessProbelivenessProbe2.3.4、案例2.4、测试代码3、Pod 的部署3.1、Deployment3.2、DaemonSets3.3、静态 pod4、参考p…

我国金属包装行业企业数量下降 经济效益整体表现不佳 但亏损额减少

根据观研报告网发布的《中国金属包装市场发展趋势研究与未来投资预测报告(2022-2029年)》显示,金属包装是指采用金属薄板,针对不同用途制作的各种不同形式的薄壁包装容器,相较于其它包装,金属包装因为其材质特性,比一般…

3DEXPERIENCE平台2023新功能揭秘!Governance云端数据管理解决方案

3DEXPERIENCE平台更新版本已经与大家见面,今天众联亿诚与大家分享Governance新功能。 多年来,我们一直在寻找SOLIDWORKS数据管理的更优解决方案。但就是感觉很艰难,硬件投资是昂贵的,实施是资源密集型的,更重要的是&a…

【TypeScript】TS入门(一)

🐱个人主页:不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏&#xff…