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