主机:WIN10 64位
设备:STM32F411+PCM5102
STM32CubeMX版本:V6.0.1
JAVA:JDK 11
--------------------------------------------------------
写这篇文章主要是给自己备忘,因对USB协议规范没有系统的了解,可能有些地方理解不是很正确。
配置CubeMX生成的工程项目,目录结构如下,主要划分为HAL层(包含了驱动层),协议层和应用层,
驱动层:stm32f4xx_ii_usb.c,提供USB硬件寄存器的配置
HAL层:stm32f4xx_hal_pcd.c,对驱动进行封装,给上层提供统一接口
协议层:usbd_core.c usbd_ctlreq.c usbd_ioreq.c,USB基础协议解析
usbd_audio.c,audio class协议解析,提供功能接口
应用层:应用功能的实现
代码文件层次结构及调用关系:
设备描述符层次结构:
1、一个USB设备只有一个设备描述符和一个配置描述符,而接口描述符可以有多个
2、从上图可以看出usb speaker有两个接口描述符,I/F 0为音频控制接口,描述了一个输入终端IT,特征单元FU和一个输出终端OT;输入终端IT为音频流类型,是一个逻辑通道,数据来源于音频流接口;输出终端OT为speaker类型,即表明数据是输出到一个实际的speaker上面;特征单元FU描述了该音频流所支持的能力,如支持mute和调节volume。I/F 1为音频流接口,该接口通过描述符指定与IT进行关联,即该音频流为指定的IT提供数据。
3、音频控制接口I/F 0没有端点,所有控制信息都是通过默认端点0进行通讯
4、音频流接口I/F 1定义了两个setting,第一个为setting 0,没有任何端点,当USB枚举完成后,会默认使用这个setting;第二个为setting 1,有实际的物理端点,当电脑选择该USB Speaker作为音频输出时,会选择该setting。
配置描述符: