diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2011-01-29 00:22:42 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2011-01-29 00:22:42 +0000 |
commit | 088aaac9851d2529be2f4d2e0b301ed01b91a344 (patch) | |
tree | b30b2d2c1cd5bb1df9867e8177453b809f26228c /firmware | |
parent | 8855ac48db48425abac0998564fbd57148c7966b (diff) | |
download | rockbox-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.c | 16 |
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 |
374 | static void usb_thread(void) | 374 | static 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 |
750 | bool usb_exclusive_storage(void) | 761 | bool 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 | ||