diff --git a/apps/features.txt b/apps/features.txt index 93b81ff4a5..44ef3ddf95 100644 --- a/apps/features.txt +++ b/apps/features.txt @@ -96,6 +96,10 @@ pitchscreen multivolume #endif +#if defined(HAVE_MULTIDRIVE) && defined(USB_ENABLE_STORAGE) +multidrive_usb +#endif + #if defined(HAVE_QUICKSCREEN) quickscreen #endif diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 37f673bc95..5ee087eb1f 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -12813,3 +12813,20 @@ *: "Save Changes?" + + id: LANG_USB_SKIP_FIRST_DRIVE + desc: in settings_menu + user: core + + *: none + multidrive_usb: "USB Hide Internal Drive" + + + *: none + multidrive_usb: "USB Hide Internal Drive" + + + *: none + multidrive_usb: "USB Hide Internal Drive" + + diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 82c91aa3c4..02f68aa4ab 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -268,6 +268,9 @@ MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); MENUITEM_SETTING(usb_hid, &global_settings.usb_hid, NULL); MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL); #endif +#if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE) +MENUITEM_SETTING(usb_skip_first_drive, &global_settings.usb_skip_first_drive, NULL); +#endif #ifdef HAVE_MORSE_INPUT MENUITEM_SETTING(morse_input, &global_settings.morse_input, NULL); @@ -329,6 +332,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), #ifdef USB_ENABLE_HID &usb_hid, &usb_keypad_mode, +#endif +#if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE) + &usb_skip_first_drive, #endif ); diff --git a/apps/settings.h b/apps/settings.h index f48dd5debc..d7a72268e6 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -772,6 +772,10 @@ struct user_settings int usb_keypad_mode; #endif +#if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE) + bool usb_skip_first_drive; +#endif + #ifdef HAVE_LCD_BITMAP unsigned char ui_vp_config[64]; /* viewport string for the lists */ #ifdef HAVE_REMOTE_LCD diff --git a/apps/settings_list.c b/apps/settings_list.c index 292749beaf..27726dd391 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -1791,6 +1791,10 @@ const struct settings_list settings[] = { ), /* CHOICE_SETTING( usb_keypad_mode ) */ #endif +#if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE) + OFFON_SETTING(0, usb_skip_first_drive, LANG_USB_SKIP_FIRST_DRIVE, false, "usb skip first drive", usb_set_skip_first_drive), +#endif + /* Customizable list */ #ifdef HAVE_LCD_BITMAP VIEWPORT_SETTING(ui_vp_config, "ui viewport"), diff --git a/firmware/export/usb.h b/firmware/export/usb.h index d4a6550a22..ca3f72eaa4 100644 --- a/firmware/export/usb.h +++ b/firmware/export/usb.h @@ -145,4 +145,8 @@ void usb_firewire_connect_event(void); void usb_set_hid(bool enable); #endif +#if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE) +void usb_set_skip_first_drive(bool skip); +#endif + #endif diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index 6d407cccc5..8203ad4177 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c @@ -36,12 +36,6 @@ /* For sector filter macro definitions */ #include "usb-target.h" -/* Enable the following define to export only the SD card slot. This - * is useful for USBCV MSC tests, as those are destructive. - * This won't work right if the device doesn't have a card slot. - */ -//#define HIDE_FIRST_DRIVE - #ifdef USB_USE_RAMDISK #define RAMDISK_SIZE 2048 #endif @@ -314,6 +308,10 @@ static bool locked[NUM_DRIVES]; static int usb_interface; static int ep_in, ep_out; +#if defined(HAVE_MULTIDRIVE) +static bool skip_first = 0; +#endif + #ifdef USB_USE_RAMDISK static unsigned char* ramdisk_buffer; #endif @@ -400,6 +398,13 @@ void usb_storage_notify_hotswap(int volume,bool inserted) } #endif +#ifdef HAVE_MULTIDRIVE +void usb_set_skip_first_drive(bool skip) +{ + skip_first = skip; +} +#endif + /* called by usb_core_init() */ void usb_storage_init(void) { @@ -690,8 +695,8 @@ bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* des switch (req->bRequest) { case USB_BULK_GET_MAX_LUN: { *tb.max_lun = storage_num_drives() - 1; -#ifdef HIDE_FIRST_DRIVE - *tb.max_lun --; +#if defined(HAVE_MULTIDRIVE) + if(skip_first) (*tb.max_lun) --; #endif logf("ums: getmaxlun"); usb_drv_recv(EP_CONTROL, NULL, 0); /* ack */ @@ -777,8 +782,8 @@ static void handle_scsi(struct command_block_wrapper* cbw) * bogus data */ cbw->signature=0; -#ifdef HIDE_FIRST_DRIVE - lun++; +#if defined(HAVE_MULTIDRIVE) + if(skip_first) lun++; #endif storage_get_info(lun,&info); diff --git a/manual/appendix/config_file_options.tex b/manual/appendix/config_file_options.tex index 520adbb545..a746198981 100644 --- a/manual/appendix/config_file_options.tex +++ b/manual/appendix/config_file_options.tex @@ -98,6 +98,10 @@ usb keypad mode & multimedia, presentation, browser\opt{usb_hid_mouse}{, mouse}& N/A\\ } + \opt{multidrive_usb}{ + usb skip first drive & on, off & N/A\\ + } + idle poweroff & off, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 30, 45, 60 & min\\ max files in playlist & 1000 - 32000 & N/A\\ diff --git a/manual/configure_rockbox/system_options.tex b/manual/configure_rockbox/system_options.tex index f53fa50406..41b487164d 100644 --- a/manual/configure_rockbox/system_options.tex +++ b/manual/configure_rockbox/system_options.tex @@ -719,3 +719,10 @@ therefore result in better runtime. }} \end{description} } +\opt{multidrive_usb}{ + \subsection{USB Hide Internal Drive} + If this option is turned \setting{On}, the internal storage drive will not + be exposed on the USB Mass Storage Device. This e.g. makes it possible to + access the card slot from systems that can not handle USB devices with + multiple drives, such as some car audio systems. +}