Index: apps/screens.c =================================================================== --- apps/screens.c (revision 21005) +++ apps/screens.c (working copy) @@ -34,6 +34,12 @@ #include "audio.h" #include "mp3_playback.h" #include "usb.h" +#if defined(HAVE_USBSTACK) +#include "usb_core.h" +#ifdef USB_HID +#include "usbstack/usb_hid.h" +#endif +#endif #include "settings.h" #include "status.h" #include "playlist.h" @@ -90,23 +96,70 @@ #endif #ifndef SIMULATOR -static int handle_usb_events(struct event_queue *q) +static int handle_usb_events(void) { - struct queue_event ev; int next_update=0; +#ifdef HAVE_TOUCHSCREEN + enum touchscreen_mode old_mode = touchscreen_get_mode(); + /* TODO: Paint buttons on screens OR switch to point mode and use + * touchscreen as a touchpad to move the host's mouse cursor */ + touchscreen_set_mode(TOUCHSCREEN_BUTTON); +#endif + /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */ while(1) { - queue_wait_w_tmo(q, &ev, HZ/4); - switch(ev.id) + int button; +#if defined(HAVE_USBSTACK) && defined(USB_HID) + bool hid_enabled = usb_core_driver_enabled(USB_DRIVER_HID); + + if (hid_enabled) { + consumer_usage_page_t cmd = UNASSIGNED; + button = get_action(CONTEXT_USB_HID, HZ/4); + + switch (button) + { + case ACTION_USB_HID_PLAY: + cmd = PLAY_PAUSE; + break; + case ACTION_USB_HID_STOP: + cmd = STOP; + break; + case ACTION_USB_HID_SKIPPREV: + cmd = SCAN_PREVIOUS_TRACK; + break; + case ACTION_USB_HID_SKIPNEXT: + cmd = SCAN_NEXT_TRACK; + break; + case ACTION_USB_HID_VOLDOWN: + cmd = VOLUME_DECREMENT; + break; + case ACTION_USB_HID_VOLUP: + cmd = VOLUME_INCREMENT; + break; + case ACTION_USB_HID_MUTE: + cmd = MUTE; + break; + } + + if (cmd != UNASSIGNED) + usb_hid_send_consumer_usage(cmd); + } + else +#endif + button = button_get_w_tmo(HZ/4); + + switch(button) + { case SYS_USB_DISCONNECTED: usb_acknowledge(SYS_USB_DISCONNECTED_ACK); - return 0; + goto Exit; case SYS_TIMEOUT: break; } + if(TIME_AFTER(current_tick,next_update)) { if(usb_inserted()) { @@ -118,6 +171,11 @@ next_update=current_tick+HZ/2; } } +Exit: +#ifdef HAVE_TOUCHSCREEN + touchscreen_set_mode(old_mode); +#endif + return 0; } #endif @@ -172,7 +230,7 @@ while (button_get(true) & BUTTON_REL); #else usb_acknowledge(SYS_USB_CONNECTED_ACK); - while(handle_usb_events(&button_queue)); + while (handle_usb_events()); #endif /* SIMULATOR */ #ifdef HAVE_LCD_CHARCELLS status_set_usb(false); Index: apps/action.h =================================================================== --- apps/action.h (revision 21005) +++ apps/action.h (working copy) @@ -74,6 +74,7 @@ CONTEXT_RECSCREEN, CONTEXT_KEYBOARD, CONTEXT_FM, + CONTEXT_USB_HID, }; @@ -237,6 +238,15 @@ ACTION_TOUCH_REPMODE, #endif + /* USB HID codes */ + ACTION_USB_HID_PLAY, + ACTION_USB_HID_STOP, + ACTION_USB_HID_SKIPPREV, + ACTION_USB_HID_SKIPNEXT, + ACTION_USB_HID_VOLDOWN, + ACTION_USB_HID_VOLUP, + ACTION_USB_HID_MUTE, + ACTION_USB_HID_MENU, LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */ }; Index: apps/keymaps/keymap-creativezv.c =================================================================== --- apps/keymaps/keymap-creativezv.c (revision 21005) +++ apps/keymaps/keymap-creativezv.c (working copy) @@ -216,6 +216,23 @@ LAST_ITEM_IN_LIST }; /* button_context_keyboard */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* get_context_mapping(int context) { switch (context&~CONTEXT_REMOTE) @@ -251,6 +268,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: apps/keymaps/keymap-creativezvm.c =================================================================== --- apps/keymaps/keymap-creativezvm.c (revision 21005) +++ apps/keymaps/keymap-creativezvm.c (working copy) @@ -215,6 +215,23 @@ LAST_ITEM_IN_LIST }; /* button_context_keyboard */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* get_context_mapping(int context) { switch (context&~CONTEXT_REMOTE) @@ -250,6 +267,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: apps/keymaps/keymap-ondavx747.c =================================================================== --- apps/keymaps/keymap-ondavx747.c (revision 21005) +++ apps/keymaps/keymap-ondavx747.c (working copy) @@ -152,6 +152,19 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_keyboard */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* target_get_context_mapping(int context) { switch (context) @@ -196,6 +209,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: apps/keymaps/keymap-c100.c =================================================================== --- apps/keymaps/keymap-c100.c (revision 21005) +++ apps/keymaps/keymap-c100.c (working copy) @@ -269,6 +269,19 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), }; /* button_context_bmark */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_VOLUP, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_VOLDOWN, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + /* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ const struct button_mapping* get_context_mapping(int context) { @@ -317,7 +330,10 @@ #endif case CONTEXT_KEYBOARD: return button_context_keyboard; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-gigabeat-s.c =================================================================== --- apps/keymaps/keymap-gigabeat-s.c (revision 21005) +++ apps/keymaps/keymap-gigabeat-s.c (working copy) @@ -464,6 +464,42 @@ LAST_ITEM_IN_LIST }; /* remote_button_context_right_is_inc */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ + +static const struct button_mapping remote_button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_RC_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_RC_DSP, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_usb_hid */ +#endif + static const struct button_mapping* get_context_mapping_remote( int context ) { context &= ~CONTEXT_REMOTE; @@ -506,6 +542,10 @@ case CONTEXT_FM: return remote_button_context_radio; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return remote_button_context_usb_hid; +#endif default: return remote_button_context_standard; } @@ -573,6 +613,10 @@ case CONTEXT_FM: return button_context_radio; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-ondavx767.c =================================================================== --- apps/keymaps/keymap-ondavx767.c (revision 21005) +++ apps/keymaps/keymap-ondavx767.c (working copy) @@ -47,7 +47,12 @@ LAST_ITEM_IN_LIST }; /* button_context_wps */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif /* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ const struct button_mapping* get_context_mapping(int context) @@ -58,7 +63,10 @@ return button_context_standard; case CONTEXT_WPS: return button_context_wps; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif case CONTEXT_TREE: case CONTEXT_LIST: case CONTEXT_MAINMENU: Index: apps/keymaps/keymap-c200.c =================================================================== --- apps/keymaps/keymap-c200.c (revision 21005) +++ apps/keymaps/keymap-c200.c (working copy) @@ -281,6 +281,23 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), }; /* button_context_bmark */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + /* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ const struct button_mapping* get_context_mapping(int context) { @@ -330,7 +347,10 @@ #endif case CONTEXT_KEYBOARD: return button_context_keyboard; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 21005) +++ apps/keymaps/keymap-e200.c (working copy) @@ -271,6 +271,23 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), }; /* button_context_bmark */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + /* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ const struct button_mapping* get_context_mapping(int context) { @@ -318,7 +335,10 @@ return button_context_recscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-sa9200.c =================================================================== --- apps/keymaps/keymap-sa9200.c (revision 21005) +++ apps/keymaps/keymap-sa9200.c (working copy) @@ -269,6 +269,27 @@ LAST_ITEM_IN_LIST }; /* button_context_keyboard */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_REW, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_FFWD, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* get_context_mapping(int context) { switch (context) @@ -312,6 +333,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: apps/keymaps/keymap-touchscreen.c =================================================================== --- apps/keymaps/keymap-touchscreen.c (revision 21005) +++ apps/keymaps/keymap-touchscreen.c (working copy) @@ -245,6 +245,18 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_FM) }; /* button_context_radio */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_TOPRIGHT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_MIDLEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_MIDRIGHT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_CENTER, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_TOPLEFT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* get_context_mapping(int context) { if (context & CONTEXT_CUSTOM2 @@ -297,6 +309,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return target_get_context_mapping(CONTEXT_USB_HID); +#endif } return button_context_standard; } Index: apps/keymaps/keymap-clip.c =================================================================== --- apps/keymaps/keymap-clip.c (revision 21005) +++ apps/keymaps/keymap-clip.c (working copy) @@ -265,6 +265,23 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), }; /* button_context_bmark */ +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + /* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ const struct button_mapping* get_context_mapping(int context) { @@ -310,7 +327,10 @@ return button_context_recscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-h10.c =================================================================== --- apps/keymaps/keymap-h10.c (revision 21005) +++ apps/keymaps/keymap-h10.c (working copy) @@ -332,6 +332,61 @@ }; + + + + + +static const struct button_mapping remote_button_context_wps[] = { + { ACTION_WPS_PLAY, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT,BUTTON_RC_PLAY }, + { ACTION_WPS_SKIPPREV, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW}, + { ACTION_WPS_SEEKBACK, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW|BUTTON_REPEAT }, + { ACTION_WPS_SKIPNEXT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF }, + { ACTION_WPS_SEEKFWD, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF|BUTTON_REPEAT }, + + { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_WPS_PITCHSCREEN, BUTTON_RC_PLAY|BUTTON_LEFT, BUTTON_RC_PLAY }, + { ACTION_WPS_ID3SCREEN, BUTTON_RC_PLAY|BUTTON_RIGHT, BUTTON_RC_PLAY }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_wps */ + +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_REW, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_FF, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ + +static const struct button_mapping remote_button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_SCROLL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_SCROLL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_usb_hid */ +#endif + static const struct button_mapping* get_context_mapping_remote( int context ) { context ^= CONTEXT_REMOTE; @@ -361,6 +416,10 @@ return remote_button_context_pitchscreen; case CONTEXT_RECSCREEN: return button_context_recscreen; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return remote_button_context_usb_hid; +#endif default: return remote_button_context_standard; @@ -415,6 +474,10 @@ return button_context_recscreen; case CONTEXT_FM: return button_context_radio; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 21005) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -187,6 +187,23 @@ }; /* button_context_recscreen */ #endif +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + #if BUTTON_REMOTE != 0 /***************************************************************************** * Remote control mappings @@ -219,7 +236,21 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; +#ifdef HAVE_USBSTACK +static const struct button_mapping remote_button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* remote_button_context_usb_hid */ +#endif + static const struct button_mapping* get_context_mapping_remote( int context ) { context ^= CONTEXT_REMOTE; @@ -228,7 +259,10 @@ { case CONTEXT_WPS: return remote_button_context_wps; - +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return remote_button_context_usb_hid; +#endif default: return remote_button_context_standard; } @@ -281,6 +315,10 @@ case CONTEXT_RECSCREEN: return button_context_recscreen; #endif +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif default: return button_context_standard; } Index: apps/keymaps/keymap-mr100.c =================================================================== --- apps/keymaps/keymap-mr100.c (revision 21005) +++ apps/keymaps/keymap-mr100.c (working copy) @@ -313,6 +313,37 @@ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ + +static const struct button_mapping remote_button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_RC_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_RC_FAV, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_usb_hid */ +#endif + static const struct button_mapping* get_context_mapping_remote( int context ) { context ^= CONTEXT_REMOTE; @@ -324,6 +355,10 @@ case CONTEXT_MAINMENU: case CONTEXT_TREE: return remote_button_context_tree; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return remote_button_context_usb_hid; +#endif } return remote_button_context_standard; } @@ -374,6 +409,10 @@ return button_context_pitchscreen; case CONTEXT_KEYBOARD: return button_context_keyboard; +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: apps/keymaps/keymap-hdd1630.c =================================================================== --- apps/keymaps/keymap-hdd1630.c (revision 21005) +++ apps/keymaps/keymap-hdd1630.c (working copy) @@ -282,6 +282,27 @@ }; #endif +#ifdef HAVE_USBSTACK +static const struct button_mapping button_context_usb_hid[] = { + { ACTION_USB_HID_PLAY, BUTTON_VIEW, BUTTON_NONE }, + { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_usb_hid */ +#endif + const struct button_mapping* get_context_mapping(int context) { switch (context) @@ -329,6 +350,10 @@ case CONTEXT_FM: return button_context_radio; #endif +#ifdef HAVE_USBSTACK + case CONTEXT_USB_HID: + return button_context_usb_hid; +#endif } return button_context_standard; } Index: firmware/export/usb_core.h =================================================================== --- firmware/export/usb_core.h (revision 21005) +++ firmware/export/usb_core.h (working copy) @@ -26,7 +26,7 @@ //#define USB_SERIAL #define USB_STORAGE #define USB_CHARGING_ONLY -//#define USB_HID +#define USB_HID #else /* BOOTLOADER */ #define USB_CHARGING_ONLY #endif /* BOOTLOADER */