diff --git a/CH32V305/src/USBD/ch32v30x_usbhs_device.c b/CH32V305/src/USBD/ch32v30x_usbhs_device.c index b42b87e..539f7af 100644 --- a/CH32V305/src/USBD/ch32v30x_usbhs_device.c +++ b/CH32V305/src/USBD/ch32v30x_usbhs_device.c @@ -258,6 +258,11 @@ void USBHS_IRQHandler( void ) len = USB_StringSerialNbr[0]; break; + case 4: + pUSBHS_Descr = USB_StringInterface; + len = USB_StringInterface[0]; + break; + default: error = 0xFF; break; @@ -269,9 +274,12 @@ void USBHS_IRQHandler( void ) len = USB_QualifierDesc[0]; break; +#ifndef DAP_FW_V1 case USB_DESCR_TYP_BOS: - error = 0xFF; + pUSBHS_Descr = BOS_Descriptor; + len = BOS_Descriptor[0] + BOS_Descriptor[5]; break; +#endif default : error = 0xFF; @@ -481,7 +489,13 @@ void USBHS_IRQHandler( void ) } 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 { @@ -564,6 +578,18 @@ void USBHS_IRQHandler( void ) 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 { /* Non-standard request endpoint 0 Data upload */ diff --git a/CH32V305/src/USBD/usb_desc.c b/CH32V305/src/USBD/usb_desc.c index e9bd4a8..6f827f4 100644 --- a/CH32V305/src/USBD/usb_desc.c +++ b/CH32V305/src/USBD/usb_desc.c @@ -97,7 +97,7 @@ const uint8_t USB_CfgDesc_FS[] = #endif 0x00, // bInterfaceSubClass 0x00, // bInterfaceProtocol - 0x00, // iInterface + 0x04, // iInterface #ifdef DAP_FW_V1 // HID Descriptor @@ -246,7 +246,7 @@ const uint8_t USB_CfgDesc_HS[] = #endif 0x00, // bInterfaceSubClass 0x00, // bInterfaceProtocol - 0x00, // iInterface + 0x04, // iInterface #ifdef DAP_FW_V1 // 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 */ const uint8_t USB_QualifierDesc[] = { @@ -423,3 +432,75 @@ const uint8_t USB_QualifierDesc[] = 0x01, // bNumConfigurations 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}" +}; diff --git a/CH32V305/src/USBD/usb_desc.h b/CH32V305/src/USBD/usb_desc.h index d6567cc..7679199 100644 --- a/CH32V305/src/USBD/usb_desc.h +++ b/CH32V305/src/USBD/usb_desc.h @@ -63,9 +63,17 @@ extern const uint8_t USB_StringLangID[]; extern const uint8_t USB_StringVendor[]; extern const uint8_t USB_StringProduct[]; extern uint8_t USB_StringSerialNbr[]; +extern const uint8_t USB_StringInterface[]; extern const uint8_t USB_QualifierDesc[]; extern const uint8_t HID_ReportDesc_FS[]; 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__ diff --git a/CH32V305/src/main.c b/CH32V305/src/main.c index 78a68ac..4b0bd14 100644 --- a/CH32V305/src/main.c +++ b/CH32V305/src/main.c @@ -7,6 +7,12 @@ #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; diff --git a/README.md b/README.md index d627da8..23da918 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,10 @@ Sch & PCB: [https://oshwhub.com/xivn1987/daplink](https://oshwhub.com/xivn1987/d ## DAPLink-CH32V305 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 | 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 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 WINUSB | Erased 524288 bytes (8 sectors), programmed 524288 bytes (512 pages), skipped 0 bytes (0 pages) at 39.40 kB/s |