1 /* 2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited 3 */ 4 #ifndef __HAL_USB_H__ 5 #define __HAL_USB_H__ 6 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 11 #include "stdint.h" 12 #include "stdbool.h" 13 14 #ifdef USB_HIGH_SPEED 15 #define MAX_USBHOST_PACKET_SIZE 512 16 #else 17 #define MAX_USBHOST_PACKET_SIZE 64 18 #endif 19 20 #define USBHOST_EPNUM 6 21 22 #define HAL_USBHOST_CHAN_NONE 0xFF 23 24 enum HAL_USBHOST_EP_TYPE_T { 25 HAL_USBHOST_EP_CTRL, 26 HAL_USBHOST_EP_ISO, 27 HAL_USBHOST_EP_BULK, 28 HAL_USBHOST_EP_INT, 29 30 HAL_USBHOST_EP_QTY 31 }; 32 33 enum HAL_USBHOST_PID_TYPE_T { 34 HAL_USBHOST_PID_DATA0 = 0, 35 HAL_USBHOST_PID_DATA2 = 1, 36 HAL_USBHOST_PID_DATA1 = 2, 37 HAL_USBHOST_PID_MDATA = 3, 38 HAL_USBHOST_PID_SETUP = 3, 39 40 HAL_USBHOST_PID_QTY, 41 HAL_USBHOST_PID_AUTO = 0xFF, 42 }; 43 44 enum HAL_USBHOST_PORT_EVENT_T { 45 HAL_USBHOST_PORT_CONN, 46 HAL_USBHOST_PORT_EN_LS, 47 HAL_USBHOST_PORT_EN_FS, 48 HAL_USBHOST_PORT_EN_HS, 49 HAL_USBHOST_PORT_EN_BAD, 50 HAL_USBHOST_PORT_DISCONN, 51 52 HAL_USBHOST_PORT_QTY 53 }; 54 55 enum HAL_USBHOST_SETUP_STAGE_T { 56 HAL_USBHOST_SETUP_DATA_IN, 57 HAL_USBHOST_SETUP_DATA_OUT, 58 HAL_USBHOST_SETUP_STATUS_IN, 59 HAL_USBHOST_SETUP_STATUS_OUT, 60 HAL_USBHOST_SETUP_DONE, 61 HAL_USBHOST_SETUP_ERROR, 62 63 HAL_USBHOST_SETUP_STAGE_QTY 64 }; 65 66 enum HAL_USBHOST_XFER_ERR_T { 67 HAL_USBHOST_XFER_ERR_NONE, 68 HAL_USBHOST_XFER_ERR_AHB, 69 HAL_USBHOST_XFER_ERR_STALL, 70 HAL_USBHOST_XFER_ERR_TRANSACTION, 71 HAL_USBHOST_XFER_ERR_BABBLE, 72 HAL_USBHOST_XFER_ERR_FRAME_OVERRUN, 73 HAL_USBHOST_XFER_ERR_DATA_TOGGLE, 74 HAL_USBHOST_XFER_ERR_TIMEOUT, 75 HAL_USBHOST_XFER_ERR_DISCONN, 76 77 HAL_USBHOST_XFER_ERR_QTY 78 }; 79 80 struct HAL_USBHOST_SETUP_XFER_T; 81 82 typedef void (*HAL_USBHOST_DELAY_FUNC)(uint32_t ms); 83 typedef void (*HAL_USBHOST_PORT_HANDLER)(enum HAL_USBHOST_PORT_EVENT_T evt); 84 typedef void (*HAL_USBHOST_XFER_COMPL_HANDLER)(uint8_t chan, uint8_t *buf, uint32_t len, enum HAL_USBHOST_XFER_ERR_T error); 85 typedef void (*HAL_USBHOST_SETUP_COMPL_HANDLER)(struct HAL_USBHOST_SETUP_XFER_T *setup, int error); 86 87 enum HAL_USBHOST_PLUG_STATUS_T { 88 HAL_USBHOST_PLUG_UNKNOWN, 89 HAL_USBHOST_PLUG_IN, 90 HAL_USBHOST_PLUG_OUT, 91 }; 92 93 typedef void (*HAL_USBHOST_PLUG_HANDLER)(enum HAL_USBHOST_PLUG_STATUS_T status); 94 95 struct HAL_USBHOST_CHAN_TYPE_T { 96 uint16_t mps; 97 uint8_t ep_num; 98 uint8_t ep_in; 99 enum HAL_USBHOST_EP_TYPE_T ep_type; 100 uint8_t dev_addr; 101 }; 102 103 struct HAL_USBHOST_XFER_T { 104 uint8_t *buf; 105 uint32_t size; 106 uint8_t multi_cnt; 107 enum HAL_USBHOST_PID_TYPE_T pid; 108 HAL_USBHOST_XFER_COMPL_HANDLER handler; 109 }; 110 111 struct HAL_USBHOST_SETUP_PKT_T { 112 uint8_t bmRequestType; 113 uint8_t bRequest; 114 uint16_t wValue; 115 uint16_t wIndex; 116 uint16_t wLength; 117 }; 118 119 struct HAL_USBHOST_SETUP_XFER_T { 120 struct HAL_USBHOST_SETUP_PKT_T setup_pkt; 121 enum HAL_USBHOST_SETUP_STAGE_T next_stage; 122 HAL_USBHOST_SETUP_COMPL_HANDLER handler; 123 uint8_t *data_buf; 124 uint8_t chan_out; 125 uint8_t chan_in; 126 }; 127 128 int hal_usbhost_open(HAL_USBHOST_PORT_HANDLER port_cb, HAL_USBHOST_DELAY_FUNC delay_fn); 129 130 void hal_usbhost_close(void); 131 132 void hal_usbhost_halt_chan(uint8_t chan); 133 134 void hal_usbhost_port_reset(uint32_t ms); 135 136 int hal_usbhost_get_chan(uint8_t *chan); 137 138 int hal_usbhost_free_chan(uint8_t chan); 139 140 int hal_usbhost_init_chan(uint8_t chan, const struct HAL_USBHOST_CHAN_TYPE_T *type); 141 142 int hal_usbhost_update_chan_dev_addr(uint8_t chan, uint8_t dev_addr); 143 144 int hal_usbhost_update_chan_mps(uint8_t chan, uint16_t mps); 145 146 int hal_usbhost_start_xfer(uint8_t chan, const struct HAL_USBHOST_XFER_T *xfer); 147 148 int hal_usbhost_start_setup_xfer(const struct HAL_USBHOST_SETUP_XFER_T *setup, uint32_t *recv_len); 149 150 void hal_usbhost_detect(enum HAL_USBHOST_PLUG_STATUS_T status, HAL_USBHOST_PLUG_HANDLER handler); 151 152 void hal_usbhost_sleep(void); 153 154 void hal_usbhost_wakeup(void); 155 156 uint32_t hal_usbhost_get_port_status(void); 157 158 uint32_t hal_usbhost_get_interrupt_status(void); 159 160 void hal_usbhost_set_port_enable(void); 161 162 void hal_usbhost_set_port_disable(void); 163 164 void hal_usbhost_set_port_poweron(void); 165 166 void hal_usbhost_set_port_poweroff(void); 167 168 void hal_usbhost_set_timeout(uint32_t ms); 169 170 #ifdef __cplusplus 171 } 172 #endif 173 174 #endif 175 176