1
0
Fork 0
forked from len0rd/rockbox

FS#10704 - Make a configuration option to disable USB HID

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23322 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Tomer Shalev 2009-10-23 13:29:19 +00:00
parent 6314952ff1
commit 83d24f89df
14 changed files with 137 additions and 57 deletions

View file

@ -49,6 +49,7 @@
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
int usb_keypad_mode; int usb_keypad_mode;
static bool usb_hid;
#endif #endif
#ifndef SIMULATOR #ifndef SIMULATOR
@ -64,7 +65,7 @@ static int handle_usb_events(void)
{ {
int button; int button;
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
if (usb_core_driver_enabled(USB_DRIVER_HID)) if (usb_hid)
{ {
button = get_hid_usb_action(); button = get_hid_usb_action();
@ -157,20 +158,24 @@ static void usb_screen_fix_viewports(struct screen *screen,
logo->height = logo_height; logo->height = logo_height;
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
struct viewport *title = &usb_screen_vps->title; if (usb_hid)
int char_height, nb_lines; {
struct viewport *title = &usb_screen_vps->title;
int char_height, nb_lines;
/* nb_lines only returns the number of fully visible lines, small screens /* nb_lines only returns the number of fully visible lines, small
or really large fonts could cause problems with the calculation below. * screens or really large fonts could cause problems with the
*/ * calculation below.
nb_lines = viewport_get_nb_lines(parent); */
if (nb_lines == 0) nb_lines = viewport_get_nb_lines(parent);
nb_lines++; if (nb_lines == 0)
nb_lines++;
char_height = parent->height/nb_lines; char_height = parent->height/nb_lines;
*title = *parent; *title = *parent;
title->y = logo->y + logo->height + char_height; title->y = logo->y + logo->height + char_height;
}
#endif #endif
} }
#endif #endif
@ -209,9 +214,12 @@ static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar)
screen->transparent_bitmap(usblogo, 0, 0, logo->width, screen->transparent_bitmap(usblogo, 0, 0, logo->width,
logo->height); logo->height);
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
screen->set_viewport(&usb_screen_vps->title); if (usb_hid)
usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER; {
screen->puts_scroll(0, 0, str(keypad_mode_name_get())); screen->set_viewport(&usb_screen_vps->title);
usb_screen_vps->title.flags |= VP_FLAG_ALIGN_CENTER;
screen->puts_scroll(0, 0, str(keypad_mode_name_get()));
}
#endif /* USB_ENABLE_HID */ #endif /* USB_ENABLE_HID */
} }
screen->set_viewport(parent); screen->set_viewport(parent);
@ -252,6 +260,7 @@ void gui_usb_screen_run(void)
#endif #endif
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
usb_hid = global_settings.usb_hid;
usb_keypad_mode = global_settings.usb_keypad_mode; usb_keypad_mode = global_settings.usb_keypad_mode;
#endif #endif
@ -283,7 +292,7 @@ void gui_usb_screen_run(void)
const struct viewport* vp = NULL; const struct viewport* vp = NULL;
#if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID) #if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID)
vp = &usb_screen_vps_ar[i].title; vp = usb_hid ? &usb_screen_vps_ar[i].title : NULL;
#elif !defined(HAVE_LCD_BITMAP) #elif !defined(HAVE_LCD_BITMAP)
vp = &usb_screen_vps_ar[i].parent; vp = &usb_screen_vps_ar[i].parent;
#endif #endif

View file

@ -13165,3 +13165,20 @@
remote: "Remote Custom Statusbar" remote: "Remote Custom Statusbar"
</voice> </voice>
</phrase> </phrase>
<phrase>
id: LANG_USB_HID
desc: in settings_menu
user: core
<source>
*: none
usb_hid: "USB HID"
</source>
<dest>
*: none
usb_hid: "USB HID"
</dest>
<voice>
*: none
usb_hid: "USB Human Interface Device"
</voice>
</phrase>

View file

@ -253,6 +253,7 @@ MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL);
#endif #endif
MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL);
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
MENUITEM_SETTING(usb_hid, &global_settings.usb_hid, NULL);
MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL); MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL);
#endif #endif
@ -304,6 +305,7 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
&touchpad_sensitivity, &touchpad_sensitivity,
#endif #endif
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
&usb_hid,
&usb_keypad_mode, &usb_keypad_mode,
#endif #endif
); );

View file

@ -1047,4 +1047,16 @@ err:
va_end(ap); va_end(ap);
return 0; return 0;
} }
/* only used in USB HID and set_time screen */
#if defined(USB_ENABLE_HID) || (CONFIG_RTC != 0)
int clamp_value_wrap(int value, int max, int min)
{
if (value > max)
return min;
if (value < min)
return max;
return value;
}
#endif
#endif #endif

View file

@ -92,6 +92,7 @@ bool dir_exists(const char *path);
*/ */
char *strip_extension(char* buffer, int buffer_size, const char *filename); char *strip_extension(char* buffer, int buffer_size, const char *filename);
#ifdef HAVE_LCD_BITMAP
/* A simplified scanf */ /* A simplified scanf */
/* /*
* Checks whether the value at position 'position' was really read * Checks whether the value at position 'position' was really read
@ -103,4 +104,10 @@ char *strip_extension(char* buffer, int buffer_size, const char *filename);
const char* parse_list(const char *fmt, uint32_t *set_vals, const char* parse_list(const char *fmt, uint32_t *set_vals,
const char sep, const char* str, ...); const char sep, const char* str, ...);
/* only used in USB HID and set_time screen */
#if defined(USB_ENABLE_HID) || (CONFIG_RTC != 0)
int clamp_value_wrap(int value, int max, int min);
#endif
#endif
#endif /* MISC_H */ #endif /* MISC_H */

View file

@ -60,18 +60,6 @@
#include "dsp.h" #include "dsp.h"
#endif #endif
/* only used in set_time screen */
#if defined(HAVE_LCD_BITMAP) && (CONFIG_RTC != 0)
static int clamp_value_wrap(int value, int max, int min)
{
if (value > max)
return min;
if (value < min)
return max;
return value;
}
#endif
#if (CONFIG_STORAGE & STORAGE_MMC) #if (CONFIG_STORAGE & STORAGE_MMC)
int mmc_remove_request(void) int mmc_remove_request(void)
{ {

View file

@ -781,6 +781,7 @@ struct user_settings
/* new stuff to be added at the end */ /* new stuff to be added at the end */
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
bool usb_hid;
int usb_keypad_mode; int usb_keypad_mode;
#endif #endif

View file

@ -31,6 +31,7 @@
#include "backlight.h" #include "backlight.h"
#include "settings.h" #include "settings.h"
#include "settings_list.h" #include "settings_list.h"
#include "usb.h"
#include "sound.h" #include "sound.h"
#include "dsp.h" #include "dsp.h"
#include "mpeg.h" #include "mpeg.h"
@ -1623,6 +1624,7 @@ const struct settings_list settings[] = {
#endif #endif
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
OFFON_SETTING(0, usb_hid, LANG_USB_HID, true, "usb hid", usb_set_hid),
CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0, CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0,
"usb keypad mode", "multimedia,presentation,browser" "usb keypad mode", "multimedia,presentation,browser"
#ifdef HAVE_USB_HID_MOUSE #ifdef HAVE_USB_HID_MOUSE

View file

@ -23,6 +23,7 @@
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
#include "action.h" #include "action.h"
#include "lang.h" #include "lang.h"
#include "misc.h"
#include "usbstack/usb_hid.h" #include "usbstack/usb_hid.h"
//#define LOGF_ENABLE //#define LOGF_ENABLE
#include "logf.h" #include "logf.h"
@ -174,40 +175,47 @@ extern int usb_keypad_mode;
int get_hid_usb_action(void) int get_hid_usb_action(void)
{ {
int action; int action, step;
const hid_key_mapping_t *key_mapping = hid_key_mappings[usb_keypad_mode]; const hid_key_mapping_t *key_mapping = hid_key_mappings[usb_keypad_mode];
step = -1;
action = get_action(key_mapping->context, HZ/4); action = get_action(key_mapping->context, HZ/4);
/* Skip key mappings in a cyclic way */ switch (action)
if (action == ACTION_USB_HID_MODE_SWITCH_NEXT)
{ {
/* TODO: Use clamp_value_wrap() */ case ACTION_USB_HID_MODE_SWITCH_NEXT:
usb_keypad_mode = (usb_keypad_mode + 1) % NUM_KEY_MAPPINGS; step = 1;
} case ACTION_USB_HID_MODE_SWITCH_PREV:
else if (action == ACTION_USB_HID_MODE_SWITCH_PREV) /* Switch key mappings in a cyclic way */
{ usb_keypad_mode = clamp_value_wrap(usb_keypad_mode + step,
/* TODO: Use clamp_value_wrap() */ NUM_KEY_MAPPINGS - 1, 0);
usb_keypad_mode = (usb_keypad_mode - 1) % NUM_KEY_MAPPINGS; break;
} default:
else if (action > ACTION_USB_HID_FIRST && action < ACTION_USB_HID_LAST)
{
const mapping_t *mapping;
const hid_key_mapping_t *key_mapping =
hid_key_mappings[usb_keypad_mode];
for (mapping = key_mapping->mapping; mapping->action; mapping++)
{
if (action == mapping->action)
{ {
logf("Action %d", action); const mapping_t *mapping;
usb_hid_send(key_mapping->usage_page, mapping->id); const hid_key_mapping_t *key_mapping =
hid_key_mappings[usb_keypad_mode];
if (action <= ACTION_USB_HID_FIRST ||
action >= ACTION_USB_HID_LAST)
{
break;
}
for (mapping = key_mapping->mapping; mapping->action; mapping++)
{
if (action == mapping->action)
{
logf("Action %d", action);
usb_hid_send(key_mapping->usage_page, mapping->id);
break;
}
}
#ifdef DEBUG
if (!mapping->action)
logf("Action %d not found", action);
#endif
break; break;
} }
}
#ifdef DEBUG
if (!mapping->action)
logf("Action %d not found", action);
#endif
} }
return action; return action;

View file

@ -148,4 +148,8 @@ bool firewire_detect(void);
void usb_firewire_connect_event(void); void usb_firewire_connect_event(void);
#endif #endif
#ifdef USB_ENABLE_HID
void usb_set_hid(bool enable);
#endif
#endif #endif

View file

@ -218,6 +218,10 @@ static inline bool usb_reboot_button(void)
#endif #endif
#endif /* HAVE_USB_POWER */ #endif /* HAVE_USB_POWER */
#ifdef USB_ENABLE_HID
static bool usb_hid = true;
#endif
static void usb_thread(void) static void usb_thread(void)
{ {
int num_acks_to_expect = 0; int num_acks_to_expect = 0;
@ -284,7 +288,7 @@ static void usb_thread(void)
#ifdef USB_ENABLE_CHARGING_ONLY #ifdef USB_ENABLE_CHARGING_ONLY
usb_core_enable_driver(USB_DRIVER_HID, false); usb_core_enable_driver(USB_DRIVER_HID, false);
#else #else
usb_core_enable_driver(USB_DRIVER_HID, true); usb_core_enable_driver(USB_DRIVER_HID, usb_hid);
#endif /* USB_ENABLE_CHARGING_ONLY */ #endif /* USB_ENABLE_CHARGING_ONLY */
#endif /* USB_ENABLE_HID */ #endif /* USB_ENABLE_HID */
@ -307,7 +311,7 @@ static void usb_thread(void)
usb_core_enable_driver(USB_DRIVER_MASS_STORAGE, true); usb_core_enable_driver(USB_DRIVER_MASS_STORAGE, true);
#endif #endif
#ifdef USB_ENABLE_HID #ifdef USB_ENABLE_HID
usb_core_enable_driver(USB_DRIVER_HID, true); usb_core_enable_driver(USB_DRIVER_HID, usb_hid);
#endif #endif
#ifdef USB_ENABLE_CHARGING_ONLY #ifdef USB_ENABLE_CHARGING_ONLY
usb_core_enable_driver(USB_DRIVER_CHARGING_ONLY, false); usb_core_enable_driver(USB_DRIVER_CHARGING_ONLY, false);
@ -691,6 +695,14 @@ bool usb_powered(void)
} }
#endif #endif
#ifdef USB_ENABLE_HID
void usb_set_hid(bool enable)
{
usb_hid = enable;
usb_core_enable_driver(USB_DRIVER_HID, usb_hid);
}
#endif
#else #else
#ifdef USB_NONE #ifdef USB_NONE

View file

@ -95,6 +95,11 @@
\opt{accessory_supply}{ \opt{accessory_supply}{
accessory power supply & on, off & N/A\\ accessory power supply & on, off & N/A\\
} }
\opt{usb_hid}{
usb hid & on, off & N/A\\
usb keypad mode
& multimedia, presentation, browser\opt{usb_hid_mouse}{, mouse}& N/A\\
}
idle poweroff & off, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 30, 45, 60 idle poweroff & off, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 30, 45, 60
& minutes\\ & minutes\\
max files in playlist & 1000 - 32000 & N/A\\ max files in playlist & 1000 - 32000 & N/A\\

View file

@ -183,6 +183,14 @@ this option \setting{On}. If it is not required, then turning this setting
} }
} }
\opt{usb_hid}{ \opt{usb_hid}{
\subsection{USB HID}
\label{ref:USB_HID}
This option turns the USB HID feature \setting{On} and \setting{Off}.
When this feature is enabled, the \dap{} enumerates as a Human Interface
Device (HID), composed of several HID sub devices.
Since the \dap{} also enumerates as a Mass Storage Device, it becomes a USB
Composite Device, which contains both these devices.
\subsection{USB Keypad Mode} \subsection{USB Keypad Mode}
This setting control the keypad mode when the \dap{} is attached to a This setting control the keypad mode when the \dap{} is attached to a
computer through USB. Pressing a key on the \dap{} sends a keystroke the computer through USB. Pressing a key on the \dap{} sends a keystroke the

View file

@ -580,6 +580,11 @@ To turn on and off your Rockbox enabled \dap{} use the following keys:
} }
\subsection{Putting music on your \dap{}} \subsection{Putting music on your \dap{}}
\note{Due to a bug in some OS X versions, the \dap{} can not be mounted, unless
the USB HID feature is disabled. See \reference{ref:USB_HID} for more
information.\newline
}
With the \dap{} connected to the computer as an MSC/UMS device (like a With the \dap{} connected to the computer as an MSC/UMS device (like a
USB Drive), music files can be put on the player via any standard file USB Drive), music files can be put on the player via any standard file
transfer method that you would use to copy files between drives (e.g. Drag 'n' Drop). transfer method that you would use to copy files between drives (e.g. Drag 'n' Drop).