USB开发-----实现USB Audio 带Feedback端点,录音播放
文章目录
- 一、USB Audio的配置描述符
- 二、描述符的结构
- 三、关于反馈端点的几个说明
- 1.计算10.14格式采样率代码(audio 1.0)
- 2.计算16.16格式采样率代码(audio 2.0)
- 3.其它相关说明
- 四、关于STM32实现USB Audio的相关说明
- 1. 一些重要的函数,经常要修改的。
- 2.最好不使用USBD_malloc分配数据,有可能失败。
- 3.新增端点时的操作
- 五、资料下载与技术讨论
本使使用的是stm32F105开发,带USB OTG FS接口
一、USB Audio的配置描述符
__ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALIGN_END =
{/* Configuration 1 */0x09, /* bLength */USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType */LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ), /* wTotalLength 109 bytes*/HIBYTE(USB_AUDIO_CONFIG_DESC_SIZ), 0x03, //NumInterfaces:3 0x01, //ConfigurationValue 0x00, //Configuration String 0x80, //Attributes:Bus Power 0xfa, //MaxPower = 0xfa*2ma /**********************Audio Interface Descriptor(No.0):0x04**********************///第一个接口,控制接口0x09, //Length 0x04, //DescriptorType:Inerface 0x00, //InterfaceNum:0 0x00, //AlternateSetting:0 0x00, //NumEndpoint:0 0x01, //InterfaceClass:audio 0x01, //InterfaceSubClass:audio ctl0x00, //InterfaceProtocol 0x00, //Interface String /*******************AC Header of Interface Descriptor:0x24 0x01*************************/ 0x0a, //Length 0x24, //DescriptorType:audio interface descriptor 0x01, //DescriptorSubType:audio control header 0x00,0x01, //bcdADC:audio Device Class v1.00 0x48, 0x00, //TotalLength:0x0048 (这个长度应该是特性单元跟Terminal描述符的总长度,包括自己 Total size of class specific descriptors.) 0x02, //InCollection:2 AudioStreaming interface 0x01, //InterfaceNr(2) - AS #1 id AudioStreaming interface 2 belongs to this AudioControl interface 0x02, //InterfaceNr(1) - AS #2 id AudioStreaming interface 1 belongs to this AudioControl interface /******************* AC Specific type of Input Terminal:0x24 0x02*************************/ //ID10x0c, //Length 0x24, //DescriptorType:audio interface descriptor 0x02, //DescriptorSubType:Input Terminal 0x01, //TerminalID:0x01 0x01,0x02, //TerminalType:USB Microphone 0x00, //AssocTerminal 0x02, //NrChannels:2 channel 0x03, 0x00, //ChannelConfig:Left Front,Right Front, 0x00, //ChannelName String 0x00, //Terminal String /*******************Audio Class Specific type of Feature Unit:0x24 0x06*************************/ //ID20x0a, //Length 0x24, //DescriptorType:audio interface descriptor0x06, //DescriptorSubType:Audio Feature Unit 0x02, //UnitID:0x02 0x01, //SourceID:1 #Microphone IT 0x01, //ControlSize:1 byte 0x01, //Controls:Mute 0x02, //Controls(0):Volume 0x02, //Controls(1):Volume 0x00, //Feature String /*******************Audio Class Specific type of Output Terminal:0x24 0x03*************************/ //ID30x09, //Length 0x24, //DescriptorType:audio interface descriptor 0x03, //DescriptorSubTYpe:Output Terminal 0x03, //TerminalID:0x03 0x01,0x01, //TerminalType:USB Streaming 0x00, //AssocTerminal:ID 0 0x02, //SourceID:2 #Feature UNIT (ID 2作为控制microphone音量 - by ywj) 0x00, //Terminal String /******************* Audio Class Specific type of Input Terminal:0x24 0x02*************************/ //ID40x0c, //Length 0x24, //DescriptorType:audio interface descriptor0x02, //DescriptorSubType:Input Terminal 0x04, //TerminalID:0x04 0x01,0x01, //TerminalType:USB Streaming 0x00, //AssocTerminal 0x02, //NrChannels:2 channel 0x03,0x00, //ChannelConfig:Left Front,Right Front, 0x00, //ChannelName String 0x00, //Terminal String /*******************Audio Class Specific type of Feature Unit:0x24 0x06*************************/ //ID50x0a, //Length 0x24, //DescriptorType:audio interface descriptor0x06, //DescriptorSubType:Audio Feature Unit 0x05, //UnitID:0x05 0x04, //SourceID:4 #USB Streaming IT 0x01, //ControlSize:1 byte 0x01, //Controls:Mute, 0x02, //Controls(0):Volume 0x02, //Controls(1):Volume 0x00, //Feature String /*******************Audio Class Specific type of Output Terminal:0x24 0x03*************************/ //ID60x09, //Length 0x24, //DescriptorType:audio interface descriptor0x03, //DescriptorSubTYpe:Output Terminal 0x06, //TerminalID:0x06 0x01, 0x03, //TerminalType:Speaker 0x00, //AssocTerminal: 0x05, //SourceID:5 #Feature UNIT (ID 5作为控制speak音量 - by ywj) 0x00, //Terminal String/*****************Audio Recorder Interface descriptor(No.1):0x04***********************/ //录音部分 - audioStreaming interface 1//Operational Alternate Setting 00x09, //Length 0x04, //DescriptorType:Interface 0x01, //InterfaceNum:1 0x00, //AlternateSetting:0 0x00, //NumEndpoint:0 0x01, //InterfaceClass:audio 0x02, //InterfaceSubClass:audio streaming0x00, //InterfaceProtocol 0x00, //Interface String /*****************Audio Recorder Interface descriptor(No.1):0x04***********************/ //Operational Alternate Setting 10x09, //Length 0x04, //DescriptorType:Interface 0x01, //InterfaceNum:1 0x01, //AlternateSetting:1 0x01, //NumEndpoint:1 0x01, //InterfaceClass:audio 0x02, //InterfaceSubClass:audio streaming0x00, //InterfaceProtocol 0x00, //Interface String /*******************AS descriptor subtype Descriptor:0x24 0x01*************************/ 0x07, //Length 0x24, //DescriptorType:audio interface descriptor 0x01, //DescriptorSubType:AS_GENERAL 0x03, //TerminalLink:#3USB USB Streaming OT //Linked to USB Streaming In Terminal 0x00, //Delay:0 接口延时 0x01,0x00, //FormatTag:PCM /****************** Audio Class Specific type I format INTERFACE Descriptor: 0x24 0X02 ***********/ //设置音频流的格式0x0b, //Length 0x24, //DescriptorType:audio interface descriptor0x02, //DescriptorSubType:Format_type 0x01, //FormatType:Format type 1 0x02, //NumberOfChanne:2 0x03, //SubframeSize:2byte 24, //BitsResolution:16bit 0x01, //SampleFreqType:One sampling frequency. AUDIO_SAMPLE_FREQ(USBD_AUDIO_FREQ), //采样率两个字节 /******************************* Audio Recorder IN ENDPOINT descriptor: 0x05 *******************************/0x09, //Length 0x05, //DescriptorType:endpoint descriptor 0x82, //EndpointAddress:Input endpoint 2 0x01 | 0x04 | (0x2 << 4U),AUDIO_PACKET_SZE(AUDIO_OUT_PACKET), 0x01, //Interval 0x00,0x00, /******************************* Audio Class Specific ENDPOINT Descriptor: 0x25 0x01*******************************/ 0x07, //Length 0x25, //DescriptorType:audio endpoint descriptor 0x01, //DescriptorSubType:audio endpiont general 0x00, //Attributes:0x00........ 0x00, //LockDelayUnits 0x00,0x00, //LockDelay /***********************Audio Speaker Interface descriptor(No.2):0x04*****************************/ //播放部分开始0x09, //Length 0x04, //DescriptorType:Interface 0x02, //InterfaceNum:2 0x00, //AlternateSetting:0 0x00, //NumEndpoint:0 0x01, //InterfaceClass:audio 0x02, //InterfaceSubClass:audio streaming0x00, //InterfaceProtocol 0x00, //Interface String /***********************Audio Speaker Interface descriptor(No.2):0x04*****************************/ 0x09, //Length 0x04, //DescriptorType:Interface 0x02, //InterfaceNum:2 0x01, //AlternateSetting:1 0x02, //NumEndpoint:2 //这里包括一个反馈端点 0x01, //InterfaceClass:audio 0x02, //InterfaceSubClass:audio streaming0x00, //InterfaceProtocol 0x00, //Interface String /*******************AS_GENERAL descriptor subtype Descriptor:0x24 0x01*************************/ 0x07, //Length 0x24, //DescriptorType:audio interface descriptor0x01, //DescriptorSubType:AS_GENERAL 0x04, //TerminalLink:#4 USB Streaming IT 0x01, //Delay:1 0x01,0x00, //FormatTag:PCM /****************** Audio Class Specific type I format INTERFACE Descriptor: 0x24 0X02 ***********/ 0x0b, //Length 0x24, //DescriptorType:audio interface descriptor0x02, //DescriptorSubType:Format_type 0x01, //FormatType:Format type 1 0x02, //NumberOfChanne:1 0x03, //SubframeSize:3byte 24, //BitsResolution:24bit 0x01, //SampleFreqType:One sampling frequency. AUDIO_SAMPLE_FREQ(USBD_AUDIO_FREQ), /******************************* Audio Speaker OUT ENDPOINT descriptor: 0x05 *******************************/ //播放端点描述符 0x09, //Length 0x05, //DescriptorType:endpoint descriptor 0x01, //EndpointAddress:Output endpoint 01 0x01 | 0x04, //Attributes:0x05,Isochronous,Synchronization Type(Asynchronous)......... AUDIO_PACKET_SZE(AUDIO_OUT_PACKET), 0x01, //Interval AUDIO_OUT_PACKET 0x00, //没有使用0x81, //这个值是反馈端点的端点号 bSynchAddress:同步端点的地址/******************************* Audio Class Specific ENDPOINT Descriptor: 0x25 0x01*******************************/ 0x07, //Length 0x25, //DescriptorType:audio endpoint descriptor 0x01, //DescriptorSubType:audio endpiont general 0x00, //Attributes:0x00............. 0x00, //LockDelayUnits 0x00,0x00, //LockDelay //反馈端点描述符/******************************* Audio feedback IN ENDPOINT descriptor: 0x05 *******************************/0x09, /* bLength */0x05, /* bDescriptorType */AUDIO_FEEDBACK_EP,0x01 | 0x04 | 0x10, /* Types -Transfer: ISOCHRONOUSSync: AsyncUsage: Feedback EP */0x04, /* wMaxPacketSize */0x00, /* wMaxPacketSize */0x03, /* interval polling(2^x ms) */0x05, //这个字节也是有用的,好像是控制时间的。0x00,} ;
二、描述符的结构
下图从usb audio 1.0的规范里截取.规范的最后面有相关的描述符例程.
三、关于反馈端点的几个说明
1.计算10.14格式采样率代码(audio 1.0)
这里反馈端点反馈的数据是3个字节的。
/*该设备为:44.1K采样率,10.14格式*/
uint8_t audioFeedBackBuffer[4] = {0x40,0x06,0x0b};
void SetFeedBackSampleRate(uint32_t Rata)
{Rata = ((Rata / 1000) << 14) | ((Rata % 1000) << 4);audioFeedBackBuffer[0] = Rata;audioFeedBackBuffer[1] = Rata>>8;audioFeedBackBuffer[2] = Rata>>16;
}
2.计算16.16格式采样率代码(audio 2.0)
这部分代码是 通过USB声卡反推出来的,实测可以用。感觉跟USB2.0规范描述不一样。
这里反馈端点反馈的数据是4个字节的。
uint8_t audioFeedBackBuffer[4];
void SetFeedBackSampleRate(uint32_t Rata)
{Rata = ((Rata / 1000) << 13) | ((Rata % 1000) << 3);audioFeedBackBuffer[0] = Rata;audioFeedBackBuffer[1] = Rata>>8;audioFeedBackBuffer[2] = Rata>>16;audioFeedBackBuffer[4] = Rata>>24;
}
3.其它相关说明
- 反馈端点描述符增加时,不要忘记在接口描述符中修改接口所使用的端点数量。要增加一个。
- 反馈端点没有数据发送完成中断(至少stm32跟RT1052是这样子的),也就是说主动反馈,不会收到发送完成中断。
- 使用反馈端点时,端点描述符要0x09字节的长度,最后一个字节也要改成反馈端点的地址。
- 反馈端点描述符好像是倒数第二字节用于计算主机访问时间的。
四、关于STM32实现USB Audio的相关说明
1. 一些重要的函数,经常要修改的。
USBD_AUDIO_Init,USBD_AUDIO_DeInit,USBD_AUDIO_Setup,USBD_AUDIO_EP0_TxReady,USBD_AUDIO_EP0_RxReady,USBD_AUDIO_DataIn,USBD_AUDIO_DataOut,USBD_AUDIO_SOF,USBD_AUDIO_IsoINIncomplete,USBD_AUDIO_IsoOutIncomplete,USBD_AUDIO_GetCfgDesc,USBD_AUDIO_GetCfgDesc,USBD_AUDIO_GetCfgDesc,USBD_AUDIO_GetDeviceQualifierDesc,
2.最好不使用USBD_malloc分配数据,有可能失败。
pdev->pClassData = USBD_malloc(sizeof(USBD_AUDIO_HandleTypeDef));
3.新增端点时的操作
1、USBD_AUDIO_Init 函数中打开端点 USBD_LL_OpenEP();
2、USBD_AUDIO_DeInit函数中关闭端点 USBD_LL_CloseEP();
3 、USBD_LL_Init 配置端点的缓冲区。HAL_PCDEx_SetTxFiFo、HAL_PCDEx_SetRxFiFo
4 、关于IN端点提交数据(有时候多次提交没有发送成功,应该会占用缓冲区.需要用HAL_PCD_EP_Flush清除下)
HAL_PCD_EP_Flush(pdev->pData, AUDIO_IN_EP); HAL_PCD_EP_Transmit(pdev->pData,AUDIO_IN_EP,(uint8_t *)&dump_buffer[0],288);
五、资料下载与技术讨论
由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
QQ:872180981
群号:339420387
USB开发-----实现USB Audio 带Feedback端点,录音播放相关推荐
- USB开发—STM32 USB Audio 开发板介绍(Feedback)
USB开发-STM32 USB Audio 开发板介绍(Feedback) 一.背景 我个人从事音频行业有好几年的时间.后面慢慢的做起了声卡,也就是USB Audio.自己也走了不少的弯路.之前一起是 ...
- 音视频开发刚入门该如何实现一个录音/播放器
如果你从未接触过音视频开发,但有实现一个录音器.播放器的需求或想法,本文会是一个比较好的入门内容. 本博客是从基础内容到具体的实践,再展现一个简易的整体框架,内容主要有: 1.音频基础知识,可以了解音 ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- 【安卓USB开发】让手机与物联网设备鹊桥相会
安卓USB开发详解 一.前言 1.是什么 2.为什么 3.怎么做 二.简析USB 1.外部总线标准 2.主从结构星型拓扑 3.自.总供电模式 4.OTG 5.数据传输模式 6.小结 三.安卓USB开发 ...
- USB虚拟串口实验_STM32F1开发指南——USB学习笔记
前言 STM32F103系列芯片都自带USB接口,不过STM32F103的USB都只能用来做设备,而不能用作主机. 目录: 53.1 USB简介 USBF103自带的USB符合USB2.0规范. ...
- USB开发基础:USB设备的开发流程
USB设备的开发一般包括主机端(上位机)驱动程序的开发(如果您的USB设备符合某一标准设备类且主机端已经提供了此类设备的驱动程序的话,则可以省掉此步骤)和USB设备端驱动程序的开发,有时还可能包括主机 ...
- 安卓USB开发教程 五 安卓 AOA 1.0
Android Open Accessory Protocol 1.0(AOA 协议 1.0) Android USB 配件必须遵从 Android Open Accessory(AOA)协议,该协议 ...
- STM32 USB 开发(一)HID Slave 通信
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.开发板USB硬件 二.STM32CubeMX 设置 1.设置小灯灯和串口 2.开启USB 3.时钟设置 三.KEI ...
- FPGA基础入门【12】开发板USB鼠标控制
上一篇教程介绍了NEXYS4 开发板中UART串口通信的使用方式,这一篇介绍USB接口接收鼠标和键盘信号 FPGA基础入门[12]开发板USB鼠标控制 开发板USB芯片 信号时序图 鼠标初始化 逻辑设 ...
最新文章
- 你真的了解javascript吗?(一)
- Junit指定测试执行顺序
- 【ArcGIS遇上Python】ArcGIS Python中文编码问题案例详解
- php mysql刷新表格_php读入mysql数据并以表格形式显示(表单实现无刷新提交)
- 【AI视野·今日NLP 自然语言处理论文速览 第五期】Thu, 10 Jun 2021
- 【FLink】Flink checkpoint 实现数据连续计算 恢复机制 案例实战
- 右键打开方式添加应用程序无法设置
- JS 和 Java 中URL特殊字符编码方式
- css的list,CSS List 入门教程
- 057 生成器和生成器表达式
- Maya2014/2015/2016/2017/2018/2019安装包及安装教程
- python背包问题并行_背包问题九讲python3实现
- 编译原理 实验3《算符优先分析法设计与实现》
- 期权定价Python实现
- 如何在 Mac 上使用屏幕保护程序?
- 安装 emoji 字体
- Delphi XE10让android的界面设计摆脱繁杂
- Android端如何简单的防黑产
- redis基础命令和数据操作命令学习笔记
- 免费范文网复制内容-百味书屋
热门文章
- 学习HCIA认证的day.1
- android播放器实例,android音乐播放器实例
- 北邮22信通:实验六 由运放器构成的音频放大电路设计、仿真、测试报告
- 关于sketchup模型导入revit编辑问题
- net.sf.json.JsonConfig 使用详解
- Android简易图片管理器,一个简单仿微信朋友圈的图片查看器 PhotoViewer
- IDC中招刷流量病毒,无法访问的解决过程
- 使用 windows 命令启动某个程序
- C++ 之函数调用操作符和函数对象
- anaconda 换源(2022)