Revision 50b7963e hw/usb.c
b/hw/usb.c | ||
---|---|---|
63 | 63 |
protocol) |
64 | 64 |
*/ |
65 | 65 |
|
66 |
#define SETUP_STATE_IDLE 0 |
|
67 |
#define SETUP_STATE_DATA 1 |
|
68 |
#define SETUP_STATE_ACK 2 |
|
66 |
#define SETUP_STATE_IDLE 0 |
|
67 |
#define SETUP_STATE_SETUP 1 |
|
68 |
#define SETUP_STATE_DATA 2 |
|
69 |
#define SETUP_STATE_ACK 3 |
|
69 | 70 |
|
70 | 71 |
static int do_token_setup(USBDevice *s, USBPacket *p) |
71 | 72 |
{ |
... | ... | |
86 | 87 |
if (s->setup_buf[0] & USB_DIR_IN) { |
87 | 88 |
ret = s->info->handle_control(s, p, request, value, index, |
88 | 89 |
s->setup_len, s->data_buf); |
90 |
if (ret == USB_RET_ASYNC) { |
|
91 |
s->setup_state = SETUP_STATE_SETUP; |
|
92 |
return USB_RET_ASYNC; |
|
93 |
} |
|
89 | 94 |
if (ret < 0) |
90 | 95 |
return ret; |
91 | 96 |
|
... | ... | |
241 | 246 |
} |
242 | 247 |
} |
243 | 248 |
|
249 |
/* ctrl complete function for devices which use usb_generic_handle_packet and |
|
250 |
may return USB_RET_ASYNC from their handle_control callback. Device code |
|
251 |
which does this *must* call this function instead of the normal |
|
252 |
usb_packet_complete to complete their async control packets. */ |
|
253 |
void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p) |
|
254 |
{ |
|
255 |
if (p->len < 0) { |
|
256 |
s->setup_state = SETUP_STATE_IDLE; |
|
257 |
} |
|
258 |
|
|
259 |
switch (s->setup_state) { |
|
260 |
case SETUP_STATE_SETUP: |
|
261 |
if (p->len < s->setup_len) { |
|
262 |
s->setup_len = p->len; |
|
263 |
} |
|
264 |
s->setup_state = SETUP_STATE_DATA; |
|
265 |
p->len = 8; |
|
266 |
break; |
|
267 |
|
|
268 |
case SETUP_STATE_ACK: |
|
269 |
s->setup_state = SETUP_STATE_IDLE; |
|
270 |
p->len = 0; |
|
271 |
break; |
|
272 |
|
|
273 |
default: |
|
274 |
break; |
|
275 |
} |
|
276 |
usb_packet_complete(s, p); |
|
277 |
} |
|
278 |
|
|
244 | 279 |
/* XXX: fix overflow */ |
245 | 280 |
int set_usb_string(uint8_t *buf, const char *str) |
246 | 281 |
{ |
Also available in: Unified diff