diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2009-03-08 18:45:19 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2009-03-08 18:45:19 +0000 |
commit | 871db6f5d997e9fffe4fe951e708e42ac77cc181 (patch) | |
tree | 4daacd7068637d12c4c43726a235567f96104bda /apps | |
parent | 30a2713b6eef28194d9feb4e9758624f821936ff (diff) | |
download | rockbox-871db6f5d997e9fffe4fe951e708e42ac77cc181.tar.gz rockbox-871db6f5d997e9fffe4fe951e708e42ac77cc181.zip |
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
Diffstat (limited to 'apps')
-rw-r--r-- | apps/screens.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/apps/screens.c b/apps/screens.c index c327e65037..e1e1c37bf5 100644 --- a/apps/screens.c +++ b/apps/screens.c | |||
@@ -91,6 +91,42 @@ static int clamp_value_wrap(int value, int max, int min) | |||
91 | } | 91 | } |
92 | #endif | 92 | #endif |
93 | 93 | ||
94 | int handle_usb_events(struct event_queue *q) | ||
95 | { | ||
96 | struct queue_event ev; | ||
97 | int next_update=0; | ||
98 | |||
99 | /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */ | ||
100 | while(1) | ||
101 | { | ||
102 | queue_wait_w_tmo(q, &ev, HZ/4); | ||
103 | switch(ev.id) | ||
104 | { | ||
105 | case SYS_USB_DISCONNECTED: | ||
106 | usb_acknowledge(SYS_USB_DISCONNECTED_ACK); | ||
107 | return 0; | ||
108 | case SYS_TIMEOUT: | ||
109 | break; | ||
110 | } | ||
111 | #if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB) | ||
112 | if((button_status() & ~USBPOWER_BTN_IGNORE) == USBPOWER_BUTTON) | ||
113 | { | ||
114 | usb_storage_try_release_storage(); | ||
115 | } | ||
116 | #endif | ||
117 | if(TIME_AFTER(current_tick,next_update)) | ||
118 | { | ||
119 | if(usb_inserted()) { | ||
120 | #if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */ | ||
121 | led(mmc_usb_active(HZ)); | ||
122 | #endif /* STORAGE_MMC */ | ||
123 | gui_syncstatusbar_draw(&statusbars, false); | ||
124 | } | ||
125 | next_update=current_tick+HZ/2; | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | |||
94 | void usb_screen(void) | 130 | void usb_screen(void) |
95 | { | 131 | { |
96 | #ifdef USB_NONE | 132 | #ifdef USB_NONE |
@@ -142,14 +178,7 @@ void usb_screen(void) | |||
142 | while (button_get(true) & BUTTON_REL); | 178 | while (button_get(true) & BUTTON_REL); |
143 | #else | 179 | #else |
144 | usb_acknowledge(SYS_USB_CONNECTED_ACK); | 180 | usb_acknowledge(SYS_USB_CONNECTED_ACK); |
145 | while(usb_wait_for_disconnect_w_tmo(&button_queue, HZ)) { | 181 | while(handle_usb_events(&button_queue)); |
146 | if(usb_inserted()) { | ||
147 | #if (CONFIG_STORAGE & STORAGE_MMC) /* USB-MMC bridge can report activity */ | ||
148 | led(mmc_usb_active(HZ)); | ||
149 | #endif /* STORAGE_MMC */ | ||
150 | gui_syncstatusbar_draw(&statusbars, false); | ||
151 | } | ||
152 | } | ||
153 | #endif /* SIMULATOR */ | 182 | #endif /* SIMULATOR */ |
154 | #ifdef HAVE_LCD_CHARCELLS | 183 | #ifdef HAVE_LCD_CHARCELLS |
155 | status_set_usb(false); | 184 | status_set_usb(false); |