1 #ifndef __USBH_CORE_H__
2 #define __USBH_CORE_H__
3 
4 #include <stdint.h>
5 #include "usbh_conf.h"
6 
7 
8 typedef enum {
9     USBH_OK = 0,
10     USBH_BUSY,
11     USBH_FAIL,
12     USBH_NOT_SUPPORTED,
13     USBH_UNRECOVERED_ERROR,
14     USBH_APPLY_DEINIT
15 } USBH_Status;
16 
17 
18 typedef enum {
19     HOST_IDLE = 0,
20     HOST_DEV_ATTACHED,
21     HOST_PORT_RESETED,
22     HOST_PORT_ENABLED,
23     HOST_ENUMERATION,
24     HOST_CLASS_REQUEST,
25     HOST_CLASS,
26     HOST_CTRL_XFER,
27     HOST_USR_INPUT,
28     HOST_SUSPENDED,
29     HOST_WAKEUP,
30     HOST_DEV_DETACHED,
31 } HOST_State;
32 
33 
34 typedef enum {
35     ENUM_GET_DEV_DESC = 0,
36     ENUM_GET_FULL_DEV_DESC,
37     ENUM_SET_ADDR,
38     ENUM_GET_CFG_DESC,
39     ENUM_GET_FULL_CFG_DESC,
40     ENUM_GET_VENDOR_STRING_DESC,
41     ENUM_GET_PRODUCT_STRING_DESC,
42     ENUM_GET_SERIALNUM_STRING_DESC,
43     ENUM_SET_CONFIGURATION,
44     ENUM_DEV_CONFIGURED
45 } ENUM_State;
46 
47 
48 typedef enum {
49     CTRL_IDLE = 0,
50     CTRL_SETUP,
51     CTRL_SETUP_WAIT,
52     CTRL_DATA_IN,
53     CTRL_DATA_IN_WAIT,
54     CTRL_DATA_OUT,
55     CTRL_DATA_OUT_WAIT,
56     CTRL_STATUS_IN,
57     CTRL_STATUS_IN_WAIT,
58     CTRL_STATUS_OUT,
59     CTRL_STATUS_OUT_WAIT,
60     CTRL_ERROR,
61     CTRL_STALLED,
62     CTRL_COMPLETE
63 } CTRL_State;
64 
65 
66 typedef struct {
67     uint8_t            pksz;    // 控制传输包大小
68     uint8_t           *buff;    // 控制传输的数据阶段缓冲区
69     uint16_t           size;    // 控制传输的数据阶段缓冲区大小
70     CTRL_State         state;
71     USB_Setup_Packet_t setup;   // Setup 包
72 
73     uint8_t        toggle_in;
74     uint8_t        toggle_out;
75 } USBH_CtrlXfer_t;
76 
77 
78 typedef struct {
79     uint8_t        Address;
80     uint8_t        Speed;       // 2 低速   3 全速
81     USB_DevDesc_t  Dev_Desc;
82     USB_CfgDesc_t  Cfg_Desc;
83     USB_IntfDesc_t Intf_Desc[USBH_MAX_NUM_INTERFACES];
84     USB_EpDesc_t   Ep_Desc[USBH_MAX_NUM_INTERFACES][USBH_MAX_NUM_ENDPOINTS];
85     USB_HIDDesc_t  HID_Desc[USBH_MAX_NUM_INTERFACES];
86     uint8_t        HIDReport_Desc[USBH_MAX_NUM_INTERFACES][USBH_HID_REPORT_SIZE];
87     char strVender[USBH_MAX_STR_SIZE];
88     char strProduct[USBH_MAX_STR_SIZE];
89     char strSerialNumber[USBH_MAX_STR_SIZE];
90 } USBH_Device_t;
91 
92 extern uint8_t  USBH_Cfg_Desc_Buffer[USBH_MAX_CFG_SIZE];
93 extern uint16_t USBH_Cfg_Desc_Length;
94 
95 struct USBH_Info_T;
96 typedef struct {
97     USBH_Status (*Init)(struct USBH_Info_T *phost);
98     void        (*DeInit)(struct USBH_Info_T *phost);
99     USBH_Status (*Request)(struct USBH_Info_T *phost);
100     USBH_Status (*Process)(struct USBH_Info_T *phost);
101 } USBH_Class_cb_t;
102 
103 
104 typedef struct {
105     void (*Init)(void);
106     void (*DeInit)(void);
107     void (*DeviceAttached)(void);
108     void (*ResetDevice)(void);
109     void (*DeviceDisconnected)(void);
110     void (*OverCurrentDetected)(void);
111     void (*DeviceSpeedDetected)(uint8_t DeviceSpeed);
112     void (*DeviceDescAvailable)(USB_DevDesc_t *devDesc);
113     void (*DeviceAddressAssigned)(void);
114     void (*ConfigDescAvailable)(USB_CfgDesc_t *cfgDesc, USB_IntfDesc_t *intfDesc, USB_EpDesc_t *epDesc);
115     void (*VendorString)(char *);
116     void (*ProductString)(char *);
117     void (*SerialNumString)(char *);
118     void (*EnumerationDone)(void);
119     uint32_t (*UserInput)(void);
120     int  (*UserApplication)(void);
121     void (*DeviceNotSupported)(void);
122     void (*UnrecoveredError)(void);
123 } USBH_User_cb_t;
124 
125 
126 typedef struct USBH_Info_T {
127     HOST_State       State;             // Host State Machine
128     HOST_State       StateBkp;          // State Backup
129     ENUM_State       EnumState;         // Enumeration state Machine
130 
131     USBH_CtrlXfer_t  Ctrl;
132     USBH_Device_t    Device;
133 
134     USBH_Class_cb_t *class_cb;
135     USBH_User_cb_t  *usr_cb;
136 } USBH_Info_t;
137 
138 
139 void USBH_Init(USBH_Class_cb_t *class_cb, USBH_User_cb_t *usr_cb);
140 void USBH_DeInit(void);
141 
142 void USBH_Process(void);
143 USBH_Status USBH_HandleEnum(USBH_Info_t *phost);
144 void USBH_HandleControl(USBH_Info_t *phost);
145 USBH_Status USBH_CtrlTransfer(USBH_Info_t *phost, uint8_t *buff, uint16_t size);
146 
147 void USBH_ErrorHandle(USBH_Info_t *phost, USBH_Status errType);
148 
149 #endif
150 
151