summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-01-29 00:22:42 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-01-29 00:22:42 +0000
commit088aaac9851d2529be2f4d2e0b301ed01b91a344 (patch)
treeb30b2d2c1cd5bb1df9867e8177453b809f26228c /firmware
parent8855ac48db48425abac0998564fbd57148c7966b (diff)
downloadrockbox-088aaac9851d2529be2f4d2e0b301ed01b91a344.tar.gz
rockbox-088aaac9851d2529be2f4d2e0b301ed01b91a344.zip
USB: Thread must remember that a host has been detected since the POWERED state is ambiguous when waiting for host. Storage access is not yet actually exclusive if not USB_INSERTED. usb_start_monitoring seems better posting USB_UNPOWERED only if USB_EXTRACTED, interpreting POWERED/INSERTED as POWERED.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29153 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/usb.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/firmware/usb.c b/firmware/usb.c
index 91c620fdc0..13f66159ac 100644
--- a/firmware/usb.c
+++ b/firmware/usb.c
@@ -373,6 +373,9 @@ static void usb_thread(void) NORETURN_ATTR;
373#endif 373#endif
374static void usb_thread(void) 374static void usb_thread(void)
375{ 375{
376#ifdef USB_DELAYED_INSERT
377 bool host_detected = false;
378#endif
376 int num_acks_to_expect = 0; 379 int num_acks_to_expect = 0;
377 long last_broadcast_tick = current_tick; 380 long last_broadcast_tick = current_tick;
378 struct queue_event ev; 381 struct queue_event ev;
@@ -395,6 +398,11 @@ static void usb_thread(void)
395#ifdef USB_DELAYED_INSERT 398#ifdef USB_DELAYED_INSERT
396 if(usb_state != USB_POWERED) 399 if(usb_state != USB_POWERED)
397 break; 400 break;
401
402 if (host_detected)
403 break; /* Drivers configured but we're still USB_POWERED */
404
405 host_detected = true;
398#else /* !USB_DELAYED_INSERT */ 406#else /* !USB_DELAYED_INSERT */
399 if(usb_state != USB_EXTRACTED) 407 if(usb_state != USB_EXTRACTED)
400 break; 408 break;
@@ -490,6 +498,9 @@ static void usb_thread(void)
490 498
491 /* Ok to broadcast disconnect now */ 499 /* Ok to broadcast disconnect now */
492 usb_configure_drivers(USB_EXTRACTED); 500 usb_configure_drivers(USB_EXTRACTED);
501#ifdef USB_DELAYED_INSERT
502 host_detected = false;
503#endif
493 break; 504 break;
494 /* USB_UNPOWERED: USB_EXTRACTED: */ 505 /* USB_UNPOWERED: USB_EXTRACTED: */
495 506
@@ -566,7 +577,7 @@ void usb_start_monitoring(void)
566 * before or during boot. */ 577 * before or during boot. */
567#ifdef USB_DELAYED_INSERT 578#ifdef USB_DELAYED_INSERT
568 /* Filter the status - USB_INSERTED may happen later */ 579 /* Filter the status - USB_INSERTED may happen later */
569 status = (status == USB_INSERTED) ? USB_POWERED : USB_UNPOWERED; 580 status = (status == USB_EXTRACTED) ? USB_UNPOWERED : USB_POWERED;
570#endif 581#endif
571 usb_status_event(status); 582 usb_status_event(status);
572 583
@@ -749,7 +760,8 @@ bool usb_inserted(void)
749#ifdef HAVE_USBSTACK 760#ifdef HAVE_USBSTACK
750bool usb_exclusive_storage(void) 761bool usb_exclusive_storage(void)
751{ 762{
752 return exclusive_storage_access; 763 /* Storage isn't actually exclusive until slave mode has been entered */
764 return exclusive_storage_access && usb_state == USB_INSERTED;
753} 765}
754#endif /* HAVE_USBSTACK */ 766#endif /* HAVE_USBSTACK */
755 767