Index: emcore/trunk/usb/usb.h |
— | — | @@ -4,21 +4,21 @@ |
5 | 5 | #include "../global.h" |
6 | 6 | |
7 | 7 | #ifndef IN_APPLICATION_CODE |
8 | | -#if USB_ENDPOINTS & 0b00000000000000000000000000000010 |
| 8 | +#if USB_ENDPOINTS & 0b00000000000000000000000000000010 |
9 | 9 | #define USBDEBUG_ENDPOINT_OUT 1 |
10 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000000000010 |
| 10 | +#elif USB_ENDPOINTS & 0b00000000000000000000000000000100 |
11 | 11 | #define USBDEBUG_ENDPOINT_OUT 2 |
12 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000000000100 |
| 12 | +#elif USB_ENDPOINTS & 0b00000000000000000000000000001000 |
13 | 13 | #define USBDEBUG_ENDPOINT_OUT 3 |
14 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000000001000 |
| 14 | +#elif USB_ENDPOINTS & 0b00000000000000000000000000010000 |
15 | 15 | #define USBDEBUG_ENDPOINT_OUT 4 |
16 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000000010000 |
| 16 | +#elif USB_ENDPOINTS & 0b00000000000000000000000000100000 |
17 | 17 | #define USBDEBUG_ENDPOINT_OUT 5 |
18 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000000100000 |
| 18 | +#elif USB_ENDPOINTS & 0b00000000000000000000000001000000 |
19 | 19 | #define USBDEBUG_ENDPOINT_OUT 6 |
20 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000001000000 |
| 20 | +#elif USB_ENDPOINTS & 0b00000000000000000000000010000000 |
21 | 21 | #define USBDEBUG_ENDPOINT_OUT 7 |
22 | | -#elif USB_ENDPOINTS & 0b00000000000000000000000010000000 |
| 22 | +#elif USB_ENDPOINTS & 0b00000000000000000000000100000000 |
23 | 23 | #define USBDEBUG_ENDPOINT_OUT 8 |
24 | 24 | #elif USB_ENDPOINTS & 0b00000000000000000000001000000000 |
25 | 25 | #define USBDEBUG_ENDPOINT_OUT 9 |
— | — | @@ -37,21 +37,21 @@ |
38 | 38 | #else |
39 | 39 | #error USBDEBUG: No OUT endpoints available! |
40 | 40 | #endif |
41 | | -#if USB_ENDPOINTS & 0b00000000000000100000000000000000 |
| 41 | +#if USB_ENDPOINTS & 0b00000000000000100000000000000000 |
42 | 42 | #define USBDEBUG_ENDPOINT_IN 1 |
43 | | -#elif USB_ENDPOINTS & 0b00000000000000100000000000000000 |
| 43 | +#elif USB_ENDPOINTS & 0b00000000000001000000000000000000 |
44 | 44 | #define USBDEBUG_ENDPOINT_IN 2 |
45 | | -#elif USB_ENDPOINTS & 0b00000000000001000000000000000000 |
| 45 | +#elif USB_ENDPOINTS & 0b00000000000010000000000000000000 |
46 | 46 | #define USBDEBUG_ENDPOINT_IN 3 |
47 | | -#elif USB_ENDPOINTS & 0b00000000000010000000000000000000 |
| 47 | +#elif USB_ENDPOINTS & 0b00000000000100000000000000000000 |
48 | 48 | #define USBDEBUG_ENDPOINT_IN 4 |
49 | | -#elif USB_ENDPOINTS & 0b00000000000100000000000000000000 |
| 49 | +#elif USB_ENDPOINTS & 0b00000000001000000000000000000000 |
50 | 50 | #define USBDEBUG_ENDPOINT_IN 5 |
51 | | -#elif USB_ENDPOINTS & 0b00000000001000000000000000000000 |
| 51 | +#elif USB_ENDPOINTS & 0b00000000010000000000000000000000 |
52 | 52 | #define USBDEBUG_ENDPOINT_IN 6 |
53 | | -#elif USB_ENDPOINTS & 0b00000000010000000000000000000000 |
| 53 | +#elif USB_ENDPOINTS & 0b00000000100000000000000000000000 |
54 | 54 | #define USBDEBUG_ENDPOINT_IN 7 |
55 | | -#elif USB_ENDPOINTS & 0b00000000100000000000000000000000 |
| 55 | +#elif USB_ENDPOINTS & 0b00000001000000000000000000000000 |
56 | 56 | #define USBDEBUG_ENDPOINT_IN 8 |
57 | 57 | #elif USB_ENDPOINTS & 0b00000010000000000000000000000000 |
58 | 58 | #define USBDEBUG_ENDPOINT_IN 9 |
Index: emcore/trunk/usb/usbdebug.c |
— | — | @@ -117,7 +117,7 @@ |
118 | 118 | dbgstate = DBGSTATE_IDLE;
|
119 | 119 | }
|
120 | 120 |
|
121 | | -void usbdebug_bus_reset(const struct usb_instance* data, int highspeed)
|
| 121 | +void usbdebug_bus_reset(const struct usb_instance* data, int configuration, int interface, int highspeed)
|
122 | 122 | {
|
123 | 123 | maxpacket = highspeed ? 512 : 64;
|
124 | 124 | }
|
— | — | @@ -150,13 +150,13 @@ |
151 | 151 | {
|
152 | 152 | union usb_endpoint_number ep = { .number = USBDEBUG_ENDPOINT_IN, .direction = USB_ENDPOINT_DIRECTION_IN };
|
153 | 153 | size = MIN(state->size, maxpacket * usb_get_max_transfer_size(data, ep));
|
154 | | - usb_start_rx(data, ep, state->addr, size);
|
| 154 | + usb_start_tx(data, ep, state->addr, size);
|
155 | 155 | }
|
156 | 156 | else
|
157 | 157 | {
|
158 | 158 | union usb_endpoint_number ep = { .number = USBDEBUG_ENDPOINT_OUT, .direction = USB_ENDPOINT_DIRECTION_OUT };
|
159 | 159 | size = MIN(state->size, maxpacket * usb_get_max_transfer_size(data, ep));
|
160 | | - usb_start_tx(data, ep, state->addr, size);
|
| 160 | + usb_start_rx(data, ep, state->addr, size);
|
161 | 161 | }
|
162 | 162 | state->addr += size;
|
163 | 163 | state->size -= size;
|
— | — | @@ -166,7 +166,6 @@ |
167 | 167 | bool usbdebug_bulk_handle_data(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
|
168 | 168 | {
|
169 | 169 | uint32_t* buf = (uint32_t*)data->buffer->raw;
|
170 | | - int len = 64 - bytesleft;
|
171 | 170 | union usb_endpoint_number ep0out = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_OUT };
|
172 | 171 | union usb_endpoint_number ep0in = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN };
|
173 | 172 | usb_ep0_start_rx(data, false, 0, NULL);
|
— | — | @@ -173,8 +172,6 @@ |
174 | 173 | switch (buf[0])
|
175 | 174 | {
|
176 | 175 | case 1: // START MEMORY TRANSFER
|
177 | | - if (len == 12)
|
178 | | - {
|
179 | 176 | bulk_state[bulk_ctrlreq_ep].addr = (void*)buf[1];
|
180 | 177 | bulk_state[bulk_ctrlreq_ep].size = buf[2];
|
181 | 178 | usbdebug_bulk_xfer_complete(data, 0, bulk_ctrlreq_ep, 0); // Convenient way to start a transfer.
|
— | — | @@ -181,7 +178,6 @@ |
182 | 179 | usb_set_stall(data, ep0out, true);
|
183 | 180 | usb_ep0_start_tx(data, NULL, 0, NULL);
|
184 | 181 | break;
|
185 | | - }
|
186 | 182 | default:
|
187 | 183 | usb_set_stall(data, ep0out, true);
|
188 | 184 | usb_set_stall(data, ep0in, true);
|
— | — | @@ -206,8 +202,7 @@ |
207 | 203 | bulk_ctrlreq_ep = endpoint;
|
208 | 204 | usb_ep0_start_rx(data, true, 64, usbdebug_bulk_handle_data);
|
209 | 205 | return -3;
|
210 | | - case USB_SETUP_BMREQUESTTYPE_DIRECTION_IN:
|
211 | | - return -2;
|
| 206 | + default: break;
|
212 | 207 | }
|
213 | 208 | break;
|
214 | 209 | default: break;
|
Index: emcore/trunk/usb/usbdebug.h |
— | — | @@ -36,7 +36,7 @@ |
37 | 37 | extern int usbdebug_handle_setup(const struct usb_instance* data, int interface, union usb_ep0_buffer* request, const void** response);
|
38 | 38 | extern void usbdebug_bulk_xfer_complete(const struct usb_instance* data, int interface, int endpoint, int bytesleft);
|
39 | 39 | extern int usbdebug_bulk_ctrl_request(const struct usb_instance* data, int interface, int endpoint, union usb_ep0_buffer* request, const void** response);
|
40 | | -extern void usbdebug_bus_reset(const struct usb_instance* data, int highspeed);
|
| 40 | +extern void usbdebug_bus_reset(const struct usb_instance* data, int configuration, int interface, int highspeed);
|
41 | 41 | extern void dbgconsole_putc(char string) ICODE_ATTR;
|
42 | 42 | extern void dbgconsole_puts(const char* string) ICODE_ATTR;
|
43 | 43 | extern void dbgconsole_write(const char* string, size_t length) ICODE_ATTR;
|
Index: emcore/trunk/usb/usb.c |
— | — | @@ -277,50 +277,50 @@ |
278 | 278 | default: break; |
279 | 279 | } |
280 | 280 | break; |
281 | | - default: break; |
| 281 | + default: break; |
282 | 282 | } |
283 | 283 | break; |
284 | | - case USB_SETUP_BMREQUESTTYPE_RECIPIENT_ENDPOINT: |
| 284 | + } |
| 285 | + case USB_SETUP_BMREQUESTTYPE_RECIPIENT_ENDPOINT: |
| 286 | + { |
| 287 | + if (!data->state->current_configuration) break; |
| 288 | + union usb_endpoint_number ep = { .byte = buffer->setup.wIndex }; |
| 289 | + int intfid; |
| 290 | + int epid; |
| 291 | + const struct usb_endpoint* endpoint = usb_find_endpoint(data, ep, &intfid, &epid); |
| 292 | + if (!endpoint) break; |
| 293 | + if (endpoint->ctrl_request) size = endpoint->ctrl_request(data, intfid, epid, buffer, &addr); |
| 294 | + if (size != -1) break; |
| 295 | + switch (buffer->setup.bmRequestType.type) |
285 | 296 | { |
286 | | - if (!data->state->current_configuration) break; |
287 | | - union usb_endpoint_number ep = { .byte = buffer->setup.wIndex }; |
288 | | - int intfid; |
289 | | - int epid; |
290 | | - const struct usb_endpoint* endpoint = usb_find_endpoint(data, ep, &intfid, &epid); |
291 | | - if (!endpoint) break; |
292 | | - if (endpoint->ctrl_request) size = endpoint->ctrl_request(data, intfid, epid, buffer, &addr); |
293 | | - if (size != -1) break; |
294 | | - switch (buffer->setup.bmRequestType.type) |
| 297 | + case USB_SETUP_BMREQUESTTYPE_TYPE_STANDARD: |
| 298 | + switch (buffer->setup.bRequest.req) |
295 | 299 | { |
296 | | - case USB_SETUP_BMREQUESTTYPE_TYPE_STANDARD: |
297 | | - switch (buffer->setup.bRequest.req) |
298 | | - { |
299 | | - case USB_SETUP_BREQUEST_GET_STATUS: |
300 | | - if (buffer->setup.wLength != 2 || buffer->setup.wValue) break; |
301 | | - data->buffer->raw[0] = 0; |
302 | | - data->buffer->raw[1] = data->driver->get_stall(data, ep); |
303 | | - addr = data->buffer; |
304 | | - size = 2; |
305 | | - break; |
306 | | - case USB_SETUP_BREQUEST_CLEAR_FEATURE: |
307 | | - if (buffer->setup.wLength || buffer->setup.wValue) break; |
308 | | - usb_set_stall(data, ep, false); |
309 | | - size = 0; |
310 | | - break; |
311 | | - case USB_SETUP_BREQUEST_SET_FEATURE: |
312 | | - if (buffer->setup.wLength || buffer->setup.wValue) break; |
313 | | - usb_set_stall(data, ep, true); |
314 | | - size = 0; |
315 | | - break; |
316 | | - default: break; |
317 | | - } |
| 300 | + case USB_SETUP_BREQUEST_GET_STATUS: |
| 301 | + if (buffer->setup.wLength != 2 || buffer->setup.wValue) break; |
| 302 | + data->buffer->raw[0] = 0; |
| 303 | + data->buffer->raw[1] = data->driver->get_stall(data, ep); |
| 304 | + addr = data->buffer; |
| 305 | + size = 2; |
318 | 306 | break; |
319 | | - default: break; |
| 307 | + case USB_SETUP_BREQUEST_CLEAR_FEATURE: |
| 308 | + if (buffer->setup.wLength || buffer->setup.wValue) break; |
| 309 | + usb_set_stall(data, ep, false); |
| 310 | + size = 0; |
| 311 | + break; |
| 312 | + case USB_SETUP_BREQUEST_SET_FEATURE: |
| 313 | + if (buffer->setup.wLength || buffer->setup.wValue) break; |
| 314 | + usb_set_stall(data, ep, true); |
| 315 | + size = 0; |
| 316 | + break; |
| 317 | + default: break; |
320 | 318 | } |
321 | 319 | break; |
| 320 | + default: break; |
322 | 321 | } |
323 | | - default: break; |
| 322 | + break; |
324 | 323 | } |
| 324 | + default: break; |
325 | 325 | } |
326 | 326 | union usb_endpoint_number ep0in = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN }; |
327 | 327 | union usb_endpoint_number ep0out = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_OUT }; |