add CH32V305 WINUSB support

master
XIVN1987 7 months ago
parent 8838d1685c
commit 9f8c3ce112
  1. 30
      CH32V305/src/USBD/ch32v30x_usbhs_device.c
  2. 85
      CH32V305/src/USBD/usb_desc.c
  3. 8
      CH32V305/src/USBD/usb_desc.h
  4. 6
      CH32V305/src/main.c
  5. 5
      README.md

@ -258,6 +258,11 @@ void USBHS_IRQHandler( void )
len = USB_StringSerialNbr[0]; len = USB_StringSerialNbr[0];
break; break;
case 4:
pUSBHS_Descr = USB_StringInterface;
len = USB_StringInterface[0];
break;
default: default:
error = 0xFF; error = 0xFF;
break; break;
@ -269,9 +274,12 @@ void USBHS_IRQHandler( void )
len = USB_QualifierDesc[0]; len = USB_QualifierDesc[0];
break; break;
#ifndef DAP_FW_V1
case USB_DESCR_TYP_BOS: case USB_DESCR_TYP_BOS:
error = 0xFF; pUSBHS_Descr = BOS_Descriptor;
len = BOS_Descriptor[0] + BOS_Descriptor[5];
break; break;
#endif
default : default :
error = 0xFF; error = 0xFF;
@ -481,7 +489,13 @@ void USBHS_IRQHandler( void )
} }
else if(USBHS_Setup.bRequestType & USB_REQ_TYP_VENDOR) else if(USBHS_Setup.bRequestType & USB_REQ_TYP_VENDOR)
{ {
error = 0xFF; if((USBHS_Setup.bRequest == WINUSB_VENDOR_CODE) && (USBHS_Setup.wIndex == 7))
{
pUSBHS_Descr = MS_OS_20_DescriptorSet;
len = MS_OS_20_DescriptorSet[8];
}
else
error = 0xFF;
} }
else else
{ {
@ -564,6 +578,18 @@ void USBHS_IRQHandler( void )
break; break;
} }
} }
#ifndef DAP_FW_V1
else if((USBHS_Setup.bRequestType & USB_REQ_TYP_MASK) == USB_REQ_TYP_VENDOR)
{
len = USBHS_Setup.wLength >= USB_MAX_EP0_SZ ? USB_MAX_EP0_SZ : USBHS_Setup.wLength;
memcpy(USBHS_EP0_Buf, pUSBHS_Descr, len);
USBHS_Setup.wLength -= len;
pUSBHS_Descr += len;
USBHSD->UEP0_TX_LEN = len;
USBHSD->UEP0_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;
}
#endif
else else
{ {
/* Non-standard request endpoint 0 Data upload */ /* Non-standard request endpoint 0 Data upload */

@ -97,7 +97,7 @@ const uint8_t USB_CfgDesc_FS[] =
#endif #endif
0x00, // bInterfaceSubClass 0x00, // bInterfaceSubClass
0x00, // bInterfaceProtocol 0x00, // bInterfaceProtocol
0x00, // iInterface 0x04, // iInterface
#ifdef DAP_FW_V1 #ifdef DAP_FW_V1
// HID Descriptor // HID Descriptor
@ -246,7 +246,7 @@ const uint8_t USB_CfgDesc_HS[] =
#endif #endif
0x00, // bInterfaceSubClass 0x00, // bInterfaceSubClass
0x00, // bInterfaceProtocol 0x00, // bInterfaceProtocol
0x00, // iInterface 0x04, // iInterface
#ifdef DAP_FW_V1 #ifdef DAP_FW_V1
// HID Descriptor // HID Descriptor
@ -410,6 +410,15 @@ uint8_t USB_StringSerialNbr[] =
}; };
/* Interface Descriptor */
const uint8_t USB_StringInterface[] =
{
USB_SIZE_STRING_PRODUCT,
USB_DESCR_TYP_STRING,
'X', 0, 'V', 0, '-', 0, 'L', 0, 'i', 0, 'n', 0, 'k', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0, 'P', 0
};
/* Device Qualified Descriptor */ /* Device Qualified Descriptor */
const uint8_t USB_QualifierDesc[] = const uint8_t USB_QualifierDesc[] =
{ {
@ -423,3 +432,75 @@ const uint8_t USB_QualifierDesc[] =
0x01, // bNumConfigurations 0x01, // bNumConfigurations
0x00, // bReserved 0x00, // bReserved
}; };
const uint8_t BOS_Descriptor[] =
{
5,
USB_DESCR_TYP_BOS,
5+20+8, 0, // wTotalLength
1, // bNumDeviceCaps
/*** MS OS 2.0 descriptor platform capability descriptor ***/
28,
DESC_CAPABILITY,
5, // bDevCapabilityType: PLATFORM (05H)
0x00,
0xDF, 0x60, 0xDD, 0xD8, // PlatformCapabilityUUID: MS_OS_20_Platform_Capability_ID (D8DD60DF-4589-4CC7-9CD2-659D9E648A9F)
0x89, 0x45, 0xC7, 0x4C,
0x9C, 0xD2, 0x65, 0x9D,
0x9E, 0x64, 0x8A, 0x9F,
0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: 0x06030000 for Windows 8.1
10+8+20+128, 0x00, // wTotalLength: size of MS OS 2.0 descriptor set
WINUSB_VENDOR_CODE, // bMS_VendorCode
0x00, // bAltEnumCmd
};
#define MS_OS_20_SET_HEADER_DESCRIPTOR 0x00
#define MS_OS_20_SUBSET_HEADER_CONFIGURATION 0x01
#define MS_OS_20_SUBSET_HEADER_FUNCTION 0x02
#define MS_OS_20_FEATURE_COMPATIBLE_ID 0x03
#define MS_OS_20_FEATURE_REG_PROPERTY 0x04
#define MS_OS_20_FEATURE_MIN_RESUME_TIME 0x05
#define MS_OS_20_FEATURE_MODEL_ID 0x06
#define MS_OS_20_FEATURE_CCGP_DEVICE 0x07
#define MS_OS_20_FEATURE_VENDOR_REVISION 0x08
const uint8_t MS_OS_20_DescriptorSet[] =
{
/*** Microsoft OS 2.0 Descriptor Set Header ***/
10, 0,
MS_OS_20_SET_HEADER_DESCRIPTOR, 0,
0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: 0x06030000 for Windows 8.1
10+8+20+128, 0, // wTotalLength
/*** Microsoft OS 2.0 function subset header ***/
8, 0,
MS_OS_20_SUBSET_HEADER_FUNCTION, 0,
0, // bFirstInterface, first interface to which this subset applies
0,
8+20+128, 0, // wSubsetLength
/*** Microsoft OS 2.0 compatible ID descriptor ***/
20, 0,
MS_OS_20_FEATURE_COMPATIBLE_ID, 0,
'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, // CompatibleID
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SubCompatibleID
/*** MS OS 2.0 registry property descriptor ***/
128, 0,
MS_OS_20_FEATURE_REG_PROPERTY, 0,
1, 0, // wPropertyDataType: 1 = Unicode REG_SZ
40, 0x00, // wPropertyNameLength
'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, 'I', 0, 'n', 0, 't', 0, 'e', 0,
'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, 'G', 0, 'U', 0, 'I', 0, 'D', 0, 0, 0, // PropertyName: "DeviceInterfaceGUID"
78, 0x00, // wPropertyDataLength
'{', 0, 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0,
'2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, '4', 0, '6', 0, '6', 0, '3', 0, '-', 0,
'A', 0, 'A', 0, '3', 0, '6', 0, '-', 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0,
'6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, '}', 0, 0, 0, // PropertyData: "{CDB3B5AD-293B-4663-AA36-1AAE46463776}"
};

@ -63,9 +63,17 @@ extern const uint8_t USB_StringLangID[];
extern const uint8_t USB_StringVendor[]; extern const uint8_t USB_StringVendor[];
extern const uint8_t USB_StringProduct[]; extern const uint8_t USB_StringProduct[];
extern uint8_t USB_StringSerialNbr[]; extern uint8_t USB_StringSerialNbr[];
extern const uint8_t USB_StringInterface[];
extern const uint8_t USB_QualifierDesc[]; extern const uint8_t USB_QualifierDesc[];
extern const uint8_t HID_ReportDesc_FS[]; extern const uint8_t HID_ReportDesc_FS[];
extern const uint8_t HID_ReportDesc_HS[]; extern const uint8_t HID_ReportDesc_HS[];
extern const uint8_t BOS_Descriptor[];
extern const uint8_t MS_OS_20_DescriptorSet[];
#define DESC_CAPABILITY 0x10
#define WINUSB_VENDOR_CODE 0x34
#endif // __USB_DESC_H__ #endif // __USB_DESC_H__

@ -7,6 +7,12 @@
#include "hid_transfer.h" #include "hid_transfer.h"
/* 在 Properties for DAPLink -> C/C++ Build -> Settings -> C Compiler -> Preprocessor 中:
DAP_FW_V1 CMSIS-DAP v1 使 HID
DAP_FW_V1 CMSIS-DAP v2 使 WINUSB
*/
volatile uint32_t SysTick_ms = 0; volatile uint32_t SysTick_ms = 0;

@ -44,6 +44,10 @@ Sch & PCB: [https://oshwhub.com/xivn1987/daplink](https://oshwhub.com/xivn1987/d
## DAPLink-CH32V305 ## DAPLink-CH32V305
DAPLink (CMSIS-DAP) based on WCH CH32V305 (High Speed USB with on-chip PHY), supports SWD, JTAG and CDC. DAPLink (CMSIS-DAP) based on WCH CH32V305 (High Speed USB with on-chip PHY), supports SWD, JTAG and CDC.
On Properties for DAPLink -> C/C++ Build -> Settings -> C Compiler -> Preprocessor page:
* Define `DAP_FW_V1`: generate CMSIS-DAP V1 firmware, using HID transport protocol.
* Do not define `DAP_FW_V1`: generate CMSIS-DAP V2 firmware, using WINUSB transfer protocol.
### Pin map ### Pin map
| FUNC | Pin | | FUNC | Pin |
| :---- | :---- | | :---- | :---- |
@ -72,3 +76,4 @@ pyocd flash -t stm32f411ce -f 5mhz random_512k.bin
| CH32V203 HID | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 17.26 kB/s | | CH32V203 HID | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 17.26 kB/s |
| CH32V203 WINUSB | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 38.16 kB/s | | CH32V203 WINUSB | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 38.16 kB/s |
| CH32V305 HID | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 35.44 kB/s | | CH32V305 HID | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 35.44 kB/s |
| CH32V305 WINUSB | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 39.40 kB/s |

Loading…
Cancel
Save