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