forked from len0rd/rockbox
usb: Add ability to prompt user about what to do upon usb insertion
v3: Add in config option v4: Bugfixes v5: Force a redraw upon exiting v6: keypress-in-chargeonly mode enables mass storage (and vice versa) v7: Fix bootloader builds v8: Update manual, and have bootloader respect keypresses v9: Change default to mass storage (ie no change in behavior) todo: * test-build dx50/dx90 * Switch from yes/no to proper menu? * prevent WPS progress bar from drawing over us Change-Id: I82e0ccb08497b7a5aa756ce77f1332ee963703a7 ... Change-Id: I7946cf240b18a4fa8ace5e25e1eb6e97b8b12d7c
This commit is contained in:
parent
fc4fff0b81
commit
60f581e8f5
30 changed files with 224 additions and 156 deletions
|
@ -42,6 +42,14 @@
|
|||
#include "logf.h"
|
||||
#include "screendump.h"
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
#include "misc.h"
|
||||
#include "gui/yesno.h"
|
||||
#include "settings.h"
|
||||
#include "lang_enum.h"
|
||||
#include "gui/skin_engine/skin_engine.h"
|
||||
#endif
|
||||
|
||||
/* Conditions under which we want the entire driver */
|
||||
#if !defined(BOOTLOADER) || \
|
||||
(defined(HAVE_USBSTACK) && defined(HAVE_BOOTLOADER_USB_MODE)) || \
|
||||
|
@ -71,7 +79,7 @@ static int usb_mmc_countdown = 0;
|
|||
#ifndef USB_EXTRA_STACK
|
||||
# define USB_EXTRA_STACK 0x0 /*Define in firmware/export/config/[target].h*/
|
||||
#endif
|
||||
static long usb_stack[(DEFAULT_STACK_SIZE + DUMP_BMP_LINESIZE + USB_EXTRA_STACK)/sizeof(long)];
|
||||
static long usb_stack[(DEFAULT_STACK_SIZE*2 + DUMP_BMP_LINESIZE + USB_EXTRA_STACK)/sizeof(long)];
|
||||
static const char usb_thread_name[] = "usb";
|
||||
static unsigned int usb_thread_entry = 0;
|
||||
static bool usb_monitor_enabled = false;
|
||||
|
@ -87,7 +95,8 @@ static bool usb_host_present = false;
|
|||
static int usb_num_acks_to_expect = 0;
|
||||
static long usb_last_broadcast_tick = 0;
|
||||
#ifdef HAVE_USB_POWER
|
||||
static bool usb_charging_only = false;
|
||||
static int usb_mode = USB_MODE_ASK;
|
||||
static int new_usbmode = USB_MODE_ASK;
|
||||
#endif
|
||||
|
||||
static int usb_release_exclusive_storage(void);
|
||||
|
@ -130,17 +139,15 @@ static inline bool usb_do_screendump(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Power (charging-only) button */
|
||||
static inline void usb_detect_charging_only(bool detect)
|
||||
{
|
||||
#ifdef HAVE_USB_POWER
|
||||
if (detect)
|
||||
detect = button_status() & ~USBPOWER_BTN_IGNORE;
|
||||
|
||||
usb_charging_only = detect;
|
||||
void usb_set_mode(int mode)
|
||||
{
|
||||
usb_mode = mode;
|
||||
#if defined(DX50) || defined(DX90)
|
||||
ibasso_set_usb_mode(mode);
|
||||
#endif
|
||||
(void)detect;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USB_FIREWIRE_HANDLING
|
||||
static inline bool usb_reboot_button(void)
|
||||
|
@ -201,7 +208,7 @@ static inline bool usb_configure_drivers(int for_state)
|
|||
usb_attach(); /* Powered only: attach now. */
|
||||
break;
|
||||
/* USB_POWERED: */
|
||||
|
||||
|
||||
case USB_INSERTED:
|
||||
#ifdef USB_ENABLE_STORAGE
|
||||
usb_core_enable_driver(USB_DRIVER_MASS_STORAGE, true);
|
||||
|
@ -372,7 +379,7 @@ static void usb_set_host_present(bool present)
|
|||
}
|
||||
|
||||
#ifdef HAVE_USB_POWER
|
||||
if (usb_charging_only)
|
||||
if (new_usbmode == USB_MODE_CHARGE || new_usbmode == USB_MODE_ADB)
|
||||
{
|
||||
/* Only charging is desired */
|
||||
usb_configure_drivers(USB_POWERED);
|
||||
|
@ -464,9 +471,49 @@ static void NORETURN_ATTR usb_thread(void)
|
|||
}
|
||||
|
||||
usb_state = USB_POWERED;
|
||||
|
||||
usb_stack_enable(true);
|
||||
|
||||
usb_detect_charging_only(true);
|
||||
/* Power (charging-only) button */
|
||||
#ifdef HAVE_USB_POWER
|
||||
switch (usb_mode) {
|
||||
case USB_MODE_CHARGE:
|
||||
case USB_MODE_ADB:
|
||||
if (button_status() & ~USBPOWER_BTN_IGNORE)
|
||||
new_usbmode = USB_MODE_MASS_STORAGE;
|
||||
break;
|
||||
#ifndef BOOTLOADER
|
||||
case USB_MODE_ASK:
|
||||
new_usbmode = USB_MODE_ASK;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
case USB_MODE_MASS_STORAGE:
|
||||
if (button_status() & ~USBPOWER_BTN_IGNORE)
|
||||
new_usbmode = USB_MODE_CHARGE;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
if (new_usbmode == USB_MODE_ASK)
|
||||
{
|
||||
push_current_activity(ACTIVITY_USBSCREEN);
|
||||
if (yesno_pop(ID2P(LANG_ENTER_USB_STORAGE_MODE_QUERY)))
|
||||
new_usbmode = USB_MODE_MASS_STORAGE;
|
||||
else
|
||||
new_usbmode = USB_MODE_CHARGE;
|
||||
pop_current_activity();
|
||||
/* Force full redraw */
|
||||
// queue_post(&button_queue, BUTTON_REDRAW, 0);
|
||||
// Alternative approach, as above is supposedly inadequate by design.
|
||||
FOR_NB_SCREENS(i)
|
||||
{
|
||||
struct screen *screen = &screens[i];
|
||||
screen->set_viewport(NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef USB_DETECT_BY_REQUEST
|
||||
usb_set_host_present(true);
|
||||
|
@ -493,8 +540,10 @@ static void NORETURN_ATTR usb_thread(void)
|
|||
usb_slave_mode(false);
|
||||
|
||||
usb_state = USB_EXTRACTED;
|
||||
#ifdef HAVE_USB_POWER
|
||||
new_usbmode = usb_mode;
|
||||
#endif
|
||||
|
||||
usb_detect_charging_only(false);
|
||||
usb_set_host_present(false);
|
||||
break;
|
||||
/* USB_EXTRACTED: */
|
||||
|
@ -597,7 +646,7 @@ static void usb_tick(void)
|
|||
#ifdef USB_FIREWIRE_HANDLING
|
||||
static int firewire_countdown = -1;
|
||||
static int last_firewire_status = false;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if(usb_monitor_enabled)
|
||||
{
|
||||
|
@ -814,4 +863,3 @@ void usb_wait_for_disconnect(struct event_queue *q)
|
|||
(void)q;
|
||||
}
|
||||
#endif /* USB_NONE */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue