Allow the user to leave MSC mode by pressing the USB POWER button (the one that's used to go to usb power mode on plugin) when the host OS hasn't locked the device.

This only works for devices that expose a removable device, so for now the gigabeat S is out of luck.
(slightly modified from FS#9993)


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20244 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Frank Gevaerts 2009-03-08 18:45:19 +00:00
parent 30a2713b6e
commit 871db6f5d9
3 changed files with 54 additions and 13 deletions

View file

@ -91,6 +91,42 @@ static int clamp_value_wrap(int value, int max, int min)
}
#endif
int handle_usb_events(struct event_queue *q)
{
struct queue_event ev;
int next_update=0;
/* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
while(1)
{
queue_wait_w_tmo(q, &ev, HZ/4);
switch(ev.id)
{
case SYS_USB_DISCONNECTED:
usb_acknowledge(SYS_USB_DISCONNECTED_ACK);
return 0;
case SYS_TIMEOUT:
break;
}
#if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB)
if((button_status() & ~USBPOWER_BTN_IGNORE) == USBPOWER_BUTTON)
{
usb_storage_try_release_storage();
}
#endif
if(TIME_AFTER(current_tick,next_update))
{
if(usb_inserted()) {
#if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */
led(mmc_usb_active(HZ));
#endif /* STORAGE_MMC */
gui_syncstatusbar_draw(&statusbars, false);
}
next_update=current_tick+HZ/2;
}
}
}
void usb_screen(void)
{
#ifdef USB_NONE
@ -142,14 +178,7 @@ void usb_screen(void)
while (button_get(true) & BUTTON_REL);
#else
usb_acknowledge(SYS_USB_CONNECTED_ACK);
while(usb_wait_for_disconnect_w_tmo(&button_queue, HZ)) {
if(usb_inserted()) {
#if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */
led(mmc_usb_active(HZ));
#endif /* STORAGE_MMC */
gui_syncstatusbar_draw(&statusbars, false);
}
}
while(handle_usb_events(&button_queue));
#endif /* SIMULATOR */
#ifdef HAVE_LCD_CHARCELLS
status_set_usb(false);