/********************************** (C) COPYRIGHT ******************************* * File Name : usb_core.h * Author : WCH * Version : V1.0.0 * Date : 2021/08/08 * Description : This file contains all the functions prototypes for the * USB cor firmware library. ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ #ifndef __USB_CORE_H #define __USB_CORE_H #ifdef __cplusplus extern "C" { #endif #include "ch32v20x.h" typedef enum _CONTROL_STATE { WAIT_SETUP, /* 0 */ SETTING_UP, /* 1 */ IN_DATA, /* 2 */ OUT_DATA, /* 3 */ LAST_IN_DATA, /* 4 */ LAST_OUT_DATA, /* 5 */ WAIT_STATUS_IN, /* 7 */ WAIT_STATUS_OUT, /* 8 */ STALLED, /* 9 */ PAUSE /* 10 */ } CONTROL_STATE; /* The state machine states of a control pipe */ typedef struct OneDescriptor { uint8_t *Descriptor; uint16_t Descriptor_Size; } ONE_DESCRIPTOR, *PONE_DESCRIPTOR; typedef enum _RESULT { USB_SUCCESS = 0, /* Process successfully */ USB_ERROR, USB_UNSUPPORT, USB_NOT_READY /* The process has not been finished, endpoint will be NAK to further request */ } RESULT; /* Definitions for endpoint level */ typedef struct _ENDPOINT_INFO { uint16_t Usb_wLength; uint16_t Usb_wOffset; uint16_t PacketSize; uint8_t *(*CopyData)(uint16_t Length); }ENDPOINT_INFO; /* Definitions for device level */ typedef struct _DEVICE { uint8_t Total_Endpoint; /* Number of endpoints that are used */ uint8_t Total_Configuration;/* Number of configuration available */ } DEVICE; typedef union { uint16_t w; struct BW { uint8_t bb1; uint8_t bb0; } bw; } uint16_t_uint8_t; typedef struct _DEVICE_INFO { uint8_t USBbmRequestType; /* bmRequestType */ uint8_t USBbRequest; /* bRequest */ uint16_t_uint8_t USBwValues; /* wValue */ uint16_t_uint8_t USBwIndexs; /* wIndex */ uint16_t_uint8_t USBwLengths; /* wLength */ uint8_t ControlState; /* of type CONTROL_STATE */ uint8_t Current_Feature; uint8_t Current_Configuration; /* Selected configuration */ uint8_t Current_Interface; /* Selected interface of current configuration */ uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current interface*/ ENDPOINT_INFO Ctrl_Info; }DEVICE_INFO; typedef struct _DEVICE_PROP { void (*Init)(void); /* Initialize the device */ void (*Reset)(void); /* Reset routine of this device */ void (*Process_Status_IN)(void); void (*Process_Status_OUT)(void); RESULT (*Class_Data_Setup)(uint8_t RequestNo); RESULT (*Class_NoData_Setup)(uint8_t RequestNo); RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); uint8_t* (*GetDeviceDescriptor)(uint16_t Length); uint8_t* (*GetConfigDescriptor)(uint16_t Length); uint8_t* (*GetStringDescriptor)(uint16_t Length); void* RxEP_buffer; uint8_t MaxPacketSize; }DEVICE_PROP; typedef struct _USER_STANDARD_REQUESTS { void (*User_GetConfiguration)(void); /* Get Configuration */ void (*User_SetConfiguration)(void); /* Set Configuration */ void (*User_GetInterface)(void); /* Get Interface */ void (*User_SetInterface)(void); /* Set Interface */ void (*User_GetStatus)(void); /* Get Status */ void (*User_ClearFeature)(void); /* Clear Feature */ void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */ void (*User_SetDeviceFeature)(void); /* Set Device Feature */ void (*User_SetDeviceAddress)(void); /* Set Device Address */ } USER_STANDARD_REQUESTS; #define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT)) #define Usb_rLength Usb_wLength #define Usb_rOffset Usb_wOffset #define USBwValue USBwValues.w #define USBwValue0 USBwValues.bw.bb0 #define USBwValue1 USBwValues.bw.bb1 #define USBwIndex USBwIndexs.w #define USBwIndex0 USBwIndexs.bw.bb0 #define USBwIndex1 USBwIndexs.bw.bb1 #define USBwLength USBwLengths.w #define USBwLength0 USBwLengths.bw.bb0 #define USBwLength1 USBwLengths.bw.bb1 uint8_t Setup0_Process(void); uint8_t Post0_Process(void); uint8_t Out0_Process(void); uint8_t In0_Process(void); RESULT Standard_SetEndPointFeature(void); RESULT Standard_SetDeviceFeature(void); uint8_t *Standard_GetConfiguration(uint16_t Length); RESULT Standard_SetConfiguration(void); uint8_t *Standard_GetInterface(uint16_t Length); RESULT Standard_SetInterface(void); uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); uint8_t *Standard_GetStatus(uint16_t Length); RESULT Standard_ClearFeature(void); void SetDeviceAddress(uint8_t); void NOP_Process(void); extern DEVICE_PROP Device_Property; extern USER_STANDARD_REQUESTS User_Standard_Requests; extern DEVICE Device_Table; extern DEVICE_INFO Device_Info; /* cells saving status during interrupt servicing */ extern __IO uint16_t SaveRState; extern __IO uint16_t SaveTState; #ifdef __cplusplus } #endif #endif /* __USB_CORE_H */