ALSA 和 SOC+codec 整体架构

ASoC驱动框架简介 简介 ASoC框架是一种linux系统声卡驱动框架,是针对嵌入式设备在linux alsa声卡驱动框架基础上进行了一层封装,意在将声卡和cpu两部分的控制代码分离开来; 如上图是音频系统的硬件示意图,声卡通过I2S接口与cpu进行音频数据传输,通过I2C接口与cpu进行控制通讯(数据接口和控制接口也可以是其他); 录音数据通路:麦克风---->声卡–(I2S)->DMA---->内存; 播放数据通路:内存---->DMA–(I2S)->声卡---->扬声器; 如图所.. 阅读详情

一、简介

整个Alsa体系分为用户空间和内核空间两部分,实现了很多强大的功能。从驱动开发的角度来看,基本只需要把注意力集中在跟硬件相关的部分就可以了。其它内容是Alsa体系维护者的事情。

在内核中,Alsa为不同的类型的硬件分别提供了不同的封装形式,这里仅介绍主框架(不同类型硬件的实现就是对主框架的封装)和SOC框架。

二、主框架

1、基本概念

  • 帧(frame):全部声道采样一次所得到的数据。以16位立体声来说,一帧的大小是2(声道) * 16(位/采样点) / 8(位/字节)=  4 (字节)。
  • 片断(period):数据块,一般对应于一次中断所处理的数据。
  • 子码流(snd_pcm_substream):通常对应回放(playback)或录音(record)。
  • 码流(snd_pcm):可以包含很多子码流,但通常只是一个回放,一个录音。
  • 控制(snd_kcontrol):通常用于音量调整等作用。
  • 声卡(snd_card): 等同于硬件声卡的概念,它包含了码流及控制方面的信息。
  • 回调函数(snd_pcm_ops):一个子码流在运行过程中所需要进行处理。
  • 运行时参数(snd_pcm_runtime):保存运行过程中(指hw_params回调和hw_free回调之间)中的相关参数,如缓冲区(包括大小,位置,帧大小,片断大小)、通道数,采样精度,采样频率等。
  • 硬件能力参数(snd_pcm_hardware):子码流硬件能力方面的相关参数,如所能支持的采样频率、采样精度,通道数量,缓冲大小等。

 

2、初始化

(1)、创建一块声卡(snd_card),调用snd_card_new,然后向该声卡中添加相关的码流和控制。

(2)、添加码流(snd_pcm),调用snd_pcm_new,注册码流回调函数(snd_pcm_ops)(回放和录音的回调函数是分别注册的),为码流预分配缓冲区,可以使用snd_pcm_lib_preallocate_pages_for_all,该函数会为所有子码流独立预分配缓冲区。

(3)、添加控制,就是调用snd_ctl_add注册snd_kcontrol_new数据结构。

(4)、注册该声卡,调用snd_card_register,成功后,该声卡的alsa驱动就可用了。

(5)、卸载声卡时,调用snd_card_free,alsa会自动删除码流(snd_pcm),控制(snd_kcontrol)和声卡(snd_card)。

 

3、运行

在运行过程中,Alsa会调用码流中注册的回调函数,这些回调函数使用的主要参数是子码流(snd_pcm_substream),及运行时参数(snd_pcm_runtime)。

可以通过substream->stream的值来区分是回放还是录音。

除pointer回调外,其它回调都是通过返回0表示成功,非0表示失败。

中断服务程序需要调用snd_pcm_period_elapsed函数,其作用相当于通知缓冲区空闲(对应回放)或者有效(对应录音)。

 

(1)、打开子码码流,对应回调函数中的open。该函数最主要的工作向运行时参数(snd_pcm_runtime)提供该子码流的硬件能力(snd_pcm_hardware),比如所能支持的采样率,采样精度等,通道数,缓冲区大小等。

(2)、设置参数,对应回调函数中的hw_params,在该函数内,所有目标参数如采样率、采样精度,通道数,缓冲区总大小等都有效,要求按照这些参数来配置硬件,分配缓冲区(当然也可以只记录下相关硬件参数,等到perpare时才进行实际配置,但其实没有必要)。实际缓冲区分配可以调用snd_pcm_lib_malloc_pages函数。在该函数被调用之后,运行时配置(snd_pcm_runtime)中的相关参数值才有效。

(3)、运行前准备,对应回调函数中的prepare,意味着该函数调用后,所有设置都已经就绪。

(4)、启动、停止,对应回调函数trigger,该函数的命令参数(cmd)表明是启动、停止、暂停、挂起还是恢复等。

(5)、读写位置反馈,对回调函数pointer,该函数返回数据的当前读取位置(对应回放)或数据的当前写入位置(对应录音),该位置是反复回绕的(环形缓冲区的用法)。

(6)、停止后清理,对应回调函数hw_free,在该函数中可以释放分配的缓冲区,可以调用snd_pcm_lib_free_pages函数。

(7)、关闭,对应回调函数close。

补充:

(8)、ioctl回调,目前的alsa版本(1.0.18a),要求必须给该回调赋值,其值可以使用snd_pcm_lib_ioctl函数。

(9)、ack回调,当alsa把数据写入缓冲区或从缓冲区读走后,会回调该函数,用于特殊的维护操作。

 

4、说明

(1)、正常的回调流程:

其中pointer会在start和stop之间被反复调用。

解释:用户通过open打开子码流并获得该子码流的能力参数,从而确定出一套可用的参数。调用hw_params设置这些参数。调用prepare进球最后的准备工作,比如清除fifo。调用trigger启动或停止工作。通过pointer了解工作进展。工作停止后,调用hw_free释放资源,使用close关闭子码流。

(2)、目前的android会出现open --> hw_free --> close过程,用于处理音量设置等控制(因此在hw_freek 需要检查所需释放的资源是否有效)。

(3)、在alsa体系内,数据的度量单位基本都是帧(frame)。

(4)、硬件实际操作可以灵活地嵌在相关步骤中。

 

三、SOC框架

这种框架主要用于I2S接口,其特点是两个独立的芯片通过传输总线连接起来构成音频系统,一端称为CPU端,负责发送和接收数字信号,另一端称为CODEC端,负责AD或DA转换,该框架的主要目的是使两端相互独立。

1、基本概念

数字音频接口(snd_soc_dai):用于描述CPU端或CODEC端的硬件能力。在运行过程中,SOC框架会综合两端的硬件能力,生成两端都可接收硬件能力参数(snd_pcm_hardware)。

音频接口连接(snd_soc_dai_link):通过该数据结构,可以描述两端的实际硬件连接。即哪个CPU端跟哪个CODEC端连在一起。

平台(snd_soc_platform):这个数据结构跟alsa框架中的码流(snd_pcm)对应,主要字义了相关的回调函数。

卡片(snd_soc_card):该结构可能是SOC中声卡的概念吧,这里译为卡片。该结构包含了音频接口连接(snd_soc_dai_link)和平台(snd_soc_platform)。

设备(snd_soc_device):该数据结构包含卡片(snd_soc_card),codec设备(snd_soc_codec_device),以及设备配置数据。
6. 播放音频(第六部分) 之前已经提到过,中断由azx_interrupt来处理。 再来看一个寄存器:* INTSTS(Interrupt Status Register)中断状态寄存器,32位。第31位,Global Interrupt Status (GIS),全局中断状态,只要有中断,它就会被置1。第30位,Controller Interrupt Status (CIS),控制器中断状态,用来标记RIRB对应的中断,代码里看起来,并没有被用到。其它位用来标记流的中断,根据流的数量来决定要使用的位数。 以上函数的目的确 阅读详情

相关推荐

Linux ALSA声卡驱动之四:Codec 以及Codec_dai

一. Codec简介 在移动设备中,Codec的作用可以归结为4种,分别是: 对PCM等信号进行D/A转换,把数字的音频信号转换为模拟信号 对Mic、Linein或者其他输入源的模拟信号进行A/D转换,把模拟的声音信号转变CPU能够处理的数字信号 对音频通路进行控制,比如播放音乐,收听调频收音机,又或者接听电话时,音频信号在codec内的流通路线是不一样的 对音频信号做出相...

肖岩 8124

ALSA之PCM分析

之前写过一个音频驱动CODEC分析,当时忽略了阐述最基本的概念。要了解一个东西,首先要明白它是什么它起到什么作用,然后才会更好对它的工作流程更好的分析。所以这里提一下: CODEC :音频芯片的控制,比如静音、打开(关闭)ADC(DAC)、设置ADC(DAC)的增益、耳机模式的

AZURE 2万+

三、Audio-ALSA 中的platfrom、machine、codec

一、Linux ALSA 音频系统框架 ● ALSA CORE alsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC) ● ASoC CORE ASoC:ALSA System on Chip,是建立在标准 ALSA 驱动上,为了更好支持嵌入系系统 和 应用于移动设备的音频 codec 的一套软件体系,它依赖于标准 ALSA 驱动框架。 由三大部分组成,分别是 Machine、Platform、Codec。

一只青木呀 1897

8.声卡驱动03-自己实现alsa驱动-虚拟声卡-缓存

平台:ubuntu 16.04,kernel版本是4.15.0, 理论任何平台都可以,甚至是android,只要能编译通过。 需要完成的功能:传说中的回采,做过语音方案的童鞋应该能懂,就是播放的音频,录音录回去。因为是虚拟的声卡,不涉及硬件操作,也只能这样看点效果。 目的:当然是为了能更直观的理解alsa驱动框架。虚拟出一个声卡,不涉及复杂的硬件操作,不涉及复杂的硬件调试,只关心数据流怎么一步一步传给应用的。 1.数据是怎么交互的 以playback为例 驱动程序分配一个buffer APP不断写

u014056414的博客 7053

Linux ALSA声卡驱动之四:深入解析Codec与Codec_dai的注册机制

本文深入解析Linux ALSA声卡驱动中Codec与Codec_dai的注册机制,详细介绍了Codec的基础概念、核心功能及其在音频信号转换中的关键作用。通过剖析注册流程、关键数据结构和深度实现,帮助开发者理解ALSA框架下Codec驱动的注册过程,为嵌入式音频系统开发提供实践指导。

weixin_29159613的博客 533

audio驱动之codec和codec_dai

平台 os版本 内核 MT6765 Android 9.0 kernel-4.9 ./kernel-4.9/sound/soc/mediatek/codec/mt6357/mtk-soc-codec-6357.c module_init(mtk_mt6357_codec_init); static int __init mtk_mt6357_codec_init(void) ...

karaskass的博客 2776

ALSA driver--pcm_read和pcm_write的阻塞问题

一张图先看下pcm_write的调用流程 做的工作一是将数据送到dma 中,另外就是更新alsa的缓冲区指针 在snd_pcm_lib_write1接口中看到这样一个函数wait_for_avail wait_for_avail函数将会将当前写或读数据的任务通过add_wait_queue加入一个队列中,等待被唤醒,如果有没有收到唤醒,schedule_timeout将会挂起直到设置...

和大伙儿去乘凉 1万+

光模块数字诊断监控(DDM)功能

DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。.

光模块的博客 2300

ALSA SOC架构关键点

<!--google_ad_client = "pub-3409735151169599";/* 468x15, 创建于 09-10-21 */google_ad_slot = "3284565503";google_ad_width = 468;google_ad_height = 15;// -->关于ALSA(Advanced Linux Sound

cpuwolf的成长笔记 8721

告别‘Duang’的一声:手把手解决RK3588开发板PCIe初始化卡死问题(DTS修改实战)

本文详细介绍了解决RK3588开发板PCIe初始化卡死问题的完整过程,包括问题诊断、DTS文件修改及编译烧写步骤。通过禁用未使用的PCIe硬件资源,有效解决了启动卡死问题,为嵌入式开发者提供了实用的调试方法和经验总结。

weixin_30753873的博客 214

在MATLAB产生正态(Gauss)分布随机数

在 MATLAB 中内置了有产生标准正态(Gauss)分布的随机数函数,使用方法如下: 其中 为产生矩阵的行数和列数, 为产生矩阵的个数,产生的矩阵中的每个元素均为服从 N(0,1)N(0, 1)N(0,1) 的标准正态分布的元素。使用如下命令产生一个 的服从的随机数矩阵: 绘制图像效果如下: 可以看到这里随机数服从 的标准正态分布。假设 X∼N(0,1)X\sim N(0,1)X∼N(0,1),则 3X+33X+33X+3 服从 N(3,9)N(3,9)N(3,9) 分布,因此我们要产生服从 N(

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 3万+

音频ALSA架构简介

ALSA(Advanced Linux Sound Architecture)即高级 Linux 声音架构。 嵌入式移动设备的音频子系统目前主要是ALSA 驱动 asoc 框架,其中包括 codec driver、 platform driver、 machine driver 等。

lihuan680680的博客 1万+

黑苹果从入门到精通:最详细的VMware安装macOS教程

前言 不知为何,以前我发的两篇关于黑苹果的文章或没过审或被删除,最近SMZDM上有不少优质的黑苹果文章发出来,貌似禁令已开,前段时间在一篇写的很不错的黑果文章下吹牛说今年要写一个系列,故有了这篇文章作为系列的开头。 系列的名字起的有点俗,叫做xxx从入门到精通,但是我很喜欢,相信过半的黑果群众都是程序员,作为教程来说这个名字俗但是好用,我也希望这个系列能像其它入门到精通系列一样,让大家学到东西...

La victoria的博客 14万+

ALSA之CODEC分析

最近在调试alsa-soc 的驱动,下面转载的几篇文章对这些问题都有很详细的讲解, 转载自: http://blog.youkuaiyun.com/sepnic/article/details/6140911    ALSA: Advanced Linux Sound Architecture,它包括内核驱动集合、API库和工具。用户层程序直接调用libsound的API库,不需要打开设备等操作,因

tianruxishui的专栏 915

手把手教你学Simulink--基于火电发电系统的场景实例:燃煤发电机组的锅炉-汽轮机协调控制仿真

本文介绍了使用Simulink构建燃煤发电机组锅炉-汽轮机协调控制系统的仿真方法。系统包含锅炉子系统、汽轮机子系统和协调控制器三大模块,通过传递函数建模和PID控制策略实现协调控制。详细说明了从模型创建、子系统设置到控制器设计的完整流程,包括燃料供给、汽轮机模型和数据处理等关键环节。最后通过性能评估验证系统响应速度、参数稳定性和效率等指标。该仿真方法为火电系统控制策略设计和优化提供了有效工具。

MHD0815的博客 1153

黏菌算法(Slime Mould Algorithm,SMA)

这是一篇关于黏菌算法的总结博客,包含算法思想,算法步骤,求函数最值(Python实现),算法改进等,持续更新ing

weixin_46838605的博客 1万+

ALSA之Codec分析

ALSA: Advanced Linux Sound Architecture,它包括内核驱动集合、API库和工具。用户层程序直接调用libsound的API库,不需要打开设备等操作,因此编程者不需要了解底层细节。 这 里不分析ALSA的核心代码core,也不阐述如何在用户层进行声卡编程,仅仅简要介绍在ALSA的架构上添加一个声卡驱动,即上图中的Sound Driver。其实文档《wirte

martin的专栏 904

STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)

单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片唤醒驱动程序。 一、RxDutyCycle模式 在讲述本篇内容之前,我们先来看一下SX1268的一种模式RxDutyCycle,译为中文为接收占空比模式。其可使用SetRxDutyCycle命令进入RxDutyCycle模式,我们来看一下该命令的详细解释。 该命令具有2个参数,...

snmplink的博客 4067

荔枝派Zero(全志V3S)开启alsa,测试codec

默认 dts 中使能了 codec需要使用的话,在 buildroot 中勾选 alsa-utils 相关命令即可ALSA 是 Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。

明天你好的博客 2233

UNet 改进(19):与ASPP结合的图像分割模型

这个代码实现了一个改进版的UNet模型,在传统的UNet架构基础上,引入了ASPP模块来增强模型捕获多尺度上下文信息的能力。​​UNet主干网络​​:经典的编码器-解码器结构,带有跳跃连接​​ASPP模块​​:位于瓶颈层,用于提取多尺度特征。

2401_82355416的博客 877

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

一. ALSA 简介 ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。 在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供...

肖岩 7440

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux ALSA 之六:ALSA ASoc 架构

ALSA ASoc

年少生而为人 2375

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ALSA驱动asoc框架之Codec

一、Nau8810芯片系统框架图 由系统框架图可以看出,输入端为差分MIC输入,输出端可以为MOUT或Speaker。Codec对外硬件接口通过Audio I/O和Digital I/O,其中Audio I/O一般传输的是音频信号为I2S或PCM,Digital I/O为控制信号一般为I2C。 芯片引脚分布如下: 二、Codec注册

lihuan680680的博客 2584

Linux ALSA声卡驱动之一:ALSA架构简介

ALSA架构简介

houxiaoni01的博客 8658
上一篇: 音频codec lm49350_i2c设备驱动
下一篇: 声道的概念
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值