UAC(二)Spec-Requests
Standard Requests
音频设备类支持 USB 规范的第 9 节“USB 设备框架”中描述的标准请求。音频设备类对标准请求的值没有提出特定的要求。
Class-Specific Requests
特定于类的请求用于设置和获取与音频相关的控件。这些控制器主要分为两组:那些操纵音频功能的控制器,如音量,音调,选择器的位置等。以及那些影响等时终点上的数据传输的数据,比如当前的采样频率。
AudioControl Requests
对音频功能的控制是通过操作嵌入在音频功能的实体中的单个控件的属性来执行的。特定于类的音频控件接口描述符包含一组实体描述符,每个描述符指示实体中存在哪些控件。音频控制请求总是指向音频功能的单个音频控制接口。请求包含足够的信息(实体 ID、控制选择器和通道号),以便音频功能决定必须路由特定请求的位置。同样的请求布局也可用于特定于供应商的对扩展单元的请求。但是,本规范不包括它们
AudioStreaming Requests
对音频流接口的类特定行为的控制是通过操作接口控制或端点控制来执行的。它们可以是特定于类的(如本规范中定义的)或特定于供应商的。对于任何 ...
UAC(一)Spec-Functional Characteristics
Introduction
在许多情况下,音频功能不作为独立设备存在。它是一种能力,与其他功能一起构成了一个“复合”设备。一个很好的例子 DVD-ROM 播放器就是音频、数据存储和传输控制功能的集合。音频功能因此位于设备类层次结构中的接口级别。它由多个接口组成,共同实现音频功能的接口。
音频功能被认为是一个“closed box”,具有非常独特的和定义良好的接口到 outside world。音频功能通过它们的音频接口进行寻址。每个音频功能都必须有一个 AudioControl 接口可以有 0 个或多个 AudioStreaming 和 0 个或多个 MIDI Streaming 接口。AudioControl(AC)接口用于访问 function 的音频控件,而 AudioStreaming (AS) 接口用于将音频流传入和传出 function。 MIDI streaming (MS) 接口可用于将 midi 数据流传输到和输出音频功能。单个 AudioControl 接口以及属于同一音频功能的 AudioStreaming 和 MIDI Streaming 接口的集合称为 Audi ...
USB OTG
OTG接口与转换器
OTG是"On The Go"的英文缩写,字面上可以理解为“安上即可用”。USB传输是主从结构,一切USB传输都有Host发起。比如在开发板上可以插入U盘,这时开发板作为USB Host。但是开发板要跟PC通信,开发板就要作为USB Device。开发板要作为USB Host、USB Device两种角色,可以使用OTG插口:它可以根据硬件电路自动识别自己的角色,切换为USB Host或USB Deivce。
OTG插口有多种形态,常用的有Micro USB、Type C,如下:
Micro USB
对于Micro USB插座,它有5条引脚:
引脚作用如下表所示:
引脚名
作用
VBUS
作为Host时,对外供电作为Device时,接收外部输入的电源
DM
数据信号
DP
数据信号
ID
分辨自己角色的引脚:1:作为Device0:作为Host
GND
地线
开发板作为USB Device时跟PC上的USB相连,PC的USB接口只有VBUS、DM、DP、GND,所以开发板的ID引脚跟PC的USB口并无连接,它被板子上的上拉电 ...
UAC(零)UAC Topology
UAC 拓扑结构
UAC 规范描述了以下类型的标准单元和终端,这些单元和终端被认为足以代表当前和近期可用的大多数视频功能:
输入终端 - Input Terminal (IT)
输出终端 - Output Terminal (OT)
混音器单元 - Mixer Unit (MU)
选择器单元 - Selector Unit (SU)
特性单元 - Feature Unit (FU)
采样速率转换单元 - Sampling Rate Converter Unit (RU)
特效单元 - Effect Unit (EU)
处理单元 (PU) - Processing Unit (PU)
扩展单元 (XU) - Extension Unit (XU)
除了单元和终端外,还引入了时钟实体的概念。定义了三种类型的时钟实体
时钟源 - Clock Source (CS)
时钟选择器 - Clock Selector (CX)
时钟倍频器 - Clock Multiplier (CM)
UAC 设备拓扑结构
控件通常提供对特定的音频或时钟属性。每个控件都有一组可以操作或显示的属性。
有关 ...
Linux 驱动之 ALSA(九)虚拟声卡 Latency
测试方法
两块板子之间通过 I2S 通信,其中一块板子配置为 Slave 另一块板子为 Master
Master 板端执行 arecord | aplay 或者 gstream 命令 12arecord -Dhw:2,0 -r 44100 -c 8 -f S32_LE | aplay -Dhw:2,0 -c 8 -r 44100 -f S32_LEgst-launch-1.0 alsasrc device=device_input_split ! alsasink device=device_output sync=false
Slave 通过 aplay 播放一段 wav 文件
通过示波器抓取 Master 板的 I2S 输入和输出端的波形间隔来测量虚拟声卡的 Latency
DataStream
上图就是 arecord | aplay(没有使用插件) 整个虚拟声卡的数据流,其中延迟最大的部分就是红色框中的缓存。
走 USB 通路的 latency:
增大 Buffer Size 为什么会增大 latency?
aplay 通过调用 snd_pcm_write 写数据给 ...
Linux 内核调试(三)VM 参数调试
vm 参数说明
Currently, these files are in /proc/sys/vm:
admin_reserve_kbytes:系统中应为用户保留的可用内存量。
默认 (3% of free pages, 8MB)。这应该足以让 admin 登录并终止进程。这个值的设置,最好保证系统足够运行 sshd or login + bash (or some other shell) + top (or ps, kill, etc.)
block_dump:当设置为非零值时,block_dump 启用块 I/O 调试。
compact_memory:压缩内存。
仅当设置 CONFIG_COMPACTION 时可用。 当写入 1 时,所有区域都会被压缩,以便可以更好的提供连续内存。 这在分配大页面时可能很重要,尽管进程也会根据需要直接压缩内存。
compact_unevictable_allowed:压缩时检查 lru。
dirty_background_bytes:如果 dirty 页大于这个值,内核后台线程开始工作,将 dirty 内存写回到 flash。
dirty ...
Linux 驱动之 ALSA(八)Alsa Plugin
PCM (digital audio) plugins
PCM plugins extends functionality and features of PCM devices. The plugins take care about various sample conversions, sample copying among channels and so on.
Plugin: hw
This plugin communicates directly with the ALSA kernel driver. It is a raw communication without any conversions. The emulation of mmap access can be optionally enabled, but expect worse latency in the case.
The nonblock option specifies whether the device is opened in a non-blocking manner. Note th ...
Linux 驱动之 ALSA(六)声卡创建流程
数据结构
原图
snd_card: 是最顶层数据结构,通过链表挂载该 sound card 的所有设备 snd_device。
snd_pcm: 挂在 snd_card 下面的一个 snd_device。
snd_pcm_str: 代表 playback stream 和 capture stream。
snd_pcm_substream: 是 pcm 中间层的核心,绝大部分任务都是在 substream 中处理,尤其是他的 ops(snd_pcm_ops)字段,许多 user 空间的应用程序通过 alsa-lib 对驱动程序的请求都是由该结构中的函数处理。它的 runtime 字段则指向 snd_pcm_runtime 结构,snd_pcm_runtime 记录这 substream 的一些重要的软件和硬件运行环境和参数。
snd_pcm_ops: 创建声卡需要提供的回调。
snd_pcm_runtime: 运行时参数,包括 sample rate、channel、format 等参数,以及 buffer 相关信息。
snd_pcm_harward: 硬件相关参数,创建声卡需要 ...
Linux 驱动之 ALSA(七)XRUN
XRUN 是缓冲区不足或溢出,X 代表不足或溢出。在这两种情况下,都表明系统速度不够快,未能及时处理来自 ALSA 音频缓冲区的数据,因此丢失了一些数据。当我们以非常小的缓冲区大小运行时,声卡应该非常快地处理传入缓冲区的数据,否则就溢出 overrun 了。有些芯片无法适应较小的缓冲区大小,因此我们必须增加缓冲区长度以减轻声音芯片的工作量。通常,xruns 可以听到爆裂声或爆裂声。
在录音例子中,如果应用程序读取数据不够快,循环缓存区将会被新的数据覆盖。这种数据的丢失被称为"over run" 在回放例子中,如果应用程序写入数据到缓存区中的速度不够快,缓存区将会"饿死"。这样的错误被称为"under run"
/Proc
ALSA 提供了一种通过 proc 记录和调试 xrun 的方法:
123Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture ---> [*] Sound Proc FS Suppor ...
Linux 驱动之 ALSA(五)Machine 驱动
ASoC 架构的设计方式是平台和编解码器类驱动程序必须绑定在一起才能构建音频设备。这种绑定可以在所谓的机器驱动程序或设备树中完成,每一个机器驱动程序和设备树都是与特定机器相关的。也就是说,机器驱动程序针对特定系统,并且不同的板卡需要不同的机器驱动程序。
Machine 驱动程序开发流程
一般来说,机器驱动程序的职责包括以下内容
使用适当的 CPU 和编解码器 DAI 填充 struct snd_soc_dai_link 结构体
物理编解码器时钟设置(如果有的话)和编解码器初始化主/从配置(如果有的话)
定义 DAPM widget 以路由物理编解码器内部并根据需要完成 DAPM 路径
根据需要将运行时采样频率传播到各个编解码器驱动程序
鉴于此,机器类驱动程序的开发可执行以下流程。
编解码器驱动程序注册组件驱动程序、DAI 驱动程序以及它们的操作函数
平台驱动程序注册组件驱动程序、PCM 驱动程序、CPU DAI 驱动程序和它们的操作函数,并根据需要设置回放和采集操作
机器层在编解码器和 CPU 之间创建 DAI 链接并注册声卡和 PCM 设备
现在我们已经了解了机器类驱动程序 ...