Index: apps/screens.c =================================================================== --- apps/screens.c (revision 22801) +++ apps/screens.c (working copy) @@ -37,7 +37,7 @@ #if defined(HAVE_USBSTACK) #include "usb_core.h" #ifdef USB_ENABLE_HID -#include "usbstack/usb_hid.h" +#include "usb_keymaps.h" #endif #endif #include "settings.h" @@ -94,59 +94,29 @@ #endif #ifndef SIMULATOR + +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) +int usb_keypad_mode; +#endif + static int handle_usb_events(void) { #if (CONFIG_STORAGE & STORAGE_MMC) int next_update=0; #endif /* STORAGE_MMC */ -#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) { int button; #if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) - bool hid_enabled = usb_core_driver_enabled(USB_DRIVER_HID); - - if (hid_enabled) + if (usb_core_driver_enabled(USB_DRIVER_HID)) { - int id = HID_CONSUMER_USAGE_UNASSIGNED; - button = get_action(CONTEXT_USB_HID, HZ/2); + button = get_hid_usb_action(); - switch (button) - { - case ACTION_USB_HID_PLAY: - id = HID_CONSUMER_USAGE_PLAY_PAUSE; - break; - case ACTION_USB_HID_STOP: - id = HID_CONSUMER_USAGE_STOP; - break; - case ACTION_USB_HID_SKIPPREV: - id = HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK; - break; - case ACTION_USB_HID_SKIPNEXT: - id = HID_CONSUMER_USAGE_SCAN_NEXT_TRACK; - break; - case ACTION_USB_HID_VOLDOWN: - id = HID_CONSUMER_USAGE_VOLUME_DECREMENT; - break; - case ACTION_USB_HID_VOLUP: - id = HID_CONSUMER_USAGE_VOLUME_INCREMENT; - break; - case ACTION_USB_HID_MUTE: - id = HID_CONSUMER_USAGE_MUTE; - break; - } - - if (id != HID_CONSUMER_USAGE_UNASSIGNED) - usb_hid_send(HID_USAGE_PAGE_CONSUMER, id); + /* On mode change, we need to refresh the screen */ + if (button == ACTION_USB_HID_MODE) + break; } else #endif @@ -160,7 +130,7 @@ { case SYS_USB_DISCONNECTED: usb_acknowledge(SYS_USB_DISCONNECTED_ACK); - goto Exit; + return 1; case SYS_TIMEOUT: break; } @@ -175,14 +145,12 @@ } #endif /* STORAGE_MMC */ } -Exit: -#ifdef HAVE_TOUCHSCREEN - touchscreen_set_mode(old_mode); -#endif + return 0; } #endif +#define MODE_NAME_LEN 32 void usb_screen(void) { #ifdef USB_NONE @@ -191,55 +159,107 @@ int i; int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */ int old_bars = viewportmanager_get_statusbar(); +#if defined HAVE_TOUCHSCREEN + enum touchscreen_mode old_mode = touchscreen_get_mode(); - FOR_NB_SCREENS(i) + /* 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 + +#ifndef SIMULATOR + usb_acknowledge(SYS_USB_CONNECTED_ACK); +#endif + +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + usb_keypad_mode = global_settings.usb_keypad_mode; +#endif + + while (1) { - screens[i].backdrop_show(BACKDROP_MAIN); - screens[i].backlight_on(); - screens[i].clear_display(); + FOR_NB_SCREENS(i) + { + screens[i].backdrop_show(BACKDROP_MAIN); + screens[i].backlight_on(); + screens[i].clear_display(); #ifdef HAVE_REMOTE_LCD - if (i == SCREEN_REMOTE) - { - screens[i].bitmap(remote_usblogo, - (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo), - (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2, - BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo); - } - else + if (i == SCREEN_REMOTE) + { + screens[i].bitmap(remote_usblogo, + (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo), + (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2, + BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo); + } + else #endif - { + { + char mode_name[MODE_NAME_LEN]; + #ifdef HAVE_LCD_BITMAP - screens[i].transparent_bitmap(usblogo, + screens[i].transparent_bitmap(usblogo, (LCD_WIDTH-BMPWIDTH_usblogo), (LCD_HEIGHT-BMPHEIGHT_usblogo)/2, - BMPWIDTH_usblogo, BMPHEIGHT_usblogo); + BMPWIDTH_usblogo, BMPHEIGHT_usblogo); + +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + int y, w, h; + + screens[i].getstringsize(str(LANG_USB_KEYPAD_MODE), &w, &h); + + y = (LCD_HEIGHT - BMPHEIGHT_usblogo) / 2 + BMPHEIGHT_usblogo + h; + screens[i].putsxy((LCD_WIDTH - w) / 2, y, + str(LANG_USB_KEYPAD_MODE)); + y += 3 * h / 2; + + snprintf(mode_name, MODE_NAME_LEN, "%s", + str(keypad_mode_name_get())); + screens[i].getstringsize(mode_name, &w, &h); + screens[i].putsxy((LCD_WIDTH - w) / 2, y, mode_name); +#endif /* HID */ +#else /* HAVE_LCD_BITMAP */ + screens[i].double_height(false); +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + snprintf(mode_name, MODE_NAME_LEN, "[USB Mode; %s]", + str(keypad_mode_name_get())); + screens[i].puts_scroll(0, 0, mode_name); #else - screens[i].double_height(false); - screens[i].puts_scroll(0, 0, "[USB Mode]"); - status_set_param(false); - status_set_audio(false); - status_set_usb(true); + screens[i].puts_scroll(0, 0, "[USB Mode]"); +#endif + status_set_param(false); + status_set_audio(false); + status_set_usb(true); #endif /* HAVE_LCD_BITMAP */ + } + screens[i].update(); + + /* force statusbar by ignoring the setting */ + usb_bars |= VP_SB_IGNORE_SETTING(i); } - screens[i].update(); - /* force statusbar by ignoring the setting */ - usb_bars |= VP_SB_IGNORE_SETTING(i); - } + viewportmanager_set_statusbar(usb_bars); - viewportmanager_set_statusbar(usb_bars); - #ifdef SIMULATOR - while (1) - { if (button_get_w_tmo(HZ/2)) break; send_event(GUI_EVENT_ACTIONUPDATE, NULL); - } #else - usb_acknowledge(SYS_USB_CONNECTED_ACK); - while (handle_usb_events()); + if (handle_usb_events()) + break; #endif /* SIMULATOR */ + } + +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + if (global_settings.usb_keypad_mode != usb_keypad_mode) + { + global_settings.usb_keypad_mode = usb_keypad_mode; + settings_save(); + } +#endif + +#ifdef HAVE_TOUCHSCREEN + touchscreen_set_mode(old_mode); +#endif + #ifdef HAVE_LCD_CHARCELLS status_set_usb(false); #endif /* HAVE_LCD_CHARCELLS */ @@ -249,7 +269,7 @@ } viewportmanager_set_statusbar(old_bars); send_event(GUI_EVENT_REFRESH, NULL); - + #endif /* USB_NONE */ } Index: apps/action.h =================================================================== --- apps/action.h (revision 22801) +++ apps/action.h (working copy) @@ -241,14 +241,24 @@ #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_FIRST, /* Place holder */ + ACTION_USB_HID_DEC, + ACTION_USB_HID_INC, + ACTION_USB_HID_START, + ACTION_USB_HID_START_LONG, + ACTION_USB_HID_QUIT, + ACTION_USB_HID_QUIT_LONG, + ACTION_USB_HID_LEFT, + ACTION_USB_HID_LEFT_LONG, + ACTION_USB_HID_RIGHT, + ACTION_USB_HID_RIGHT_LONG, + ACTION_USB_HID_SELECT, + ACTION_USB_HID_SELECT_LONG, ACTION_USB_HID_MENU, + ACTION_USB_HID_MENU_LONG, + ACTION_USB_HID_MODE, + ACTION_USB_HID_MODE_LONG, + ACTION_USB_HID_LAST, /* Place holder */ LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */ }; Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 22801) +++ apps/lang/english.lang (working copy) @@ -12654,6 +12654,76 @@ + id: LANG_USB_KEYPAD_MODE + desc: in settings_menu + user: core + + *: "USB Keypad Mode:" + + + *: "USB Keypad Mode:" + + + *: "USB Keypad Mode" + + + + id: LANG_MULTIMEDIA + desc: in settings_menu + user: core + + *: "Multimedia" + + + *: "Multimedia" + + + *: "Multimedia" + + + + id: LANG_PRESENTATION + desc: in settings_menu + user: core + + *: "Presentation" + + + *: "Presentation" + + + *: "Presentation" + + + + id: LANG_BROWSER + desc: in settings_menu + user: core + + *: "Browser" + + + *: "Browser" + + + *: "Browser" + + + + id: LANG_MOUSE + desc: in settings_menu + user: core + + *: "Mouse" + + + *: "Mouse" + + + *: "Mouse" + + + id: LANG_SKIN_RAM_USAGE desc: how much RAM the skins are using user: core Index: apps/settings.h =================================================================== --- apps/settings.h (revision 22801) +++ apps/settings.h (working copy) @@ -768,6 +768,10 @@ /* If values are just added to the end, no need to bump plugin API version. */ /* new stuff to be added at the end */ + +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + int usb_keypad_mode; +#endif #ifdef HAVE_LCD_BITMAP unsigned char ui_vp_config[64]; /* viewport string for the lists */ Index: apps/menus/settings_menu.c =================================================================== --- apps/menus/settings_menu.c (revision 22801) +++ apps/menus/settings_menu.c (working copy) @@ -252,6 +252,9 @@ MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL); #endif MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) +MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL); +#endif #ifdef HAVE_BUTTON_LIGHT MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL); @@ -300,6 +303,9 @@ #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING &touchpad_sensitivity, #endif +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + &usb_keypad_mode, +#endif ); /* SYSTEM MENU */ Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (revision 22801) +++ apps/settings_list.c (working copy) @@ -1566,6 +1566,13 @@ #endif #endif +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) + CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0, + "usb keypad mode", "multimedia,presentation,browser,mouse", + NULL, 3, ID2P(LANG_MULTIMEDIA), ID2P(LANG_PRESENTATION), + ID2P(LANG_BROWSER), ID2P(LANG_MOUSE)), +#endif + /* Customizable list */ #ifdef HAVE_LCD_BITMAP VIEWPORT_SETTING(ui_vp_config, "ui viewport"), Index: apps/SOURCES =================================================================== --- apps/SOURCES (revision 22801) +++ apps/SOURCES (working copy) @@ -150,6 +150,9 @@ eq_arm.S #endif #endif +#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) +usb_keymaps.c +#endif metadata.c metadata/mp3.c #if CONFIG_CODEC == SWCODEC Index: apps/keymaps/keymap-ondavx747.c =================================================================== --- apps/keymaps/keymap-ondavx747.c (revision 22801) +++ apps/keymaps/keymap-ondavx747.c (working copy) @@ -169,12 +169,14 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT, BUTTON_POWER|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-c100.c =================================================================== --- apps/keymaps/keymap-c100.c (revision 22801) +++ apps/keymaps/keymap-c100.c (working copy) @@ -234,12 +234,17 @@ #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_MUTE, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOLUP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOLDOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_QUIT, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, + { ACTION_USB_HID_MODE, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-gigabeat-s.c =================================================================== --- apps/keymaps/keymap-gigabeat-s.c (revision 22801) +++ apps/keymaps/keymap-gigabeat-s.c (working copy) @@ -470,35 +470,40 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_START }, + { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_START }, + { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_QUIT }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_QUIT }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, + { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, + { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_USB_HID_MODE_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 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_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 }, + { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, + { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW }, + { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF}, + { ACTION_USB_HID_SELECT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF }, + { ACTION_USB_HID_MENU, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_RC_DSP }, + { ACTION_USB_HID_MODE, BUTTON_RC_DSP|BUTTON_REL, BUTTON_RC_DSP }, LAST_ITEM_IN_LIST }; /* remote_button_context_usb_hid */ Index: apps/keymaps/keymap-c200.c =================================================================== --- apps/keymaps/keymap-c200.c (revision 22801) +++ apps/keymaps/keymap-c200.c (working copy) @@ -266,16 +266,20 @@ #ifdef HAVE_USBSTACK static const struct button_mapping button_context_usb_hid[] = { - { ACTION_USB_HID_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_USB_HID_STOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, - { 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 }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_USB_HID_QUIT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_DOWN|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, + { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-e200.c =================================================================== --- apps/keymaps/keymap-e200.c (revision 22801) +++ apps/keymaps/keymap-e200.c (working copy) @@ -277,16 +277,24 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REL, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REL, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, + { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, + { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, + { ACTION_USB_HID_MODE, BUTTON_REC|BUTTON_REL, BUTTON_REC }, + { ACTION_USB_HID_MODE_LONG, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-sa9200.c =================================================================== --- apps/keymaps/keymap-sa9200.c (revision 22801) +++ apps/keymaps/keymap-sa9200.c (working copy) @@ -278,26 +278,29 @@ #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_PREV, BUTTON_NONE }, - { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_PREV|BUTTON_REL, BUTTON_PREV }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_PREV|BUTTON_REPEAT, BUTTON_PREV }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_NEXT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, - { 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_NEXT, BUTTON_NONE }, - { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, - LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ #endif Index: apps/keymaps/keymap-touchscreen.c =================================================================== --- apps/keymaps/keymap-touchscreen.c (revision 22801) +++ apps/keymaps/keymap-touchscreen.c (working copy) @@ -253,11 +253,24 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT }, + { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REPEAT, BUTTON_BOTTOMRIGHT }, + { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REL, BUTTON_BOTTOMMIDDLE }, + { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REPEAT, BUTTON_BOTTOMMIDDLE }, + { ACTION_USB_HID_START, BUTTON_TOPMIDDLE|BUTTON_REL, BUTTON_TOPMIDDLE }, + { ACTION_USB_HID_START_LONG, BUTTON_TOPMIDDLE|BUTTON_REPEAT, BUTTON_TOPMIDDLE }, + { ACTION_USB_HID_QUIT, BUTTON_BOTTOMLEFT|BUTTON_REL, BUTTON_BOTTOMLEFT }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_BOTTOMLEFT|BUTTON_REPEAT, BUTTON_BOTTOMLEFT }, + { ACTION_USB_HID_LEFT, BUTTON_MIDLEFT|BUTTON_REL, BUTTON_MIDLEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_MIDLEFT|BUTTON_REPEAT, BUTTON_MIDLEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_MIDRIGHT|BUTTON_REL, BUTTON_MIDRIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_MIDRIGHT|BUTTON_REPEAT, BUTTON_MIDRIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_CENTER|BUTTON_REL, BUTTON_CENTER }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_CENTER|BUTTON_REPEAT, BUTTON_CENTER }, + { ACTION_USB_HID_MENU, BUTTON_TOPRIGHT|BUTTON_REL, BUTTON_TOPRIGHT }, + { ACTION_USB_HID_MENU_LONG, BUTTON_TOPRIGHT|BUTTON_REPEAT, BUTTON_TOPRIGHT }, + { ACTION_USB_HID_MODE, BUTTON_TOPLEFT|BUTTON_REL, BUTTON_TOPLEFT }, + { ACTION_USB_HID_MODE_LONG, BUTTON_TOPLEFT|BUTTON_REPEAT, BUTTON_TOPLEFT }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_USB_HID) }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-clip.c =================================================================== --- apps/keymaps/keymap-clip.c (revision 22801) +++ apps/keymaps/keymap-clip.c (working copy) @@ -275,16 +275,24 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_USB_HID_START, BUTTON_UP|BOTTOM_REPEAT, BUTTON_UP }, + { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, + { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, + { ACTION_USB_HID_MODE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME }, + { ACTION_USB_HID_MODE_LONG, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: apps/keymaps/keymap-h10.c =================================================================== --- apps/keymaps/keymap-h10.c (revision 22801) +++ apps/keymaps/keymap-h10.c (working copy) @@ -339,28 +339,33 @@ #ifdef HAVE_USBSTACK static const struct button_mapping button_context_usb_hid[] = { - { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, - { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, - { 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 }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_USB_HID_LEFT, BUTTON_REW|BUTTON_REL, BUTTON_REW }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_REW|BUTTON_REPEAT, BUTTON_REW }, + { ACTION_USB_HID_RIGHT, BUTTON_FF|BUTTON_REL, BUTTON_FF }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_FF|BUTTON_REPEAT, BUTTON_FF }, + { ACTION_USB_HID_MENU, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, + { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 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_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_INC, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, + { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW }, + { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF }, LAST_ITEM_IN_LIST }; /* remote_button_context_usb_hid */ Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 22801) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -195,16 +195,20 @@ #ifdef HAVE_USBSTACK static const struct button_mapping button_context_usb_hid[] = { - { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, - { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, - { 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 }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ @@ -244,14 +248,16 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, + { ACTION_USB_HID_LEFT, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_RC_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_RC_RIGHT }, LAST_ITEM_IN_LIST }; /* remote_button_context_usb_hid */ Index: apps/keymaps/keymap-hdd1630.c =================================================================== --- apps/keymaps/keymap-hdd1630.c (revision 22801) +++ apps/keymaps/keymap-hdd1630.c (working copy) @@ -286,20 +286,24 @@ #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 }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP }, + { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, + { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, + { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, + { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, + { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_USB_HID_MODE, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW }, + { ACTION_USB_HID_MODE_LONG, BUTTON_VIEW|BUTTON_REPEAT, BUTTON_VIEW }, LAST_ITEM_IN_LIST }; /* button_context_usb_hid */ Index: firmware/usbstack/usb_hid_usage_tables.h =================================================================== --- firmware/usbstack/usb_hid_usage_tables.h (revision 22801) +++ firmware/usbstack/usb_hid_usage_tables.h (working copy) @@ -701,5 +701,20 @@ #define HID_CONSUMER_USAGE_AC_DISRIBUTE_HORIZONTALLY 0x29B #define HID_CONSUMER_USAGE_AC_DISTRIBUTE_VERTICALLY 0x29C +/* Mouse defines (custom made - Rockbox specific) */ +#define HID_MOUSE_UP 0x01 +#define HID_MOUSE_UP_FAST 0x02 +#define HID_MOUSE_DOWN 0x03 +#define HID_MOUSE_DOWN_FAST 0x04 +#define HID_MOUSE_LEFT 0x05 +#define HID_MOUSE_LEFT_FAST 0x06 +#define HID_MOUSE_RIGHT 0x07 +#define HID_MOUSE_RIGHT_FAST 0x08 +#define HID_MOUSE_SCROLL_UP 0x09 +#define HID_MOUSE_SCROLL_DOWN 0x10 +#define HID_MOUSE_CLICK_LEFT 0x11 +#define HID_MOUSE_CLICK_RIGHT 0x12 +#define HID_MOUSE_CLICK_MIDDLE 0x13 + #endif Index: firmware/usbstack/usb_hid.c =================================================================== --- firmware/usbstack/usb_hid.c (revision 22801) +++ firmware/usbstack/usb_hid.c (working copy) @@ -28,11 +28,6 @@ //#define LOGF_ENABLE #include "logf.h" -#define CONCAT(low, high) ((high << 8) | low) -#define PACK_VAL1(dest, val) *(dest)++ = (val) & 0xff -#define PACK_VAL2(dest, val) PACK_VAL1((dest), (val)); \ - PACK_VAL1((dest), (val >> 8)) - /* Documents avaiable here: http://www.usb.org/developers/devclass_docs/ */ #define HID_VER 0x0110 /* 1.1 */ @@ -47,6 +42,7 @@ #define INPUT 0x80 #define OUTPUT 0x90 #define COLLECTION 0xA0 +#define COLLECTION_PHYSICAL 0x00 #define COLLECTION_APPLICATION 0x01 #define END_COLLECTION 0xC0 /* Parts (HID1_11.pdf, page 40) */ @@ -90,24 +86,28 @@ #define HID_BUF_SIZE_MSG 16 #define HID_BUF_SIZE_CMD 16 -#define HID_BUF_SIZE_REPORT 96 +#define HID_BUF_SIZE_REPORT 160 #define HID_NUM_BUFFERS 5 #define SET_REPORT_BUF_LEN 2 +//#ifdef LOGF_ENABLE #ifdef LOGF_ENABLE + #define BUF_DUMP_BUF_LEN HID_BUF_SIZE_REPORT #define BUF_DUMP_PREFIX_SIZE 5 -#define BUF_DUMP_LINE_SIZE (MAX_LOGF_ENTRY - BUF_DUMP_PREFIX_SIZE) -#define BUF_DUMP_ITEMS_IN_LINE (BUF_DUMP_LINE_SIZE / 3) -#define BUF_DUMP_NUM_LINES (BUF_DUMP_BUF_LEN / (BUF_DUMP_LINE_SIZE / 3)) +#define BUF_DUMP_ITEMS_IN_LINE 8 +#define BUF_DUMP_LINE_SIZE (BUF_DUMP_ITEMS_IN_LINE * 3) +#define BUF_DUMP_NUM_LINES (BUF_DUMP_BUF_LEN / BUF_DUMP_ITEMS_IN_LINE) #endif #define HID_BUF_INC(i) do { (i) = ((i) + 1) % HID_NUM_BUFFERS; } while (0) +#define PACK_VAL(dest, val) *(dest)++ = (val) & 0xff typedef enum { REPORT_ID_KEYBOARD = 1, REPORT_ID_CONSUMER, + REPORT_ID_MOUSE, REPORT_ID_COUNT, } report_id_t; @@ -164,6 +164,7 @@ /* Write the id into the buffer in the appropriate location, and returns the * buffer length */ uint8_t (*buf_set)(unsigned char *buf, int id); + bool (*is_key_released)(int id); } usb_hid_report_t; usb_hid_report_t usb_hid_reports[REPORT_ID_COUNT]; @@ -183,7 +184,7 @@ static void usb_hid_try_send_drv(void); -static void pack_parameter(unsigned char **dest, bool is_signed, +static void pack_parameter(unsigned char **dest, bool is_signed, bool mark_size, uint8_t parameter, uint32_t value) { uint8_t size_value = 1; /* # of bytes */ @@ -216,7 +217,7 @@ size_value++; } - **dest = parameter | size_value; + **dest = parameter | (mark_size ? size_value : 0); (*dest)++; while (size_value--) @@ -244,8 +245,7 @@ } #ifdef LOGF_ENABLE -static unsigned char - buf_dump_ar[BUF_DUMP_NUM_LINES][BUF_DUMP_LINE_SIZE + 1] +static unsigned char buf_dump_ar[BUF_DUMP_NUM_LINES][BUF_DUMP_LINE_SIZE + 1] USB_DEVBSS_ATTR __attribute__((aligned(32))); void buf_dump(unsigned char *buf, size_t size) @@ -277,26 +277,113 @@ #define buf_dump(...) #endif +#define BUF_LEN_KEYBOARD 7 static uint8_t buf_set_keyboard(unsigned char *buf, int id) { - memset(buf, 0, 7); + memset(buf, 0, BUF_LEN_KEYBOARD); + int key, i = 1; - if (HID_KEYBOARD_LEFT_CONTROL <= id && id <= HID_KEYBOARD_RIGHT_GUI) - buf[0] = (1 << (id - HID_KEYBOARD_LEFT_CONTROL)); - else - buf[1] = (uint8_t)id; + /* Each key is a word in id (up to 4 keys supported) */ + while ((key = id & 0xff)) + { + /* Each modifier key is a bit in the first byte */ + if (HID_KEYBOARD_LEFT_CONTROL <= key && key <= HID_KEYBOARD_RIGHT_GUI) + buf[0] |= (1 << (key - HID_KEYBOARD_LEFT_CONTROL)); + else /* Any other key should be set in a separate byte */ + buf[i++] = (uint8_t)key; - return 7; + id >>= 8; + } + + return BUF_LEN_KEYBOARD; } +#define BUF_LEN_CONSUMER 4 static uint8_t buf_set_consumer(unsigned char *buf, int id) { - memset(buf, 0, 4); + memset(buf, 0, BUF_LEN_CONSUMER); buf[0] = (uint8_t)id; - return 4; + return BUF_LEN_CONSUMER; } +#define MOUSE_WHEEL_STEP 1 +#define MOUSE_STEP 10 +#define MOUSE_STEP_FAST 50 +#define MOUSE_BUTTON_LEFT 0x1 +#define MOUSE_BUTTON_RIGHT 0x2 +#define MOUSE_BUTTON_MIDDLE 0x4 +#define MOUSE_BUTTON 0 +#define MOUSE_X 1 +#define MOUSE_Y 2 +#define MOUSE_WHEEL 3 +#define BUF_LEN_MOUSE 4 +#define MOUSE_DO(item, step) (buf[(item)] = ((uint8_t)(step))) +static uint8_t buf_set_mouse(unsigned char *buf, int id) +{ + memset(buf, 0, BUF_LEN_MOUSE); + + switch (id) + { + case HID_MOUSE_UP: + MOUSE_DO(MOUSE_Y, -MOUSE_STEP); + break; + case HID_MOUSE_UP_FAST: + MOUSE_DO(MOUSE_Y, -MOUSE_STEP_FAST); + break; + case HID_MOUSE_DOWN: + MOUSE_DO(MOUSE_Y, MOUSE_STEP); + break; + case HID_MOUSE_DOWN_FAST: + MOUSE_DO(MOUSE_Y, MOUSE_STEP_FAST); + break; + case HID_MOUSE_LEFT: + MOUSE_DO(MOUSE_X, -MOUSE_STEP); + break; + case HID_MOUSE_LEFT_FAST: + MOUSE_DO(MOUSE_X, -MOUSE_STEP_FAST); + break; + case HID_MOUSE_RIGHT: + MOUSE_DO(MOUSE_X, MOUSE_STEP); + break; + case HID_MOUSE_RIGHT_FAST: + MOUSE_DO(MOUSE_X, MOUSE_STEP_FAST); + break; + case HID_MOUSE_CLICK_LEFT: + MOUSE_DO(MOUSE_BUTTON, MOUSE_BUTTON_LEFT); + break; + case HID_MOUSE_CLICK_RIGHT: + MOUSE_DO(MOUSE_BUTTON, MOUSE_BUTTON_RIGHT); + break; + case HID_MOUSE_CLICK_MIDDLE: + MOUSE_DO(MOUSE_BUTTON, MOUSE_BUTTON_MIDDLE); + break; + case HID_MOUSE_SCROLL_UP: + MOUSE_DO(MOUSE_WHEEL, MOUSE_WHEEL_STEP); + break; + case HID_MOUSE_SCROLL_DOWN: + MOUSE_DO(MOUSE_WHEEL, -MOUSE_WHEEL_STEP); + break; + default: + break; + } + + return BUF_LEN_MOUSE; +} + +static bool mouse_is_key_released(int id) +{ + switch (id) + { + case HID_MOUSE_CLICK_LEFT: + case HID_MOUSE_CLICK_RIGHT: + case HID_MOUSE_CLICK_MIDDLE: + return 1; + default: + return 0; + } +} + static size_t descriptor_report_get(unsigned char *dest) { unsigned char *report = dest; @@ -306,60 +393,96 @@ usb_hid_report = &usb_hid_reports[REPORT_ID_KEYBOARD]; usb_hid_report->usage_page = HID_USAGE_PAGE_KEYBOARD_KEYPAD; usb_hid_report->buf_set = buf_set_keyboard; + usb_hid_report->is_key_released = NULL; - pack_parameter(&report, 0, USAGE_PAGE, + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS); - PACK_VAL2(report, CONCAT(CONSUMER_USAGE, HID_GENERIC_DESKTOP_KEYBOARD)); - pack_parameter(&report, 0, COLLECTION, COLLECTION_APPLICATION); - pack_parameter(&report, 0, REPORT_ID, REPORT_ID_KEYBOARD); - pack_parameter(&report, 0, USAGE_PAGE, HID_GENERIC_DESKTOP_KEYPAD); - pack_parameter(&report, 0, USAGE_MINIMUM, HID_KEYBOARD_LEFT_CONTROL); - pack_parameter(&report, 0, USAGE_MAXIMUM, HID_KEYBOARD_RIGHT_GUI); - pack_parameter(&report, 1, LOGICAL_MINIMUM, 0); - pack_parameter(&report, 1, LOGICAL_MAXIMUM, 1); - pack_parameter(&report, 0, REPORT_SIZE, 1); - pack_parameter(&report, 0, REPORT_COUNT, 8); - pack_parameter(&report, 0, INPUT, MAIN_ITEM_VARIABLE); - pack_parameter(&report, 0, REPORT_SIZE, 1); - pack_parameter(&report, 0, REPORT_COUNT, 5); - pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_LEDS); - pack_parameter(&report, 0, USAGE_MINIMUM, HID_LED_NUM_LOCK); - pack_parameter(&report, 0, USAGE_MAXIMUM, HID_LED_KANA); - pack_parameter(&report, 0, OUTPUT, MAIN_ITEM_VARIABLE); - pack_parameter(&report, 0, REPORT_SIZE, 3); - pack_parameter(&report, 0, REPORT_COUNT, 1); - pack_parameter(&report, 0, OUTPUT, MAIN_ITEM_CONSTANT); - pack_parameter(&report, 0, REPORT_SIZE, 8); - pack_parameter(&report, 0, REPORT_COUNT, 6); - pack_parameter(&report, 1, LOGICAL_MINIMUM, 0); - pack_parameter(&report, 1, LOGICAL_MAXIMUM, HID_KEYBOARD_EX_SEL); - pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_KEYBOARD_KEYPAD); - pack_parameter(&report, 0, USAGE_MINIMUM, 0); - pack_parameter(&report, 0, USAGE_MAXIMUM, HID_KEYBOARD_EX_SEL); - pack_parameter(&report, 0, INPUT, 0); - PACK_VAL1(report, END_COLLECTION); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_KEYBOARD); + pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION); + pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_KEYBOARD); + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_GENERIC_DESKTOP_KEYPAD); + pack_parameter(&report, 0, 1, USAGE_MINIMUM, HID_KEYBOARD_LEFT_CONTROL); + pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_KEYBOARD_RIGHT_GUI); + pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0); + pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 1); + pack_parameter(&report, 0, 1, REPORT_SIZE, 1); + pack_parameter(&report, 0, 1, REPORT_COUNT, 8); + pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE); + pack_parameter(&report, 0, 1, REPORT_SIZE, 1); + pack_parameter(&report, 0, 1, REPORT_COUNT, 5); + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_LEDS); + pack_parameter(&report, 0, 1, USAGE_MINIMUM, HID_LED_NUM_LOCK); + pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_LED_KANA); + pack_parameter(&report, 0, 1, OUTPUT, MAIN_ITEM_VARIABLE); + pack_parameter(&report, 0, 1, REPORT_SIZE, 3); + pack_parameter(&report, 0, 1, REPORT_COUNT, 1); + pack_parameter(&report, 0, 1, OUTPUT, MAIN_ITEM_CONSTANT); + pack_parameter(&report, 0, 1, REPORT_SIZE, 8); + pack_parameter(&report, 0, 1, REPORT_COUNT, 6); + pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0); + pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, HID_KEYBOARD_EX_SEL); + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_KEYBOARD_KEYPAD); + pack_parameter(&report, 0, 1, USAGE_MINIMUM, 0); + pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_KEYBOARD_EX_SEL); + pack_parameter(&report, 0, 1, INPUT, 0); + PACK_VAL(report, END_COLLECTION); /* Consumer usage controls - play/pause, stop, etc. */ usb_hid_report = &usb_hid_reports[REPORT_ID_CONSUMER]; usb_hid_report->usage_page = HID_USAGE_PAGE_CONSUMER; usb_hid_report->buf_set = buf_set_consumer; + usb_hid_report->is_key_released = NULL; - pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_CONSUMER); - PACK_VAL2(report, CONCAT(CONSUMER_USAGE, - HID_CONSUMER_USAGE_CONSUMER_CONTROL)); - pack_parameter(&report, 0, COLLECTION, COLLECTION_APPLICATION); - pack_parameter(&report, 0, REPORT_ID, REPORT_ID_CONSUMER); - pack_parameter(&report, 0, REPORT_SIZE, 16); - pack_parameter(&report, 0, REPORT_COUNT, 2); - pack_parameter(&report, 1, LOGICAL_MINIMUM, 1); - pack_parameter(&report, 1, LOGICAL_MAXIMUM, 652); - pack_parameter(&report, 0, USAGE_MINIMUM, + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_CONSUMER); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_CONSUMER_USAGE_CONSUMER_CONTROL); - pack_parameter(&report, 0, USAGE_MAXIMUM, HID_CONSUMER_USAGE_AC_SEND); - pack_parameter(&report, 0, INPUT, MAIN_ITEM_NO_PREFERRED | + pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION); + pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_CONSUMER); + pack_parameter(&report, 0, 1, REPORT_SIZE, 16); + pack_parameter(&report, 0, 1, REPORT_COUNT, 2); + pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 1); + pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 652); + pack_parameter(&report, 0, 1, USAGE_MINIMUM, + HID_CONSUMER_USAGE_CONSUMER_CONTROL); + pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_CONSUMER_USAGE_AC_SEND); + pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_NO_PREFERRED | MAIN_ITEM_NULL_STATE); - PACK_VAL1(report, END_COLLECTION); + PACK_VAL(report, END_COLLECTION); + /* Mouse control */ + usb_hid_report = &usb_hid_reports[REPORT_ID_MOUSE]; + usb_hid_report->usage_page = HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS; + usb_hid_report->buf_set = buf_set_mouse; + usb_hid_report->is_key_released = mouse_is_key_released; + + pack_parameter(&report, 0, 1, USAGE_PAGE, + HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_MOUSE); + pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION); + pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_MOUSE); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_POINTER); + pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_PHYSICAL); + pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_BUTTON); + pack_parameter(&report, 0, 1, USAGE_MINIMUM, 1); + pack_parameter(&report, 0, 1, USAGE_MAXIMUM, 8); + pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0); + pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 1); + pack_parameter(&report, 0, 1, REPORT_SIZE, 1); + pack_parameter(&report, 0, 1, REPORT_COUNT, 8); + pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE); + pack_parameter(&report, 0, 1, USAGE_PAGE, + HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_X); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_Y); + pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_WHEEL); + pack_parameter(&report, 0, 1, LOGICAL_MINIMUM, -127 & 0xFF); + pack_parameter(&report, 0, 1, LOGICAL_MAXIMUM, 127); + pack_parameter(&report, 0, 1, REPORT_SIZE, 8); + pack_parameter(&report, 0, 1, REPORT_COUNT, 3); + pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE | MAIN_ITEM_RELATIVE); + PACK_VAL(report, END_COLLECTION); + PACK_VAL(report, END_COLLECTION); + return (size_t)((uint32_t)report - (uint32_t)dest); } @@ -368,6 +491,9 @@ hid_descriptor.wDescriptorLength0 = (uint16_t)descriptor_report_get(report_descriptor); + logf("hid: desc len %u", hid_descriptor.wDescriptorLength0); + buf_dump(report_descriptor, hid_descriptor.wDescriptorLength0); + PACK_DATA(*dest, hid_descriptor); } @@ -457,8 +583,8 @@ * to the DAP using the host's custom driver */ static int usb_hid_set_report(struct usb_ctrlrequest *req) { - static unsigned char buf[SET_REPORT_BUF_LEN] - USB_DEVBSS_ATTR __attribute__((aligned(32))); + static unsigned char buf[SET_REPORT_BUF_LEN] USB_DEVBSS_ATTR + __attribute__((aligned(32))); int length; int rc = 0; @@ -649,12 +775,15 @@ buf_dump(buf, length); usb_hid_queue(buf, length); - /* Key released */ - memset(buf, 0, length); - buf[0] = report_id; + if (!report->is_key_released || report->is_key_released(id)) + { + /* Key released */ + memset(buf, 0, length); + buf[0] = report_id; - buf_dump(buf, length); - usb_hid_queue(buf, length); + buf_dump(buf, length); + usb_hid_queue(buf, length); + } usb_hid_try_send_drv(); } Index: manual/platform/e200.tex =================================================================== --- manual/platform/e200.tex (revision 22801) +++ manual/platform/e200.tex (working copy) @@ -5,6 +5,7 @@ \edef\UseOption{\UseOption,HAVE_BACKLIGHT} \edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} \edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS} +\edef\UseOption{\UseOption,USB_ENABLE_HID} \edef\UseOption{\UseOption,sansa} \newcommand{\playerman}{Sansa} Index: manual/configure_rockbox/system_options.tex =================================================================== --- manual/configure_rockbox/system_options.tex (revision 22801) +++ manual/configure_rockbox/system_options.tex (working copy) @@ -182,3 +182,30 @@ Changes the brightness of the button lights. } } + +\opt{USB_ENABLE_HID}{ + \subsection{USB keypad Mode} + This setting control the keypad mode when the \dap{} is attached to a + computer through USB. The \dap{} registers itself as a USB keyboard (in + addition to being identified as a mass-storage device). Pressing a button + on the \dap{} sends a keystroke the computer the \dap{} is attached to, + according to the mapping set by the keypad mode. + The \dap{}'s keys can be mapped in different sets (modes) to achieve + different functionality. The following modes are available: + \begin{description} + \item [Multimedia: ]This mode lets you control the volume, playback, and + skips tracks on the host computer. It is equivalent for the multimedia + keys found on top of some multimedia keyboards. + + \item [Presentation: ]This mode lets you control a presentation program + (e.g. OpenOffice Impress, and some other popular application), making the + \dap{} a wired remote control device. This mode is can be useful for + lecturers who does not have a wireless remote control for this purpose. + + \item [Browser: ]This mode lets you control a web browser (e.g. Firefox). + It uses the \dap{}'s keys to navigate through the web page and + different tabs, navigate through history, and to control zoom. + + \item [Mouse: ]This mode emulates a mouse. + \end{description} +}