80 lines
2.4 KiB
C
80 lines
2.4 KiB
C
#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 <stdint.h>
|
|
|
|
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
|