PCM data flow之一:概述

2024-04-16 07:38
文章标签 概述 data pcm flow

本文主要是介绍PCM data flow之一:概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux kernel version:3.4.5

SoC:Samsung exynos

Userspace:tinyalsa


音频驱动主要有三部分组成:

1、 Platform:通常指某款SoC平台,如exynos、omap等等。Platform又可细分两部分:

1.1、CPU DAI:在嵌入式系统里面通常指CPU的I2S、PCM总线接口,负责将音频数据从AIF FIFO搬运到CODEC(Playback的情形,Capture则方向相反)。CPU DAI通过snd_soc_register_dai()来注册。注:DAI是Digital Audio Interface的缩写,分为CPU DAI和CODEC DAI,这两者通过I2S/PCM总线连接;AIF是Audio Interface的缩写,一般分为I2S和PCM接口。

1.2、DMA:负责将音频数据从userspace通过DMA操作搬运到AIF FIFO,这部分的逻辑比较复杂,以下几篇会对它详细阐述。DMA操作通过snd_soc_register_platform()来注册。值得留意的是:某些情形下是不需要DMA操作的,比如Modem和CODEC直连,因为Modem本身已经把数据送到它的PCM接口FIFO了,这时只需启动PCM接口把数据搬运到CODEC即可;在这种情形下,Machine驱动snd_soc_dai_link中需要指定.platform_name = "snd-soc-dummy", 这是虚拟出来的DMA驱动。

2、CODEC:对于Playback来说,userspace送过来的PCM数据是经过抽样量化出来的数字信号,在codec经过DAC转换成模拟信号送到外放耳机输出,这样我们就可以听到声音了。Codec字面意思是编解码器,但芯片里面的部件很多,常见的有AIF(音频接口)、DAC、ADC、Mixer、PGA、Line-in、Line-out,有些高端的codec芯片还有EQ、DSP、SRC、DRC、AGC、Echo canceller、Noise suppression等功能。

3、Machine:指某一款机器,它把CPU DAI、CODEC DAI、MODEM DAI各个音频总线接口通过定义dai_link链结起来,然后注册snd_soc_card。和上面两个不一样,Platform和CODEC驱动一般是可以重用的,而Machine有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:DAIs之间的链结;通过某个GPIO打开Amplifier;通过某个GPIO检测耳机插拔;使用某个时钟如MCLK/External OSC作为I2S、CODEC模块的基准时钟源等等。


因此从上面的描述来看,对于Playback,PCM数据流向大致是:

[cpp] view plain copy print ?
  1. | DMA |                 | I2S/PCM |        | AIF->DAC->PGA/Mixer |  
  2. -----------> AIF FIFO ----------------> CODEC ----------------> SPK/HS/Earpiece  
              | DMA |                 | I2S/PCM |        | AIF->DAC->PGA/Mixer |
userspace----------------> AIF FIFO ----------------> CODEC ----------------> SPK/HS/Earpiece


我们这系列的内容主要讲述pcm数据如何从userspace如何通过DMA搬运到AIF FIFO的。至于I2S控制方面,逻辑是非常简单的,读写寄存器启动I2S传输即可。

这系列初步定为如下几个部分:

1、 当pcm_open时,如何检查hw constraints(硬件特性限制,如支持的通道数/采样率/数据格式、DMA的period size和period count等);如何设置hw params(channels/sample rate/pcm format/period size/period count等);如何设置sw params(start_threshold/stop_threshold/silence_threshold等);如何调用platform/codec/machine的hw_params()回调函数。

2、 当pcm_write时,如何把pcm数据从userspace拷贝到dma_alloc_writecombine()分配出来的dma buffer中;如何触发platform/codec/machine的trigger()函数去启动DMA,把数据从dma buffer搬运到AIF FIFO。但在这之前,会先分析dma buffer分配过程,还有dma搬运的src源地址和dst目的地址如何设定,这部分平台相关。

3、 xrun出现的根源是什么?有些资料这样提及:“xrun指的是,声卡period一到,引发一个中断,告诉alsa驱动,要填入数据,或读走数据,但是问题在于alsa的读取和写入操作必须用户调用writei和readi才会发生的,它不会去缓存数据;如果上层没有用户调用writei和readi,那么就会产生 overrun(录制时,数据都满了,还没被读走)和underrun(需要数据来播放,却不写入数据),统称为xrun”。这里源码上分析它是如何产生的,这样我们知道需要正确配置好哪个参数才能更好避免xrun或取得更好的表现性能。


涉及到的源码文件:

[plain] view plain copy print ?
  1. sound/core/pcm_native.c  
  2. sound/core/pcm_lib.c  
  3. sound/soc/samsung/i2s.c  
  4. sound/soc/samsung/dma.c  
  5. arch/arm/mm/dma-mapping.c  
  6. arch/arm/plat-samsung/dma-ops.c  
sound/core/pcm_native.c
sound/core/pcm_lib.c
sound/soc/samsung/i2s.c
sound/soc/samsung/dma.c
arch/arm/mm/dma-mapping.c
arch/arm/plat-samsung/dma-ops.c

可以看到只有pcm_native.c和pcm_lib.c是平台无关的,其他都平台相关。但不要紧,平台相关部分仅仅是dma的初始化和它的操作函数,这一部分在其他平台也是类似的,只是实现不大一致。

这篇关于PCM data flow之一:概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908182

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试,然后在测试中遇到了一些问题,去寻找CTS源码(/cts/tests/tests/location/src/android/locat

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已