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函数
文件最后添加如下函数实现
验证测试
至此,修改部分就修改完成了,可以下载到单片机上进行验证测试了。
参考链接:
- https://blog.csdn.net/gorgeousa/article/details/135370128
- 使用微软系统描述符2.0制作免驱动自定义USB设备