/* * Copyright (c) 2023 ~ 2025, sakumisu * Copyright (c) 2023 ~ 2025, HalfSweet * * SPDX-License-Identifier: Apache-2.0 */ #ifndef DAP_MAIN_H #define DAP_MAIN_H #include "usbd_core.h" #include "usbd_cdc.h" #include "usbd_msc.h" #include "chry_ringbuffer.h" #include "DAP_config.h" #include "DAP.h" #define DAP_IN_EP 0x81 #define DAP_OUT_EP 0x02 #define CDC_IN_EP 0x83 #define CDC_OUT_EP 0x04 #define CDC_INT_EP 0x85 #define MSC_IN_EP 0x86 #define MSC_OUT_EP 0x07 #define USBD_VID 0x0D28 #define USBD_PID 0x0204 #define USBD_MAX_POWER 500 #define USBD_LANGID_STRING 1033 #define CMSIS_DAP_INTERFACE_SIZE (9 + 7 + 7) #ifdef CONFIG_CHERRYDAP_USE_MSC #define CONFIG_MSC_DESCRIPTOR_LEN CDC_ACM_DESCRIPTOR_LEN #define CONFIG_MSC_INTF_NUM 1 #define MSC_INTF_NUM (0x02 + 1) #else #define CONFIG_MSC_DESCRIPTOR_LEN 0 #define CONFIG_MSC_INTF_NUM 0 #define MSC_INTF_NUM (0x02) #endif #ifdef CONFIG_USB_HS #if DAP_PACKET_SIZE != 512 #error "DAP_PACKET_SIZE must be 512 in hs" #endif #else #if DAP_PACKET_SIZE != 64 #error "DAP_PACKET_SIZE must be 64 in fs" #endif #endif #define USBD_WINUSB_VENDOR_CODE 0x20 #define USBD_WEBUSB_ENABLE 0 #define USBD_BULK_ENABLE 1 #define USBD_WINUSB_ENABLE 1 /* WinUSB Microsoft OS 2.0 descriptor sizes */ #define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 #define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 #define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 #define FUNCTION_SUBSET_LEN 160 #define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 #define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) #define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) #define USBD_WEBUSB_DESC_LEN 24 #define USBD_WINUSB_DESC_LEN 28 #define USBD_BOS_WTOTALLENGTH (0x05 + \ USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) #define CONFIG_UARTRX_RINGBUF_SIZE (8 * 1024) #define CONFIG_USBRX_RINGBUF_SIZE (8 * 1024) #ifdef __cplusplus extern "C" { #endif extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t uartrx_ringbuffer[CONFIG_UARTRX_RINGBUF_SIZE]; extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usbrx_ringbuffer[CONFIG_USBRX_RINGBUF_SIZE]; extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usb_tmpbuffer[DAP_PACKET_SIZE]; extern const struct usb_descriptor cmsisdap_descriptor; extern __ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[]; extern __ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[]; extern char *string_descriptors[]; extern struct usbd_interface dap_intf; extern struct usbd_interface intf1; extern struct usbd_interface intf2; extern struct usbd_interface intf3; extern struct usbd_interface hid_intf; extern struct usbd_endpoint dap_out_ep; extern struct usbd_endpoint dap_in_ep; extern struct usbd_endpoint cdc_out_ep; extern struct usbd_endpoint cdc_in_ep; extern chry_ringbuffer_t g_uartrx; extern chry_ringbuffer_t g_usbrx; __STATIC_INLINE void chry_dap_init(uint8_t busid, uint32_t reg_base) { chry_ringbuffer_init(&g_uartrx, uartrx_ringbuffer, CONFIG_UARTRX_RINGBUF_SIZE); chry_ringbuffer_init(&g_usbrx, usbrx_ringbuffer, CONFIG_USBRX_RINGBUF_SIZE); DAP_Setup(); usbd_desc_register(0, &cmsisdap_descriptor); /*!< winusb */ usbd_add_interface(0, &dap_intf); usbd_add_endpoint(0, &dap_out_ep); usbd_add_endpoint(0, &dap_in_ep); /*!< cdc acm */ usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf1)); usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf2)); usbd_add_endpoint(0, &cdc_out_ep); usbd_add_endpoint(0, &cdc_in_ep); #ifdef CONFIG_CHERRYDAP_USE_MSC usbd_add_interface(0, usbd_msc_init_intf(0, &intf3, MSC_OUT_EP, MSC_IN_EP)); #endif extern void usbd_event_handler(uint8_t busid, uint8_t event); usbd_initialize(busid, reg_base, usbd_event_handler); } void chry_dap_handle(void); void chry_dap_usb2uart_handle(void); void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_coding); void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len); void chry_dap_usb2uart_uart_send_complete(uint32_t size); #ifdef __cplusplus } #endif #endif