Allow charge-only mode when connecting to a USB port Adapted from http://www.rockbox.org/tracker/task/10198 --- apps/lang/english.lang | 17 +++++++++ apps/menus/settings_menu.c | 7 ++++ apps/settings.h | 4 ++- apps/settings_list.c | 7 ++++ firmware/export/usb.h | 52 +------------------------- firmware/usb.c | 20 ++++++----- manual/configure_rockbox/system_options.tex | 11 ++++++ 7 files changed, 58 insertions(+), 60 deletions(-) diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 9034130..58aed3e 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -12647,3 +12647,20 @@ *: "Start File Browser at root" + + id: LANG_USB_CHARGE_ONLY + desc: in Settings -> System Settings + user: core + + *: none + usb_power: "Only charge on USB insert" + + + *: none + usb_power: "Only charge on USB insert" + + + *: none + usb_power: "Only charge on U S B insert" + + diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 5de3a30..fe23238 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -165,6 +165,7 @@ static int usbcharging_callback(int action,const struct menu_item_ex *this_item) } MENUITEM_SETTING(usb_charging, &global_settings.usb_charging, usbcharging_callback); #endif /* HAVE_USB_CHARGING_ENABLE */ + MAKE_MENU(battery_menu, ID2P(LANG_BATTERY_MENU), 0, Icon_NOICON, #if defined(BATTERY_CAPACITY_INC) && BATTERY_CAPACITY_INC > 0 &battery_capacity, @@ -176,6 +177,9 @@ MAKE_MENU(battery_menu, ID2P(LANG_BATTERY_MENU), 0, Icon_NOICON, &usb_charging, #endif ); +#ifdef HAVE_USB_POWER +MENUITEM_SETTING(usb_charge_only_item, &global_settings.usb_charge_only, NULL); +#endif /* Disk */ #ifdef HAVE_DISK_STORAGE MENUITEM_SETTING(disk_spindown, &global_settings.disk_spindown, NULL); @@ -314,6 +318,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), #ifdef HAVE_LINEOUT_POWEROFF &lineout_onoff, #endif +#ifdef HAVE_USB_POWER + &usb_charge_only_item, +#endif #ifdef HAVE_BUTTON_LIGHT &buttonlight_timeout, #endif diff --git a/apps/settings.h b/apps/settings.h index 20aee18..ef7544e 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -634,7 +634,9 @@ struct user_settings #ifdef HAVE_USB_CHARGING_ENABLE int usb_charging; #endif - +#ifdef HAVE_USB_POWER + bool usb_charge_only; +#endif /* device settings */ #ifdef HAVE_LCD_CONTRAST int contrast; /* lcd contrast */ diff --git a/apps/settings_list.c b/apps/settings_list.c index 2922bcd..b3620ea 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -41,6 +41,7 @@ #include "lcd-remote.h" #include "list.h" #include "rbunicode.h" +#include "usb.h" #ifdef HAVE_LCD_BITMAP #include "peakmeter.h" #endif @@ -1581,6 +1582,12 @@ const struct settings_list settings[] = { "off,on,force", NULL, 3, ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES), ID2P(LANG_FORCE)), #endif +#ifdef HAVE_USB_POWER +#ifndef SIMULATOR + OFFON_SETTING(0, usb_charge_only, LANG_USB_CHARGE_ONLY, false, + "usb charge only", usb_set_charge_setting), +#endif +#endif OFFON_SETTING(F_BANFROMQS,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support", NULL), TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, skip_length, diff --git a/firmware/export/usb.h b/firmware/export/usb.h index 3e236bf..9376c77 100644 --- a/firmware/export/usb.h +++ b/firmware/export/usb.h @@ -57,56 +57,6 @@ enum { #endif }; -#ifdef HAVE_USB_POWER -#if CONFIG_KEYPAD == RECORDER_PAD -#define USBPOWER_BUTTON BUTTON_F1 -#define USBPOWER_BTN_IGNORE BUTTON_ON -#elif CONFIG_KEYPAD == ONDIO_PAD -#define USBPOWER_BUTTON BUTTON_MENU -#define USBPOWER_BTN_IGNORE BUTTON_OFF -#elif (CONFIG_KEYPAD == IPOD_4G_PAD) -#define USBPOWER_BUTTON BUTTON_MENU -#define USBPOWER_BTN_IGNORE BUTTON_PLAY -#elif CONFIG_KEYPAD == IRIVER_H300_PAD -#define USBPOWER_BUTTON BUTTON_MODE -#define USBPOWER_BTN_IGNORE BUTTON_ON -#elif CONFIG_KEYPAD == GIGABEAT_PAD -#define USBPOWER_BUTTON BUTTON_MENU -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) || \ - (CONFIG_KEYPAD == MROBE100_PAD) -#define USBPOWER_BUTTON BUTTON_RIGHT -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ - (CONFIG_KEYPAD == SANSA_C200_PAD) || \ - (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \ - (CONFIG_KEYPAD == SANSA_FUZE_PAD) -#define USBPOWER_BUTTON BUTTON_SELECT -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif (CONFIG_KEYPAD == PHILIPS_SA9200_PAD) -#define USBPOWER_BUTTON BUTTON_PLAY -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD -#define USBPOWER_BUTTON BUTTON_PLAYLIST -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD -#define USBPOWER_BUTTON BUTTON_LEFT -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD -#define USBPOWER_BUTTON BUTTON_RIGHT -#define USBPOWER_BTN_IGNORE BUTTON_LEFT -#elif CONFIG_KEYPAD == COWON_D2_PAD -#define USBPOWER_BUTTON BUTTON_MENU -#define USBPOWER_BTN_IGNORE BUTTON_MINUS -#elif CONFIG_KEYPAD == ONDAVX747_PAD -#define USBPOWER_BUTTON BUTTON_VOL_UP -#define USBPOWER_BTN_IGNORE BUTTON_VOL_DOWN -#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD -#define USBPOWER_BUTTON BUTTON_REC -#define USBPOWER_BTN_IGNORE BUTTON_POWER -#endif -#endif /* HAVE_USB_POWER */ - #ifdef HAVE_USBSTACK /* USB class drivers */ enum { @@ -149,6 +99,8 @@ int usb_detect(void); /* return the raw hardware value - nothing/pc/charger */ void usb_status_event(int current_status); #ifdef HAVE_USB_POWER bool usb_powered(void); +void usb_set_charge_setting(bool charge_only); +bool usb_charge_only(void); #ifdef HAVE_USB_CHARGING_ENABLE enum { USB_CHARGING_DISABLE, diff --git a/firmware/usb.c b/firmware/usb.c index 9eaf201..b2c55fa 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -201,19 +201,21 @@ static inline void usb_slave_mode(bool on) #endif /* HAVE_USBSTACK */ #ifdef HAVE_USB_POWER -static inline bool usb_power_button(void) +static bool usb_charge_only_setting = false; +bool usb_charge_only(void) { -#if (defined(IRIVER_H10) || defined (IRIVER_H10_5GB)) && !defined(USE_ROCKBOX_USB) - return (button_status() & ~USBPOWER_BTN_IGNORE) != USBPOWER_BUTTON; -#else - return (button_status() & ~USBPOWER_BTN_IGNORE) == USBPOWER_BUTTON; -#endif + bool button = button_status() != BUTTON_NONE; + return (usb_charge_only_setting && !button) || + (!usb_charge_only_setting && button); +} +void usb_set_charge_setting(bool charge_only) +{ + usb_charge_only_setting = charge_only; } - #ifdef USB_FIREWIRE_HANDLING static inline bool usb_reboot_button(void) { - return (button_status() & ~USBPOWER_BTN_IGNORE) != USBPOWER_BUTTON; + return button_status()!=BUTTON_NULL; } #endif #endif /* HAVE_USB_POWER */ @@ -275,7 +277,7 @@ static void usb_thread(void) } #endif #ifdef HAVE_USB_POWER - if(usb_power_button()) + if(usb_charge_only()) { /* Only charging is desired */ usb_state = USB_POWERED; diff --git a/manual/configure_rockbox/system_options.tex b/manual/configure_rockbox/system_options.tex index 9e70a0e..337a4bb 100644 --- a/manual/configure_rockbox/system_options.tex +++ b/manual/configure_rockbox/system_options.tex @@ -192,6 +192,17 @@ devices an enabled line-out will consume some power even if not used. If it is not required, then turning this setting \setting{Off} will save battery and therefore result in better runtime. } +\opt{usb_charging}{ +\subsection{Only charge on USB insert} +When this is \setting{Off}, if a USB cable is inserted that is connected to a PC, Hub, +or certain types of chargers the player will attempt to enter USB disk mode and +connect while charging. If any button is held down, the player will instead +simply charge while making no attempt to connect. During this charging, +music may still be played and the player may be used as normal. If this +setting is set to \setting{On} the player will only charge by default, and +not attempt to enter USB disk mode unless a button is held down as the +USB cable is inserted. +} \opt{HAVE_BUTTON_LIGHTS}{ \opt{e200,e200v2}{ -- 1.7.1