192 lines
5.6 KiB
C
192 lines
5.6 KiB
C
|
/********************************** (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 */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|