Linux 驱动之基础(一)Device-I/O
Memory Mapped IO
Getting Access to the Device
This address should not be used directly. Instead, to get an address
suitable for passing to the accessor functions described below, you
should call ioremap(). An address suitable for accessing the device will
be returned to you.
After you've finished using the device (say, in your module's exit
routine), call iounmap() in order to return the address space to the
kernel. Most architectures allocate new address space each time you call
ioremap(), and ...
UAC(六)UAC 同步方式
同步问题原因
USB Isochronous
传输(协议无问题)
Isochronous Transfer
同步问题
电脑播放器播放音乐时:是按一个固定的速率,比如
44.1KHZ,电脑内有一个晶振,可分频出一个 44.1KHZ,进行音乐播放,发给 USB
的数据流速率固定。USB 声卡自己得有一个晶振才能工作,它也可分频出一个
44.1KHZ,供给 I2S 信号或 DAC。
问题来了,晶振是有误差的,这两个 44.1KHZ
不可能完全一模一样,电脑可能是 44.100KHZ,USB 声卡可能是
44.098KHZ,误差约 50ppm,很正常的情况。虽然声卡晶振分频出来是
44.098KHZ,但声卡认为它就是工作在 44.100KHZ
下。好吧,如果二者时钟独立运行,那么 1 个小时会误差 0.2
秒,会出现不同步! 即电脑播了 1 个小时的数据,USB
声卡实际是无法播完的,要多 0.2 秒才能播完。 如果声卡也要 1
小时播完,那这 1 小时就需要丢掉 0.2 秒的数据。
所以二者的时钟必须要同步一致才行,这就是 UAC 同步问题的原因,因此 USB
音频规定了一是采用“等时传输 ...
UAC(五)Feature Unit
音量基本概念
声学中的分贝
因为人耳的特性,我们对声音的大小感知呈对数关系。所以我们通常用分贝描述声音大小,分贝(decibel)是量度两个相同单位之数量比例的单位,主要用于度量声音强度,常用
dB 表示。声学中,声音的强度定义为声压。计算分贝值时采用 20
微帕斯卡为参考值(通常被认为是人类的最少听觉响应值,大约是 3
米以外飞行的蚊子声音)。这一参考值是人类对声音能够感知的 阈值
下限。声压是场量,因此使用声压计算分贝时使用下述版本的公式:
\[
L_p = 20log_{10}(\frac{p_{rms}}{p_{ref}})dB
\]
其中的 pref 是标准参考声压值 20 微帕。
分贝声音变化范围
在编程中,我们可以用以下公式计算两个声音之间的动态范围,单位为分贝:
\[
dB = 20 * log(A1 / A2)
\]
其中 A1 和 A2
是两个声音的振幅,在程序中表示每个声音样本的大小。声音采样大小(也就是量化深度)为
1bit 时,动态范围为 0,因为只可能有一个振幅。采样大小为 8bit
也就是一个字节时,最大振幅是最小振幅的 256 倍。因此,动态范围是 48 ...
UAC(四)HID
HID 相关概念
报表描述符由描述 HID 设备的数据项目(Item)组成,Item
的第一个字节(项目前缀)由三部分构成,即项目类型(item
type)、项目标签(item tag)和项目长度(item size)。
HID 的项目有短项目和长项目两种,其中短项目的格式如下图:
bSize 定义 short Item 的数据字节数,为 0、1、2、3 时 Data
部分的字节数分别为 0、1、2、4 个字节
bType 是 short Item 的类型,为 0、1、2 时分别为 Main、Global 和
Local 类型
bTag 是 Item 标志,有 Input、Output、Collection、Usage Page、Usage
等
长项目可以携带较多的数据,其格式如下图(用的少):
item
中的第一个字节为上图中的特定值时表明该项目是一个长项目
bDataSize 说明 Data 部分的字节数
bLongItemTag 在 HID 规范中没有定义
下面以 0x05, 0x0c 为例来说明一下:
0x05(0b00000101)其中 bit2-3 代表 s ...
UAC(三)Spec-Interrupt
Interrupts
中断用于通知 host
音频功能的当前状态发生了变化。本规范目前定义了两种不同类型的中断:
Memory Change:
某些内部实体的内存位置已更新。可以通知主机软件,以便采取适当的行动。
Control Change:
音频函数内部的某些可寻址控件更改了其一个或多个属性值
时钟实体、单元或终端内部的音频控件可以是中断的源。同样,AudioControl
接口中的任何可寻址 Control 或任何 AudioStreaming
接口都可以生成中断。最后所有与音频端点相关的可寻址控件都可能是中断的源。
音频功能的状态变化通常是由发生的特定事件引起的。事件可以是用户发起的,也可以是设备发起的。用户发起的插孔插入或移除是用户发起事件的典型示例。主机可以切换选择器或混音器,以便从刚刚插入的设备
(例如耳机)播放音频,并停止从当前设备(例如扬声器)
播放音频。设备启动事件的示例如下:一个外部设备 (例如 A/V
接收器可以在其光学数字输出上从 PCM 转换为 AC-3
编码数据,这取决于当前正在播放的材料如果此设备连接到具有自动检测功能的音频功能的光学数字输入,则该音 ...
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 写数据给 ...