| Line 10... |
Line 10... |
| 10 |
void usb_start_tx(const struct usb_instance* data, union usb_endpoint_number ep, const void* buf, int size)
|
10 |
void usb_start_tx(const struct usb_instance* data, union usb_endpoint_number ep, const void* buf, int size)
|
| 11 |
{
|
11 |
{
|
| 12 |
data->driver->start_tx(data, ep, buf, size);
|
12 |
data->driver->start_tx(data, ep, buf, size);
|
| 13 |
}
|
13 |
}
|
| 14 |
|
14 |
|
| 15 |
void usb_set_stall(const struct usb_instance* data, union usb_endpoint_number ep, int stall)
|
15 |
void usb_set_stall(const struct usb_instance* data, union usb_endpoint_number ep, bool stall)
|
| 16 |
{
|
16 |
{
|
| 17 |
data->driver->set_stall(data, ep, stall);
|
17 |
data->driver->set_stall(data, ep, stall);
|
| 18 |
}
|
18 |
}
|
| 19 |
|
19 |
|
| 20 |
void usb_ep0_start_rx(const struct usb_instance* data, int non_setup, bool (*callback)(const struct usb_instance* data, int bytesleft))
|
20 |
void usb_ep0_start_rx(const struct usb_instance* data, bool non_setup, int len, bool (*callback)(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft))
|
| 21 |
{
|
21 |
{
|
| 22 |
data->state->ep0_rx_callback = callback;
|
22 |
data->state->ep0_rx_callback = callback;
|
| 23 |
data->driver->ep0_start_rx(data, non_setup);
|
23 |
data->driver->ep0_start_rx(data, non_setup, len);
|
| 24 |
}
|
24 |
}
|
| 25 |
|
25 |
|
| 26 |
bool usb_ep0_rx_callback(const struct usb_instance* data, int bytesleft)
|
26 |
bool usb_ep0_ack_callback(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
| 27 |
{
|
27 |
{
|
| - |
|
28 |
// This function is intended to eat zero-byte ACK packets,
|
| - |
|
29 |
// which are always the last packet of a transaction.
|
| - |
|
30 |
// At this point we can STALL all further packets.
|
| - |
|
31 |
union usb_endpoint_number ep = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_OUT };
|
| 28 |
usb_ep0_start_rx(data, 0, NULL);
|
32 |
usb_set_stall(data, ep, true);
|
| - |
|
33 |
ep.direction = USB_ENDPOINT_DIRECTION_IN;
|
| - |
|
34 |
usb_set_stall(data, ep, true);
|
| - |
|
35 |
// If this is an IN endpoint, something else must already be
|
| - |
|
36 |
// waiting for a SETUP packet anyway, or there could be deadlocks.
|
| - |
|
37 |
if (epnum.direction == USB_ENDPOINT_DIRECTION_OUT) usb_ep0_start_rx(data, false, 0, NULL);
|
| 29 |
return true;
|
38 |
return true;
|
| 30 |
}
|
39 |
}
|
| 31 |
|
40 |
|
| 32 |
void usb_ep0_start_tx(const struct usb_instance* data, const void* buf, int len, bool last, bool (*callback)(const struct usb_instance* data, int bytesleft))
|
41 |
void usb_ep0_start_tx(const struct usb_instance* data, const void* buf, int len, bool (*callback)(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft))
|
| 33 |
{
|
42 |
{
|
| 34 |
// Expect zero-length ACK if we are about to actually send data, otherwise expect SETUP.
|
- |
|
| 35 |
if (last) usb_ep0_start_rx(data, !!len, usb_ep0_rx_callback);
|
- |
|
| 36 |
|
- |
|
| 37 |
if (((uint32_t)buf) & (CACHEALIGN_SIZE - 1))
|
43 |
if (((uint32_t)buf) & (CACHEALIGN_SIZE - 1))
|
| 38 |
{
|
44 |
{
|
| 39 |
memcpy(data->buffer->raw, buf, len);
|
45 |
memcpy(data->buffer->raw, buf, len);
|
| 40 |
buf = data->buffer->raw;
|
46 |
buf = data->buffer->raw;
|
| 41 |
}
|
47 |
}
|
| 42 |
|
48 |
|
| 43 |
data->state->ep0_tx_callback = callback;
|
49 |
data->state->ep0_tx_callback = callback;
|
| 44 |
data->driver->ep0_start_tx(data, buf, len);
|
50 |
data->driver->ep0_start_tx(data, buf, len);
|
| 45 |
}
|
51 |
}
|
| 46 |
|
52 |
|
| 47 |
bool usb_ep0_tx_callback(const struct usb_instance* data, int bytesleft)
|
53 |
bool usb_ep0_short_tx_callback(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
| 48 |
{
|
54 |
{
|
| - |
|
55 |
// No more data to be sent after a short packet. STALL IN.
|
| - |
|
56 |
union usb_endpoint_number ep = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN };
|
| - |
|
57 |
usb_set_stall(data, ep, true);
|
| - |
|
58 |
// If this was the last regular packet, but a short one, expect zero-length ACK.
|
| - |
|
59 |
// Otherwise usb_ep0_tx_callback will have taken care of that already.
|
| - |
|
60 |
if (data->state->ep0_tx_ptr) usb_ep0_start_rx(data, true, 0, usb_ep0_ack_callback);
|
| - |
|
61 |
return false;
|
| - |
|
62 |
}
|
| - |
|
63 |
|
| - |
|
64 |
bool usb_ep0_tx_callback(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
| - |
|
65 |
{
|
| 49 |
if (bytesleft || !data->state->ep0_tx_len) return false;
|
66 |
if (bytesleft || !data->state->ep0_tx_len)
|
| - |
|
67 |
{
|
| - |
|
68 |
// This was the last packet. Expect zero-length ACK.
|
| - |
|
69 |
usb_ep0_start_rx(data, true, 0, usb_ep0_ack_callback);
|
| - |
|
70 |
// If someone might expect to receive more data, send a zero-byte packet.
|
| - |
|
71 |
if (!data->state->ep0_tx_len) usb_ep0_start_tx(data, NULL, 0, usb_ep0_short_tx_callback);
|
| - |
|
72 |
// Abuse this as a marker for usb_ep0_short_tx_callback...
|
| - |
|
73 |
data->state->ep0_tx_ptr = NULL;
|
| - |
|
74 |
return false;
|
| - |
|
75 |
}
|
| - |
|
76 |
|
| 50 |
int len = MIN(64, data->state->ep0_tx_len);
|
77 |
int len = MIN(64, data->state->ep0_tx_len);
|
| 51 |
data->state->ep0_tx_ptr += 64;
|
- |
|
| 52 |
data->state->ep0_tx_len -= len;
|
78 |
data->state->ep0_tx_len -= len;
|
| 53 |
usb_ep0_start_tx(data, data->state->ep0_tx_ptr, len, !data->state->ep0_tx_len, usb_ep0_tx_callback);
|
79 |
usb_ep0_start_tx(data, data->state->ep0_tx_ptr, len,
|
| - |
|
80 |
len < 64 ? usb_ep0_short_tx_callback : usb_ep0_tx_callback);
|
| - |
|
81 |
data->state->ep0_tx_ptr += 64;
|
| 54 |
return true;
|
82 |
return true;
|
| 55 |
}
|
83 |
}
|
| 56 |
|
84 |
|
| 57 |
void usb_unconfigure_ep(const struct usb_instance* data, union usb_endpoint_number ep)
|
85 |
void usb_unconfigure_ep(const struct usb_instance* data, union usb_endpoint_number ep)
|
| 58 |
{
|
86 |
{
|
| Line 117... |
Line 145... |
| 117 |
}
|
145 |
}
|
| 118 |
|
146 |
|
| 119 |
static void usb_handle_ep0_setup(const struct usb_instance* data, union usb_ep0_buffer* buffer)
|
147 |
static void usb_handle_ep0_setup(const struct usb_instance* data, union usb_ep0_buffer* buffer)
|
| 120 |
{
|
148 |
{
|
| 121 |
// size < -2: do nothing at all (dangerous, you need to take care of priming EP0 yourself!)
|
149 |
// size < -2: do nothing at all (dangerous, you need to take care of priming EP0 yourself!)
|
| - |
|
150 |
// (this case is required for requests that have an OUT data stage)
|
| 122 |
// size == -2: send STALL
|
151 |
// size == -2: send STALL
|
| 123 |
// size == -1: try to run default handler, or send STALL if none exists
|
152 |
// size == -1: try to run default handler, or send STALL if none exists
|
| 124 |
// size == 0: send ACK
|
153 |
// size == 0: send ACK
|
| 125 |
// size > 0: send <size> bytes at <addr>, then expect ACK
|
154 |
// size > 0: send <size> bytes at <addr>, then expect ACK
|
| 126 |
const void* addr = data->buffer;
|
155 |
const void* addr = data->buffer;
|
| Line 273... |
Line 302... |
| 273 |
addr = data->buffer;
|
302 |
addr = data->buffer;
|
| 274 |
size = 2;
|
303 |
size = 2;
|
| 275 |
break;
|
304 |
break;
|
| 276 |
case USB_SETUP_BREQUEST_CLEAR_FEATURE:
|
305 |
case USB_SETUP_BREQUEST_CLEAR_FEATURE:
|
| 277 |
if (buffer->setup.wLength || buffer->setup.wValue) break;
|
306 |
if (buffer->setup.wLength || buffer->setup.wValue) break;
|
| 278 |
data->driver->set_stall(data, ep, false);
|
307 |
usb_set_stall(data, ep, false);
|
| 279 |
size = 0;
|
308 |
size = 0;
|
| 280 |
break;
|
309 |
break;
|
| 281 |
case USB_SETUP_BREQUEST_SET_FEATURE:
|
310 |
case USB_SETUP_BREQUEST_SET_FEATURE:
|
| 282 |
if (buffer->setup.wLength || buffer->setup.wValue) break;
|
311 |
if (buffer->setup.wLength || buffer->setup.wValue) break;
|
| 283 |
data->driver->set_stall(data, ep, true);
|
312 |
usb_set_stall(data, ep, true);
|
| 284 |
size = 0;
|
313 |
size = 0;
|
| 285 |
break;
|
314 |
break;
|
| 286 |
default: break;
|
315 |
default: break;
|
| 287 |
}
|
316 |
}
|
| 288 |
break;
|
317 |
break;
|
| Line 291... |
Line 320... |
| 291 |
break;
|
320 |
break;
|
| 292 |
}
|
321 |
}
|
| 293 |
default: break;
|
322 |
default: break;
|
| 294 |
}
|
323 |
}
|
| 295 |
}
|
324 |
}
|
| - |
|
325 |
union usb_endpoint_number ep0in = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN };
|
| - |
|
326 |
union usb_endpoint_number ep0out = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_OUT };
|
| 296 |
// See comment at the top of this function
|
327 |
// See comment at the top of this function for meanings of size.
|
| - |
|
328 |
if (size == 0)
|
| - |
|
329 |
{
|
| - |
|
330 |
// Send ACK. Stall OUT pipe. Accept SETUP packets though.
|
| - |
|
331 |
usb_set_stall(data, ep0out, true);
|
| 297 |
if (size == 0) usb_ep0_start_tx(data, NULL, 0, true, NULL);
|
332 |
usb_ep0_start_rx(data, false, 0, NULL);
|
| - |
|
333 |
usb_ep0_start_tx(data, NULL, 0, usb_ep0_ack_callback);
|
| - |
|
334 |
}
|
| 298 |
else if (size > 0)
|
335 |
else if (size > 0)
|
| 299 |
{
|
336 |
{
|
| - |
|
337 |
// Send a data stage. Expect to receive only SETUP until we're done. NAK everything else.
|
| 300 |
usb_ep0_start_rx(data, 0, NULL);
|
338 |
usb_ep0_start_rx(data, false, 0, NULL);
|
| 301 |
int len = MIN(64, size);
|
- |
|
| 302 |
data->state->ep0_tx_ptr = addr;
|
339 |
data->state->ep0_tx_ptr = addr;
|
| 303 |
data->state->ep0_tx_len = size - len;
|
340 |
data->state->ep0_tx_len = size;
|
| 304 |
usb_ep0_start_tx(data, addr, len, !data->state->ep0_tx_len, usb_ep0_tx_callback);
|
341 |
usb_ep0_tx_callback(data, ep0in, 0); // A convenient way to start a transfer.
|
| 305 |
}
|
342 |
}
|
| 306 |
else if (size >= -2)
|
343 |
else if (size >= -2)
|
| 307 |
{
|
344 |
{
|
| 308 |
union usb_endpoint_number ep = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN };
|
345 |
// We have no handler, or the handler failed. STALL everything, accept only SETUP packets.
|
| 309 |
usb_set_stall(data, ep, 1);
|
346 |
usb_set_stall(data, ep0in, true);
|
| 310 |
ep.direction = USB_ENDPOINT_DIRECTION_OUT;
|
347 |
usb_set_stall(data, ep0out, true);
|
| 311 |
usb_set_stall(data, ep, 1);
|
348 |
usb_ep0_start_rx(data, false, 0, NULL);
|
| 312 |
}
|
349 |
}
|
| 313 |
}
|
350 |
}
|
| 314 |
|
351 |
|
| 315 |
void usb_handle_bus_reset(const struct usb_instance* data, int highspeed)
|
352 |
void usb_handle_bus_reset(const struct usb_instance* data, int highspeed)
|
| 316 |
{
|
353 |
{
|
| Line 327... |
Line 364... |
| 327 |
if (interface->bus_reset) interface->bus_reset(data, c, i, highspeed);
|
364 |
if (interface->bus_reset) interface->bus_reset(data, c, i, highspeed);
|
| 328 |
}
|
365 |
}
|
| 329 |
}
|
366 |
}
|
| 330 |
|
367 |
|
| 331 |
// Prime EP0 for the first setup packet.
|
368 |
// Prime EP0 for the first setup packet.
|
| 332 |
usb_ep0_start_rx(data, 0, NULL);
|
369 |
usb_ep0_start_rx(data, false, 0, NULL);
|
| 333 |
}
|
370 |
}
|
| 334 |
|
371 |
|
| 335 |
void usb_handle_timeout(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
372 |
void usb_handle_timeout(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
| 336 |
{
|
373 |
{
|
| 337 |
// If the host doesn't fetch an EP0 IN packet, we can't do much about it.
|
374 |
// If the host doesn't fetch an EP0 IN packet, we can't do much about it.
|
| Line 348... |
Line 385... |
| 348 |
|
385 |
|
| 349 |
void usb_handle_xfer_complete(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
386 |
void usb_handle_xfer_complete(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
| 350 |
{
|
387 |
{
|
| 351 |
if (!epnum.number)
|
388 |
if (!epnum.number)
|
| 352 |
{
|
389 |
{
|
| 353 |
bool (*callback)(const struct usb_instance* data, int size);
|
390 |
bool (*callback)(const struct usb_instance* data, union usb_endpoint_number epnum, int size);
|
| 354 |
if (epnum.direction == USB_ENDPOINT_DIRECTION_OUT)
|
391 |
if (epnum.direction == USB_ENDPOINT_DIRECTION_OUT)
|
| 355 |
{
|
392 |
{
|
| 356 |
callback = data->state->ep0_rx_callback;
|
393 |
callback = data->state->ep0_rx_callback;
|
| 357 |
data->state->ep0_rx_callback = NULL;
|
394 |
data->state->ep0_rx_callback = NULL;
|
| 358 |
}
|
395 |
}
|
| 359 |
else
|
396 |
else
|
| 360 |
{
|
397 |
{
|
| 361 |
callback = data->state->ep0_tx_callback;
|
398 |
callback = data->state->ep0_tx_callback;
|
| 362 |
data->state->ep0_tx_callback = NULL;
|
399 |
data->state->ep0_tx_callback = NULL;
|
| 363 |
}
|
400 |
}
|
| 364 |
if (callback) callback(data, bytesleft);
|
401 |
if (callback) callback(data, epnum, bytesleft);
|
| 365 |
}
|
402 |
}
|
| 366 |
else
|
403 |
else
|
| 367 |
{
|
404 |
{
|
| 368 |
int epidx;
|
405 |
int epidx;
|
| 369 |
int ifidx;
|
406 |
int ifidx;
|