UAC(八)PPM 评估
USB sof统计方法
打时间戳方式
ktime_get_raw_ns() Linux标准接口。
meson_timestamp() Amlogic实现的硬件定时器接口。
sof打时间戳的时机
直接在SOF中断handle里打时间戳,然后将其保存到一个fifo里。
通过一个hrtimer,主动查询SOF中断寄存器查看是否有SOF包,如果有SOF包则打上时间戳保存到fifo里。
sof时间戳导出到应用层
通过seq file创建一个proc(/proc/sof_ts)文件,应用通过读取该文件来获取sof时间戳。
USB sof统计数据方案验证
中断handle里用ktime_get_raw_ns()打时间戳统计数据
数据:
样本数量
平均值(ns)
最小值(ns)
最大值(ns)
方差
标准差
8192
125001.0327
94125
156125
2281694.791
1510.5279
sof间隔图表:
统计直方图(124-126us):
上图在124us-126us之间的概率分布,两头分别是低于124us和高于126us的概率。低 ...
UAC(七)Async Feedback
buffer 统计
采样间隔 1ms、采样 buffer 里的数据长度
可以看到整体上 buffer 里的数据是不断增多的,将其放大可以看下细节:
符合数据变化规律,usb 会每隔 1ms 往 buffer 里放一次数据,audiobridge 会每 period_size 间隔将数据发给 dsp(buffer 里的数据会突然减少,这里是 1024 个 period_size),然后由于 tdmb 的实际采样率要低一些,因此每隔一段时间会出现只有 usb 数据传输过来,而 audiobridge 不会将数据送到 dsp 的情况发生,这样就造成了 buffer 里的数据不断累计。
这里其实可以通过每次只采样 audiobridge 发送完数据的时刻的 buffer 大小,这样可以大大减少数据采样的次数同时还能采样到局部数据最小值。,如下图这样的:
改用这种方式采样得到的数据曲线如下:
Async 反馈阈值设定
Async 反馈 srate 给 host 后统计的数据
通过设置阈值来调整 uac 的 feedback 速率,得到 buffer 里的数据长度曲线如下:
...
Linux 驱动之基础(二)DMA-API
😊 There are two types of DMA mappings
Consistent DM(硬件保证 cache 一致性) mappings which are usually mapped at driver initialization, unmapped at the end and for which the hardware should guarantee that the device and the CPU can access the data in parallel and will see updates made by each other without any explicit software flushing.
Streaming DMA(需要软件来维护 cache 一致性) mappings which are usually mapped for one DMA transfer, unmapped right after it (unless you use dma_sync_* below) and for which hardw ...
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(), an ...
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 米以外飞行的蚊子声音)。这一参考值是人类对声音能够感知的 阈值 下限。声压是场量,因此使用声压计算分贝时使用下述版本的公式:
Lp=20log10(prmspref)dBL_p = 20log_{10}(\frac{p_{rms}}{p_{ref}})dB
Lp=20log10(prefprms)dB
其中的 pref 是标准参考声压值 20 微帕。
分贝声音变化范围
在编程中,我们可以用以下公式计算两个声音之间的动态范围,单位为分贝:
dB=20∗log(A1/A2)dB = 20 * log(A1 / A2)
dB=20∗log(A1/A2)
其中 A1 和 A2 是两个声音的振幅,在程序中表示每个声音样本的大小。声音采样大小(也就是量化深度)为 ...
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 代表 ...
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 接口的集合称为 Aud ...
