当前位置: 首页 > article >正文

STM32F4适配WINUSB2.0

STM32F4适配WINUSB2.0

文章目录

  • STM32F4适配WINUSB2.0
    • 通过cubeMX生成USB CDC基础工程
    • 修改代码
      • 修改usbd_conf.h文件
      • 修改usbd_def.h文件
      • 修改usbd_desc.c文件
      • 修改usbd_cdc.c文件
      • 修改usbd_ctlreq.c文件
    • 验证测试
    • 参考链接:

通过cubeMX生成USB CDC基础工程

过程略

修改代码

修改usbd_conf.h文件

在这里插入图片描述

修改usbd_def.h文件

添加如下宏定义
在这里插入图片描述
USBD_DescriptorsTypeDef结构体定义部分添加如下内容
在这里插入图片描述

修改usbd_desc.c文件

修改开始部分的宏定义
在这里插入图片描述
添加如下函数声明
在这里插入图片描述
描述符结构体定义部分修改如下
在这里插入图片描述
添加如下描述符

#if (USBD_SUPPORT_WINUSB == 1)
#define WINUSB20_WCID_DESC_SET_SIZE 162
#if defined ( __ICCARM__ ) /* IAR Compiler */
  #pragma data_alignment=4
#endif /* defined ( __ICCARM__ ) */

__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[33] __ALIGN_END =
{
  ///
  /// WCID20 BOS descriptor
  ///
  0x05,                                             /* bLength */
  USB_DESC_TYPE_BOS,                                /* bDescriptorType */
  0x21, 0x00,                                       /* wTotalLength */
  0x01,                                             /* bNumDeviceCaps */
  ///
  /// WCID20 device capability descriptor
  ///
  0x1c,                                             /* bLength */
  0x10,                                             /* bDescriptorType */
  0x05,                                             /* bDevCapabilityType */
  0x00,                                             /* bReserved */
  0xdf, 0x60, 0xdd, 0xd8, 0x89, 0x45, 0xc7, 0x4c,   /* bPlatformCapabilityUUID_16 */
  0x9c, 0xd2, 0x65, 0x9d, 0x9e, 0x64, 0x8a, 0x9f,   /* bPlatformCapabilityUUID_16 */
  0x00, 0x00, 0x03, 0x06,                           /* dwWindowsVersion */
  LOBYTE(WINUSB20_WCID_DESC_SET_SIZE), HIBYTE(WINUSB20_WCID_DESC_SET_SIZE),/* wDescriptorSetTotalLength */
  USB_REQ_GET_OS_FEATURE_DESCRIPTOR,                                 /* bVendorCode */
  0x00,    
};

__ALIGN_BEGIN const uint8_t WINUSB20_WCIDDescriptorSet[WINUSB20_WCID_DESC_SET_SIZE] __ALIGN_END = {
  ///
  /// WCID20 descriptor set descriptor
  ///
  0x0a, 0x00,                                       /* wLength */
  0x00, 0x00,                                       /* wDescriptorType */
  0x00, 0x00, 0x03, 0x06,                           /* dwWindowsVersion */
  0xa2, 0x00,                                       /* wDescriptorSetTotalLength */ 
  ///
  /// WCID20 compatible ID descriptor
  ///
  0x14, 0x00,                                       /* wLength */
  0x03, 0x00,                                       /* wDescriptorType */
  /* WINUSB */
  'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,         /* cCID_8 */
  /*  */
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   /* cSubCID_8 */
  ///
  /// WCID20 registry property descriptor
  ///
  0x84, 0x00,                                       /* wLength */
  0x04, 0x00,                                       /* wDescriptorType */
  0x07, 0x00,                                       /* wPropertyDataType */
  0x2a, 0x00,                                       /* wPropertyNameLength */
  /* DeviceInterfaceGUIDs */
  'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00,       /* wcPropertyName_21 */
  'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00,       /* wcPropertyName_21 */
  't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00,       /* wcPropertyName_21 */
  'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00,       /* wcPropertyName_21 */
  'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00,       /* wcPropertyName_21 */
  0x00, 0x00,                                       /* wcPropertyName_21 */
  0x50, 0x00,                                       /* wPropertyDataLength */
  /* {36FC9E60-C465-11CF-8056-444553540000} */
  '{', 0x00, '3', 0x00, '6', 0x00, 'F', 0x00,       /* wcPropertyData_40 */
  'C', 0x00, '9', 0x00, 'E', 0x00, '6', 0x00,       /* wcPropertyData_40 */
  '0', 0x00, '-', 0x00, 'C', 0x00, '4', 0x00,       /* wcPropertyData_40 */
  '6', 0x00, '5', 0x00, '-', 0x00, '1', 0x00,       /* wcPropertyData_40 */
  '1', 0x00, 'C', 0x00, 'F', 0x00, '-', 0x00,       /* wcPropertyData_40 */
  '8', 0x00, '0', 0x00, '5', 0x00, '6', 0x00,       /* wcPropertyData_40 */
  '-', 0x00, '4', 0x00, '4', 0x00, '4', 0x00,       /* wcPropertyData_40 */
  '5', 0x00, '5', 0x00, '3', 0x00, '5', 0x00,       /* wcPropertyData_40 */
  '4', 0x00, '0', 0x00, '0', 0x00, '0', 0x00,       /* wcPropertyData_40 */
  '0', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00      /* wcPropertyData_40 */
};
#endif

文件最后添加如下函数实现
在这里插入图片描述

修改usbd_cdc.c文件

将对应用到的配置描述符修改为如下内容

#define WINUSB_CONFIG_DESC_SIZE 32
__ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[WINUSB_CONFIG_DESC_SIZE] __ALIGN_END =
{
  /*Configuration Descriptor*/
  0x09,   /* bLength: Configuration Descriptor size */
  USB_DESC_TYPE_CONFIGURATION,      /* bDescriptorType: Configuration */
  WINUSB_CONFIG_DESC_SIZE,                /* wTotalLength:no of returned bytes */
  0x00,
  0x01,   /* bNumInterfaces: 1 interface for Game IO */
  0x01,   /* bConfigurationValue: Configuration value */
  USBD_IDX_CONFIG_STR,   /* iConfiguration: Index of string descriptor describing the configuration */
  0xC0,   /* bmAttributes: self powered */
  0x32,   /* MaxPower 0 mA */
  
  /*---------------------------------------------------------------------------*/
  /*Data class interface descriptor*/
  0x09,   /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_INTERFACE,  /* bDescriptorType: */
  0x00,   /* bInterfaceNumber: Number of Interface, zero based index of this interface */
  0x00,   /* bAlternateSetting: Alternate setting */
  0x02,   /* bNumEndpoints: Two endpoints used */
  0xff,   /* bInterfaceClass: vendor */
//  0x00,   /* bInterfaceClass: vendor */
  0x00,   /* bInterfaceSubClass: */
  0x00,   /* bInterfaceProtocol: */
  0x00,   /* iInterface: */
  
  /*Endpoint OUT Descriptor*/
  0x07,   /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,      /* bDescriptorType: Endpoint */
  CDC_OUT_EP,                        /* bEndpointAddress */
  0x02,                              /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
  0x00,                              /* bInterval: ignore for Bulk transfer */
  
  /*Endpoint IN Descriptor*/
  0x07,   /* bLength: Endpoint Descriptor size */
  USB_DESC_TYPE_ENDPOINT,      /* bDescriptorType: Endpoint */
  CDC_IN_EP,                         /* bEndpointAddress */
  0x02,                              /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
  0x00                               /* bInterval: ignore for Bulk transfer */
} ; 

修改usbd_ctlreq.c文件

添加如下函数声明
在这里插入图片描述
修改USBD_StdDevReq函数
在这里插入图片描述
修改USBD_StdItfReq函数
在这里插入图片描述
修改USBD_GetDescriptor函数
在这里插入图片描述
文件最后添加如下函数实现
在这里插入图片描述

验证测试

至此,修改部分就修改完成了,可以下载到单片机上进行验证测试了。

参考链接:

  1. https://blog.csdn.net/gorgeousa/article/details/135370128
  2. 使用微软系统描述符2.0制作免驱动自定义USB设备

http://www.kler.cn/a/469939.html

相关文章:

  • 在 ASP.NET CORE 中上传、下载文件
  • 2024AAAI SCTNet论文阅读笔记
  • 【数据可视化】数据可视化看板需求梳理模板(含示例)
  • 支付宝手机网站支付
  • Allure 集成 pytest
  • QPainter,QPen,QBrush详解
  • Tableau数据可视化与仪表盘搭建-数据可视化原理
  • 从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路
  • Spring AMQP ----消息转换器
  • C#编程中dynamic类型
  • BOOST 在计算机视觉方面的应用及具体代码分析(二)
  • 计算机网络--根据IP地址和路由表计算下一跳
  • 海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能
  • 大疆无人机炸机,视频文件打不开怎么办
  • 数据项目相关的AWS云计算架构设计
  • 基于springboot+vue的餐饮连锁店管理系统的设计与实现
  • 自学新标日初级上册第二课(复习版本)
  • 【亚马逊云科技】基于Amazon EKS部署高可用的OceanBase的最佳实践
  • 【C++项目实战】类和对象入门实践:日期类实现万字详解
  • Sam Altman 的奇点猜想 | AI日报0106
  • 鸿蒙 ArkUI实现地图找房效果
  • 【UI自动化测试】selenium八种定位方式
  • React函数组件中与生命周期相关Hooks详解
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)
  • 亚信科技研发智能化实践之路
  • RTC 案例2 :实时时钟 (掉电不丢失)