- 博客(440)
- 收藏
- 关注
原创 UAC2.0 麦克风——同时支持 16bit,24bit 和 32bit
在一个 USB 麦克风设备中同时支持 16bit, 24bit 和 32bit。
2024-09-20 01:30:00 77
原创 UAC2.0 麦克风——多采样率支持
Clock Source Descriptor 需要修改为频率可调。UAC2.0 多采样率支持需要在。这里请求的就是采样率的范围。命令中返回采样率集合。这里有三个采样率可选。可编程的 Clock。
2024-09-19 19:13:52 162
原创 UAC2.0 麦克风——音量控制
发送到 Feature Uint 的 CS 码如下所以这个命令就是设置音量的命令,后面紧跟着的两个数据就是音量F6 FF。
2024-09-19 09:08:34 126
原创 UAC2.0 麦克风——双声道 USB 麦克风(16bit)
所以增加一个通道,该描述符的长度增加 4,那么配置描述符的总长度也增加 4。Feature Unit 的 bLength 字段有两个通道,所以需要加 4。Class-Specific AS Interface 描述符的。feature Unit 新增加了一个通道,需要新增。所以这里的 wTotalLength 也要加 4。字段表明有几个通道,所以这里也设置为 2。字段表明有几个通道,所以这里设置为 2。第二个通道的属性这里设置和通道1一致。可以知道增加一个通道,需要增加。
2024-09-18 00:15:00 163
原创 UAC2.0 麦克风——麦克风数据传输
实现 RAM -> USB -> PC 这个数据通路之后,可以用 USB 麦克风来测试 codec ADC 的性能。MCU 端发送 48KHZ, 16bit 单声道的正弦波数据,正弦波数据的生成参考。需要注意的是音频数据的数据包 PID 是不翻转的,所以 PID 一直是 DATA0。本节主要介绍 MCU 麦克风的数据如何传输给上位机。上一节中实现了 USB 麦克风设备。使用音频录制软件查看波形如下。
2024-09-17 00:15:00 84
原创 UAC2.0 麦克风——单声道 USB 麦克风(16bit)
的总长度 = Class-Specific AC Interface Header + Clock SRC + INPUT Terminal + OUTPUT Terminal + Unit。这里只有一个 channel ,所以长度是 6 + 2 * 4 = 14。需要注意的是,如何使用接口关联描述符,这里的类,子类和协议需要固定为。非 0 端点的数是 0,所以 audio 控制接口是没有端点的。所以接口关联描述符将接口1 和接口 2 关联到一起。
2024-09-16 11:06:21 863
原创 USB组合设备——串口+鼠标+键盘
主机在获取字符串描述符时,需要根据索引返回相应的字符串。,主机在获取字符串描述符时,需要根据索引返回相应的字符串。所以接口关联描述符将接口1 和接口 2 关联到一起。这里的 windex 都是 0 表示发送到接口 0。后面的接口描述符,类特殊描述符和端点描述符等和。发送到接口 2 的 set idle 命令。发送到接口 3 的 set idle 命令。发送到接口 2 的获取描述符命令。发送到接口 2 的获取描述符命令。
2024-09-16 00:15:00 391
原创 USB虚拟串口——CDC ACM 虚拟串口(使用 IAD)
主机通过发送Get Descriptor请求,取得配置描述符,接口关联描述符,接口描述符,端点描述符及其附属描述符。本文主要介绍使用 IAD 接口关联描述符,不使用 IAD 参考。一个 CDC 设备有两个接口,所以就有两种实现方式。所以接口关联描述符将接口1 和接口 2 关联到一起。后面的接口描述符,类特殊描述符和端点描述符等和。需要注意的是,这里的类,子类和协议。一致,这里不再赘述。
2024-09-15 01:45:00 116
原创 USB虚拟串口——CDC ACM 虚拟串口(不使用 IAD)
主机在获取字符串描述符时,需要根据索引返回相应的字符串,0 表示没有字符串。,主机在获取字符串描述符时,需要根据索引返回相应的字符串。一个 CDC 设备有两个接口,所以就有两种实现方式。本文主要介绍不使用 IAD 接口关联描述符。第一个接口描述符指定了。第二个接口描述符指定了。
2024-09-14 20:05:53 142
原创 USB组合设备——鼠标+键盘(两个接口实现)
中可以知道,多个接口实现时,一个接口实现鼠标,一个接口实现键盘,所以此时的配置描述符集合为。第一次主机不知道字符串描述符的长度,先获取 4 个,设备返回四个;第一次主机不知道字符串描述符的长度,先获取 4 个,设备返回四个;上一章中介绍了使用一个接口两个集合来实现,这一章使用两个接口实现。,主机在获取字符串描述符时,需要根据索引返回相应的字符串。,主机在获取字符串描述符时,需要根据索引返回相应的字符串。第二次主机知道长度之后获取完整的字符串描述符。接口描述符中只指定了类,子类和协议都没有指定。
2024-09-14 17:04:47 451
原创 USB PHY——ULPI
ULPI协议的全称是UTMI+ Low Pin Interface。从名字上就可以看出ULPI是UTMI的Low Pin版本。从这张图可以看出 ULPI 是在 UTMI+ level3 再往上一层。ULPI需要读写寄存器,而UTMI+只需直接拉高或拉低信号线。ULPI是在UTMI+的基础上封装了一层。
2024-08-30 08:38:25 84
原创 USB PHY—— UTMI+
UTMI(USB2.0 Transceiver Macrocell Interface)是一种用于USB controller和USB PHY通信的协议。相对于ULPI,UTMI有更多的控制信号,支持 8bit/16bit 数据接口。
2024-08-30 08:30:02 89
原创 USB PHY—— PHY 基础
HSIC (USB 2.0 High Speed Inter Chip)(高速芯片间)是USB芯片间互连的行业标准,具有2信号(选通,数据)源同步串行接口,使用240 MHz DDR信令仅提供高速率。HSIC 是 USB 2.0的芯片到芯片变体,它消除了普通USB中的传统模拟收发器。速度可达480M,是IIC的理想替代。USB 信号传输前,需要通过 PHY 把 USB 控制器的数字信号转成线缆上的模拟信号。芯片厂商开发了一些 USB PHY 芯片,可以把 DP、DM上的差模信号转成共模信号。
2024-08-29 21:17:45 260
原创 音频——性能测试中的基本概念
理想情况下,输入幅度相同的不同频率信号,过音频设备后输出幅度也是相同的,就是趋于一条直线。如果信噪比过低,那么噪声可能对音频信号产生干扰,实际体验就会感觉音质模糊、音乐或通话人声的清晰度降低。总谐波失真(THD_Total Harmonic Distortion)是指信号在测量频率范围内的所有谐波的能量占主频信号能量的百分比,用于描述信号谐波强弱。THD+N就是在THD的基础上增加了底噪,可以通过一个参数来评估谐波和底噪信号的强弱。音频系统输出的背景噪声强度,是音频系统中除有用信号以外的总噪声。
2024-06-20 20:57:55 310
原创 USB 端点停止
握手包中有一个 STALL 包,由 USB 设备方发出,用来表示某个端点不能发送或者接收数据,或者表示不支持控制传输的某种请求。端点一旦发出 STALL 包,表示其处于停止状态,在停止状态被清除前,该端点不能行使其功能。同时,只有 USB 设备可以返回 STALL 包,USB 主机在任何情况下都不能发送 STALL 包。针对 USB 设备的不同端点,STALL 包在两种不同的情况下使用:功能停止(function stall),和协议停止(protocol stall)。
2024-06-18 21:14:41 217
原创 PDM 测试
AP 的 output 选择 PDM,MCU 提供 Bit clock,AP 生成 PDM 数据,AP 配置如下。这里只抓取 DMIC 的 Clock 信号,如下图。AP 的输入选择差分输入,并配置频率范围为。如果使用 AP 需要注意公地。
2024-06-18 21:01:30 307
原创 I2C ——驱动
sys/bus/i2c/devices 目录下存放着所有的 I2C 设备,如果设备树正确编译的话可以看到。文件中描述了 I2C 总线的相关信息,以及 I2C 总线下的设备节点信息。器件地址,进入该目录,并打印设备名字如下。可以看到 i2c 设备驱动已经成功匹配。就是 i2c1,下面有一个节点。
2024-06-12 20:20:37 463
原创 【MMU】——MMU 权限控制
在 ARMv7 架构中 domain 被废弃,通常情况下将所有的 domain ID 设置为 0,并且 DACR(Domain Access Control Register) 所有的域设置为 client。不可执行区域,例如设备地址空间通常标记为不可执行区域,如果有指令预取访问了该空间,就会触发指令预取异常。TEX C B bit 控制信息。
2024-06-08 02:15:00 139
原创 【MMU】——ARM 一级页表
bit[31:20] 共 12 位,index = 2^12 = 4096 个所以一级页表共有 4096 个,即 0-4095,每个 index 放 4 bytes 数据,每个一级页表项控制 1MB section 空间,共 4GB 空间。一级页表占用空间 4096 * 4bytes = 16KB。从上图可以看出 L1 页表项有四种可能类型。一级页表项即 entry 的格式如下。
2024-06-07 02:00:00 171
原创 【MMU】——MMU 相关的 CP15 寄存器
此时的 c1 就是 SCTLR 寄存器,也就是系统控制寄存器,这个是 c1 的基本作用。SCTLR 寄存器主要是完成控制功能的,比如使能或者禁止 MMU ,c1 作为 SCTLR 寄存器的时候其含义如下图。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。
2024-06-07 01:30:00 213
原创 【MMU】——简介
Memory Manage Unit 存储器管理单元是一种硬件模块,用于在 CPU 和内存之间实现虚拟内存管理。其主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。MMU是现代计算机操作系统中重要的组成部分,可以提高系统的稳定性和安全性。
2024-06-06 02:00:00 209
原创 【GIC400】—— SPI(EPIT1 Timer)
SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断)。比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。ID32~ID1019:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断,本节主要介绍 EPIT1 Timer 中断。GPIO,UART 等中断的均属于。IRQn_Type 中中断号为。
2024-06-05 02:15:00 86
原创 【GIC400】——SGI 软件中断
SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器 GICD_SGIR 写入数据来触发。ID0~ID15:这 16 个 ID 分配给 SGI。这里只介绍用到的部分。
2024-06-05 02:00:00 541
原创 【GIC400】——GIC 相关的 CP15 寄存器
当 MRC/MCR 指令中的 CRn=c12,opc1=0,CRm=c0,opc2=0 的时候就表示此时 c12 为 VBAR 寄存器,也就是向量表基地址寄存器。设置中断向量表偏移的时候就需要将新的中断向量表基地址写入 VBAR 中,比如在前面的例程中,代码链接的起始地址为0x80000000,而中断向量表肯定要放到最前面,也就是0x80000000这个地址处。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。本文主要介绍和中断相关的 CP15 寄存器。
2024-06-04 18:17:27 97
原创 【GIC400】——GIC 简介
Cortex-M 的中断控制器叫做 NVIC,Cortex-A 的中断控制器叫做 GIC。GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的NVIC。目前 GIC 有 4 个版本:V1-V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大量的使用。
2024-06-04 18:17:14 284
原创 【GIC400】——PLIC,NVIC 和 GIC 中断对比
是中断向量表,当指定的中断发生以后就会调用对应的中断复位函数,比如复位中断发生以后就会执行第 1 行代码,也就是调用函数 Reset_Handler,函数 Reset_Handler 就是复位中断的中断复位函数,其它的中断同理。就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推,最后一个中断服务函数的入口地址,这样 STM32F407 的中断向量表就建好了。跟 NVIC 一样,GIC 也有中断向量表,中断向量表也是在代码的最前面。
2024-06-03 21:53:33 547
原创 【ARMv7-A】——CP15 协处理器
这种机制有些类似于 ARM 中的寄存器,当处于不同的处理器模式时某些 ARM 寄存器可能有不同的物理寄存器,比如 SPSR 寄存器,每一种处理器模式下都对应一个独立的物理寄存器(用户模式和系统模式对应同样的物理寄存器,这是一个例外)MRC:将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断(例如在 USER 模式下操作协处理器)。下面的指令将协处理器 CP15 的寄存器 C0 寄存器的数据传送到 ARM 寄存器 R0 中。
2024-06-02 16:45:47 460
原创 【GIC400】—— PPI (Generic Timer)
Generic Timer 是 ARMv7-A 内核中的通用定时器,包括: A Non-secure physical timer, A Secure physical timer, A virtual timer。不同的扩展有不同的 timer.不同的扩展对应的 Timer 寄存器如下本文主要介绍 secure physical timer。
2024-06-02 16:17:19 268
原创 【ARMv7-A】——ATPCS(ARM-Thumb 过程调用标准)
ARMv7-A 的 ATPCS(ARM-Thumb Procedure Call Standard),也称为 AAPCS(ARM Architecture Procedure Call Standard),规定了 ARM 架构中函数调用的标准和约定。它定义了函数调用时寄存器的使用、参数传递、返回值、栈帧布局等规范。以下是对 ARMv7-A 的 ATPCS 的详细介绍。
2024-05-28 18:12:31 455
原创 【ARMv7-A】——WFE(wait for event)
WFI (Wait for interrupt) 和 WFE (Wait for event) 是两个让 ARM 核进入 low-power standby 模式的指令,由 ARM architecture 定义,由 ARM core 实现。ARM 架构中的 WFE 指令(Wait For Event,等待事件)是一种低功耗指令,用于使处理器进入低功耗状态,直到某个事件发生。WFE 指令的使用场景和 WFI(Wait For Interrupt)类似,但它能处理更广泛的事件,而不仅仅是中断。
2024-05-28 12:49:32 275
原创 【ARMv7-A】——WFI(wait for interrupt)
执行 WFI 指令后,处理器停止执行下一条指令并进入等待状态,只有在接收到中断请求或特定事件时,处理器才会退出等待状态并继续执行。其他相关的指令,除了 WFI,ARM 架构还提供了其他与低功耗相关的指令,如 WFE(Wait For Event),它类似于 WFI,但可以等待更广泛的事件而不仅仅是中断。WFI 是一种低功耗指令,用于在处理器处于空闲状态时降低功耗。通过正确使用 WFI 指令,可以显著降低嵌入式系统的功耗,延长设备的续航时间,同时保持系统在需要时能够迅速响应。ARM 架构中的指的是。
2024-05-27 21:30:30 392
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人