#ifndef _HSUSB_H #define _HSUSB_H /* High speed USB infrastructure for CH32V30x. Based off of the official USB stack and the current CH32X035 FS implementation. This is referenced in Chapter 22 USB Host/Device Controller (USBHD) of CH32FV2x_V3xRM.pdf */ #include "ch32fun.h" #include "usb_config.h" #include "usb_defines.h" #include struct _USBState { // Setup Request uint8_t USBHS_SetupReqCode; uint8_t USBHS_SetupReqType; uint16_t USBHS_SetupReqLen; // Used for tracking place along send. uint32_t USBHS_IndexValue; // USB Device Status uint16_t USBHS_DevConfig; uint16_t USBHS_DevAddr; uint8_t USBHS_DevSleepStatus; uint8_t USBHS_DevEnumStatus; uint8_t *pCtrlPayloadPtr; uint8_t ENDPOINTS[HUSB_CONFIG_EPS][64]; #define CTRL0BUFF (HSUSBCTX.ENDPOINTS[0]) #define pUSBHS_SetupReqPak ((tusb_control_request_t *)CTRL0BUFF) #if HUSB_HID_INTERFACES > 0 uint8_t USBHS_HidIdle[HUSB_HID_INTERFACES]; uint8_t USBHS_HidProtocol[HUSB_HID_INTERFACES]; #endif volatile uint8_t USBHS_Endp_Busy[HUSB_CONFIG_EPS]; }; // Provided functions: int HSUSBSetup(); uint8_t USBHS_Endp_DataUp(uint8_t endp, const uint8_t *pbuf, uint16_t len, uint8_t mod); // Implement the following: #if HUSB_HID_USER_REPORTS int HandleHidUserGetReportSetup(struct _USBState *ctx, tusb_control_request_t *req); int HandleHidUserSetReportSetup(struct _USBState *ctx, tusb_control_request_t *req); void HandleHidUserReportDataOut(struct _USBState *ctx, uint8_t *data, int len); int HandleHidUserReportDataIn(struct _USBState *ctx, uint8_t *data, int len); void HandleHidUserReportOutComplete(struct _USBState *ctx); #endif #if HUSB_BULK_USER_REPORTS void HandleGotEPComplete(struct _USBState *ctx, int ep); #endif extern struct _USBState HSUSBCTX; // To TX, you can use USBFS_GetEPBufferIfAvailable or USBHSD_UEP_TXBUF( endp ) static inline uint8_t *USBHS_GetEPBufferIfAvailable(int endp) { if (HSUSBCTX.USBHS_Endp_Busy[endp]) return 0; return USBHSD_UEP_TXBUF(endp); } static inline void USBHS_SendEndpoint(int endp, int len, const uint8_t *data) { if (endp) { (((uint32_t *)(&USBHSD->UEP1_TX_DMA))[2 - 1]) = (uintptr_t)data; } USBHSD_UEP_TLEN(endp) = len; USBHSD_UEP_TXCTRL(endp) = (USBHSD_UEP_TXCTRL(endp) & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_ACK; HSUSBCTX.USBHS_Endp_Busy[endp] = 0x01; } #endif