summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomer Shalev <shalev.tomer@gmail.com>2009-09-30 10:06:04 +0000
committerTomer Shalev <shalev.tomer@gmail.com>2009-09-30 10:06:04 +0000
commit8c5141b32ea74a3093073d9bb11205acb7640233 (patch)
tree486f8e4f94053a389d840b04724567a524b9b4ea
parentd7f4f9ff750872a9eb570409966e500099d84d7d (diff)
downloadrockbox-8c5141b32ea74a3093073d9bb11205acb7640233.tar.gz
rockbox-8c5141b32ea74a3093073d9bb11205acb7640233.zip
Commit "FS#10468 - USB HID: Show keypad mode on screen"
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22852 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/SOURCES3
-rw-r--r--apps/action.h53
-rw-r--r--apps/keymaps/keymap-c100.c61
-rw-r--r--apps/keymaps/keymap-c200.c67
-rw-r--r--apps/keymaps/keymap-clip.c67
-rw-r--r--apps/keymaps/keymap-e200.c67
-rw-r--r--apps/keymaps/keymap-gigabeat-s.c107
-rw-r--r--apps/keymaps/keymap-h10.c47
-rw-r--r--apps/keymaps/keymap-hdd1630.c71
-rw-r--r--apps/keymaps/keymap-ipod.c75
-rw-r--r--apps/keymaps/keymap-mr100.c6
-rw-r--r--apps/keymaps/keymap-ondavx747.c16
-rw-r--r--apps/keymaps/keymap-ondavx777.c4
-rw-r--r--apps/keymaps/keymap-sa9200.c80
-rw-r--r--apps/keymaps/keymap-touchscreen.c27
-rw-r--r--apps/lang/english.lang70
-rw-r--r--apps/menus/settings_menu.c6
-rw-r--r--apps/plugin.c4
-rw-r--r--apps/plugin.h4
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/screens.c177
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c7
-rw-r--r--apps/usb_keymaps.c249
-rw-r--r--apps/usb_keymaps.h28
-rw-r--r--firmware/export/config-c200.h1
-rw-r--r--firmware/export/config-e200.h2
-rw-r--r--firmware/export/config-gigabeat-s.h1
-rwxr-xr-xfirmware/export/config-hdd1630.h1
-rw-r--r--firmware/export/config-ipod4g.h1
-rw-r--r--firmware/export/config-ipodcolor.h1
-rw-r--r--firmware/export/config-ipodmini.h1
-rw-r--r--firmware/export/config-ipodmini2g.h1
-rw-r--r--firmware/export/config-ipodnano.h1
-rw-r--r--firmware/export/config-ipodvideo.h1
-rwxr-xr-xfirmware/export/config-sa9200.h1
-rw-r--r--firmware/usbstack/usb_core.c2
-rw-r--r--firmware/usbstack/usb_hid.c349
-rw-r--r--firmware/usbstack/usb_hid_usage_tables.h36
-rw-r--r--manual/configure_rockbox/system_options.tex263
-rw-r--r--manual/platform/c200.tex1
-rw-r--r--manual/platform/clip.tex1
-rw-r--r--manual/platform/e200.tex1
-rw-r--r--manual/platform/gigabeats.tex1
-rw-r--r--manual/platform/h10.tex1
-rw-r--r--manual/platform/h10_5gb.tex1
-rw-r--r--manual/platform/ipod1g2g.tex1
-rw-r--r--manual/platform/ipod3g.tex1
-rw-r--r--manual/platform/ipod4g.tex1
-rw-r--r--manual/platform/ipodcolor.tex1
-rw-r--r--manual/platform/ipodmini.tex1
-rw-r--r--manual/platform/ipodnano.tex1
-rw-r--r--manual/platform/ipodvideo.tex1
-rw-r--r--manual/platform/keymap-gigabeats.tex4
54 files changed, 1645 insertions, 338 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 0408c32583..bac376589a 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -150,6 +150,9 @@ dsp_arm.S
150eq_arm.S 150eq_arm.S
151#endif 151#endif
152#endif 152#endif
153#ifdef USB_ENABLE_HID
154usb_keymaps.c
155#endif
153metadata.c 156metadata.c
154metadata/mp3.c 157metadata/mp3.c
155#if CONFIG_CODEC == SWCODEC 158#if CONFIG_CODEC == SWCODEC
diff --git a/apps/action.h b/apps/action.h
index 5df8639cdf..39e3e09d73 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -76,6 +76,7 @@ enum {
76 CONTEXT_KEYBOARD, 76 CONTEXT_KEYBOARD,
77 CONTEXT_FM, 77 CONTEXT_FM,
78 CONTEXT_USB_HID, 78 CONTEXT_USB_HID,
79 CONTEXT_USB_HID_MOUSE,
79}; 80};
80 81
81 82
@@ -241,14 +242,52 @@ enum {
241#endif 242#endif
242 243
243 /* USB HID codes */ 244 /* USB HID codes */
244 ACTION_USB_HID_PLAY, 245 ACTION_USB_HID_FIRST, /* Place holder */
245 ACTION_USB_HID_STOP, 246 ACTION_USB_HID_DEC,
246 ACTION_USB_HID_SKIPPREV, 247 ACTION_USB_HID_INC,
247 ACTION_USB_HID_SKIPNEXT, 248 ACTION_USB_HID_START,
248 ACTION_USB_HID_VOLDOWN, 249 ACTION_USB_HID_START_LONG,
249 ACTION_USB_HID_VOLUP, 250 ACTION_USB_HID_QUIT,
250 ACTION_USB_HID_MUTE, 251 ACTION_USB_HID_QUIT_LONG,
252 ACTION_USB_HID_LEFT,
253 ACTION_USB_HID_LEFT_LONG,
254 ACTION_USB_HID_RIGHT,
255 ACTION_USB_HID_RIGHT_LONG,
256 ACTION_USB_HID_SELECT,
257 ACTION_USB_HID_SELECT_LONG,
251 ACTION_USB_HID_MENU, 258 ACTION_USB_HID_MENU,
259 ACTION_USB_HID_MENU_LONG,
260 ACTION_USB_HID_MODE,
261 ACTION_USB_HID_MODE_LONG,
262 ACTION_USB_HID_MOUSE_UP,
263 ACTION_USB_HID_MOUSE_UP_REP,
264 ACTION_USB_HID_MOUSE_DOWN,
265 ACTION_USB_HID_MOUSE_DOWN_REP,
266 ACTION_USB_HID_MOUSE_LEFT,
267 ACTION_USB_HID_MOUSE_LEFT_REP,
268 ACTION_USB_HID_MOUSE_RIGHT,
269 ACTION_USB_HID_MOUSE_RIGHT_REP,
270 ACTION_USB_HID_MOUSE_LDRAG_UP,
271 ACTION_USB_HID_MOUSE_LDRAG_UP_REP,
272 ACTION_USB_HID_MOUSE_LDRAG_DOWN,
273 ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP,
274 ACTION_USB_HID_MOUSE_LDRAG_LEFT,
275 ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP,
276 ACTION_USB_HID_MOUSE_LDRAG_RIGHT,
277 ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP,
278 ACTION_USB_HID_MOUSE_RDRAG_UP,
279 ACTION_USB_HID_MOUSE_RDRAG_UP_REP,
280 ACTION_USB_HID_MOUSE_RDRAG_DOWN,
281 ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP,
282 ACTION_USB_HID_MOUSE_RDRAG_LEFT,
283 ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP,
284 ACTION_USB_HID_MOUSE_RDRAG_RIGHT,
285 ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP,
286 ACTION_USB_HID_MOUSE_BUTTON_LEFT,
287 ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL,
288 ACTION_USB_HID_MOUSE_BUTTON_RIGHT,
289 ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL,
290 ACTION_USB_HID_LAST, /* Place holder */
252 291
253 LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */ 292 LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */
254}; 293};
diff --git a/apps/keymaps/keymap-c100.c b/apps/keymaps/keymap-c100.c
index a19549dbd9..fcb747b5fd 100644
--- a/apps/keymaps/keymap-c100.c
+++ b/apps/keymaps/keymap-c100.c
@@ -232,17 +232,60 @@ static const struct button_mapping button_context_bmark[] = {
232 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 232 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
233}; /* button_context_bmark */ 233}; /* button_context_bmark */
234 234
235#ifdef HAVE_USBSTACK 235#ifdef USB_ENABLE_HID
236static const struct button_mapping button_context_usb_hid[] = { 236static const struct button_mapping button_context_usb_hid[] = {
237 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 237 { ACTION_USB_HID_INC, BUTTON_VOLUP, BUTTON_NONE },
238 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 238 { ACTION_USB_HID_INC, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE },
239 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 239 { ACTION_USB_HID_DEC, BUTTON_VOLDOWN, BUTTON_NONE },
240 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 240 { ACTION_USB_HID_DEC, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE },
241 { ACTION_USB_HID_MUTE, BUTTON_VOLDOWN, BUTTON_NONE }, 241 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
242 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 242 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
243 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
244 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
245 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
246 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
247 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
248 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
249 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
250 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
251 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
252 { ACTION_USB_HID_MODE, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
243 253
244 LAST_ITEM_IN_LIST 254 LAST_ITEM_IN_LIST
245}; /* button_context_usb_hid */ 255}; /* button_context_usb_hid */
256
257static const struct button_mapping button_context_usb_hid_mouse[] = {
258 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
259 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
260 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
261 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
262 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
263 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
264 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
265 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
266 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
267 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
268 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
269 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
270 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
271 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
272 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
273 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
274 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
275 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
276 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
277 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
278 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
279 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
280 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
281 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
283 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
284 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
285 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
286
287 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
288}; /* button_context_usb_hid_mouse */
246#endif 289#endif
247 290
248/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 291/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -293,9 +336,11 @@ const struct button_mapping* get_context_mapping(int context)
293#endif 336#endif
294 case CONTEXT_KEYBOARD: 337 case CONTEXT_KEYBOARD:
295 return button_context_keyboard; 338 return button_context_keyboard;
296#ifdef HAVE_USBSTACK 339#ifdef USB_ENABLE_HID
297 case CONTEXT_USB_HID: 340 case CONTEXT_USB_HID:
298 return button_context_usb_hid; 341 return button_context_usb_hid;
342 case CONTEXT_USB_HID_MOUSE:
343 return button_context_usb_hid_mouse;
299#endif 344#endif
300 default: 345 default:
301 return button_context_standard; 346 return button_context_standard;
diff --git a/apps/keymaps/keymap-c200.c b/apps/keymaps/keymap-c200.c
index acc4a6aaf0..fa6c64cec8 100644
--- a/apps/keymaps/keymap-c200.c
+++ b/apps/keymaps/keymap-c200.c
@@ -264,21 +264,62 @@ static const struct button_mapping button_context_bmark[] = {
264 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 264 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
265}; /* button_context_bmark */ 265}; /* button_context_bmark */
266 266
267#ifdef HAVE_USBSTACK 267#ifdef USB_ENABLE_HID
268static const struct button_mapping button_context_usb_hid[] = { 268static const struct button_mapping button_context_usb_hid[] = {
269 { ACTION_USB_HID_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, 269 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
270 { ACTION_USB_HID_STOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, 270 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
271 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 271 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
272 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 272 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
273 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 273 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
274 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 274 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
275 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 275 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
276 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 276 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
277 { ACTION_USB_HID_MUTE, BUTTON_DOWN, BUTTON_NONE }, 277 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
278 { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, 278 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
279 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
280 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
281 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
282 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
283 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
284 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
285 { ACTION_USB_HID_MODE, BUTTON_REC|BUTTON_REL, BUTTON_REC },
286 { ACTION_USB_HID_MODE_LONG, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
279 287
280 LAST_ITEM_IN_LIST 288 LAST_ITEM_IN_LIST
281}; /* button_context_usb_hid */ 289}; /* button_context_usb_hid */
290
291static const struct button_mapping button_context_usb_hid_mouse[] = {
292 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
293 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
294 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
295 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
296 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
297 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
298 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
299 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
300 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
301 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
302 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
303 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
320
321 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
322}; /* button_context_usb_hid_mouse */
282#endif 323#endif
283 324
284/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 325/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -327,9 +368,11 @@ const struct button_mapping* get_context_mapping(int context)
327#endif 368#endif
328 case CONTEXT_KEYBOARD: 369 case CONTEXT_KEYBOARD:
329 return button_context_keyboard; 370 return button_context_keyboard;
330#ifdef HAVE_USBSTACK 371#ifdef USB_ENABLE_HID
331 case CONTEXT_USB_HID: 372 case CONTEXT_USB_HID:
332 return button_context_usb_hid; 373 return button_context_usb_hid;
374 case CONTEXT_USB_HID_MOUSE:
375 return button_context_usb_hid_mouse;
333#endif 376#endif
334 default: 377 default:
335 return button_context_standard; 378 return button_context_standard;
diff --git a/apps/keymaps/keymap-clip.c b/apps/keymaps/keymap-clip.c
index 5b45f4fb3d..21728db7fb 100644
--- a/apps/keymaps/keymap-clip.c
+++ b/apps/keymaps/keymap-clip.c
@@ -273,21 +273,62 @@ static const struct button_mapping button_context_bmark[] = {
273 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 273 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
274}; /* button_context_bmark */ 274}; /* button_context_bmark */
275 275
276#ifdef HAVE_USBSTACK 276#ifdef USB_ENABLE_HID
277static const struct button_mapping button_context_usb_hid[] = { 277static const struct button_mapping button_context_usb_hid[] = {
278 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 278 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
279 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 279 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
280 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 280 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
281 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 281 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 282 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
283 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 283 { ACTION_USB_HID_START_LONG, BUTTON_UP|BOTTOM_REPEAT, BUTTON_UP },
284 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 284 { ACTION_USB_HID_QUIT, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
285 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 285 { ACTION_USB_HID_QUIT_LONG, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
286 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 286 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
287 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 287 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
288 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
289 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
290 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
291 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
292 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
293 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
294 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
295 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
288 296
289 LAST_ITEM_IN_LIST 297 LAST_ITEM_IN_LIST
290}; /* button_context_usb_hid */ 298}; /* button_context_usb_hid */
299
300static const struct button_mapping button_context_usb_hid_mouse[] = {
301 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
302 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
303 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_HOME|BUTTON_UP, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_HOME|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_HOME|BUTTON_DOWN, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_HOME|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_HOME|BUTTON_LEFT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_HOME|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_HOME|BUTTON_RIGHT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_HOME|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_HOME, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_HOME|BUTTON_REL, BUTTON_NONE },
329
330 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
331}; /* button_context_usb_hid_mouse */
291#endif 332#endif
292 333
293/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 334/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -337,9 +378,11 @@ const struct button_mapping* get_context_mapping(int context)
337#endif 378#endif
338 case CONTEXT_KEYBOARD: 379 case CONTEXT_KEYBOARD:
339 return button_context_keyboard; 380 return button_context_keyboard;
340#ifdef HAVE_USBSTACK 381#ifdef USB_ENABLE_HID
341 case CONTEXT_USB_HID: 382 case CONTEXT_USB_HID:
342 return button_context_usb_hid; 383 return button_context_usb_hid;
384 case CONTEXT_USB_HID_MOUSE:
385 return button_context_usb_hid_mouse;
343#endif 386#endif
344 default: 387 default:
345 return button_context_standard; 388 return button_context_standard;
diff --git a/apps/keymaps/keymap-e200.c b/apps/keymaps/keymap-e200.c
index ede06515ef..ef5c932f20 100644
--- a/apps/keymaps/keymap-e200.c
+++ b/apps/keymaps/keymap-e200.c
@@ -275,21 +275,62 @@ static const struct button_mapping button_context_bmark[] = {
275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
276}; /* button_context_bmark */ 276}; /* button_context_bmark */
277 277
278#ifdef HAVE_USBSTACK 278#ifdef USB_ENABLE_HID
279static const struct button_mapping button_context_usb_hid[] = { 279static const struct button_mapping button_context_usb_hid[] = {
280 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 280 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD, BUTTON_NONE },
281 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 281 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 282 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE },
283 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 283 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE },
284 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, 284 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
285 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, 285 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
286 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, 286 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
287 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, 287 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
288 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 288 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
289 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 289 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
290 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
291 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
292 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
293 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
294 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
295 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
296 { ACTION_USB_HID_MODE, BUTTON_REC|BUTTON_REL, BUTTON_REC },
297 { ACTION_USB_HID_MODE_LONG, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
290 298
291 LAST_ITEM_IN_LIST 299 LAST_ITEM_IN_LIST
292}; /* button_context_usb_hid */ 300}; /* button_context_usb_hid */
301
302static const struct button_mapping button_context_usb_hid_mouse[] = {
303 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
331
332 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
333}; /* button_context_usb_hid_mouse */
293#endif 334#endif
294 335
295/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 336/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -339,9 +380,11 @@ const struct button_mapping* get_context_mapping(int context)
339 return button_context_recscreen; 380 return button_context_recscreen;
340 case CONTEXT_KEYBOARD: 381 case CONTEXT_KEYBOARD:
341 return button_context_keyboard; 382 return button_context_keyboard;
342#ifdef HAVE_USBSTACK 383#ifdef USB_ENABLE_HID
343 case CONTEXT_USB_HID: 384 case CONTEXT_USB_HID:
344 return button_context_usb_hid; 385 return button_context_usb_hid;
386 case CONTEXT_USB_HID_MOUSE:
387 return button_context_usb_hid_mouse;
345#endif 388#endif
346 default: 389 default:
347 return button_context_standard; 390 return button_context_standard;
diff --git a/apps/keymaps/keymap-gigabeat-s.c b/apps/keymaps/keymap-gigabeat-s.c
index 4fb7e1b3f1..6c5b6decb5 100644
--- a/apps/keymaps/keymap-gigabeat-s.c
+++ b/apps/keymaps/keymap-gigabeat-s.c
@@ -468,40 +468,91 @@ static const struct button_mapping remote_button_context_right_is_inc[] = {
468 LAST_ITEM_IN_LIST 468 LAST_ITEM_IN_LIST
469}; /* remote_button_context_right_is_inc */ 469}; /* remote_button_context_right_is_inc */
470 470
471#ifdef HAVE_USBSTACK 471#ifdef USB_ENABLE_HID
472static const struct button_mapping button_context_usb_hid[] = { 472static const struct button_mapping button_context_usb_hid[] = {
473 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 473 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
474 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 474 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
475 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 475 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
476 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 476 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
477 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 477 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_START },
478 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 478 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_START },
479 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 479 { ACTION_USB_HID_QUIT, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
480 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 480 { ACTION_USB_HID_QUIT_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
481 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 481 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
482 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 482 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
483 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 483 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
484 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 484 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
485 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 485 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
486 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 486 { ACTION_USB_HID_SELECT, BUTTON_BACK|BUTTON_REL, BUTTON_BACK },
487 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
488 { ACTION_USB_HID_SELECT_LONG, BUTTON_BACK|BUTTON_REPEAT, BUTTON_BACK },
489 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
490 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
491 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
492 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
487 493
488 LAST_ITEM_IN_LIST 494 LAST_ITEM_IN_LIST
489}; /* button_context_usb_hid */ 495}; /* button_context_usb_hid */
490 496
491static const struct button_mapping remote_button_context_usb_hid[] = { 497static const struct button_mapping remote_button_context_usb_hid[] = {
492 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 498 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
493 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 499 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
494 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, 500 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
495 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, 501 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
496 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 502 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
497 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 503 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
498 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 504 { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
499 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 505 { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF},
500 { ACTION_USB_HID_MUTE, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_NONE }, 506 { ACTION_USB_HID_SELECT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
501 { ACTION_USB_HID_MENU, BUTTON_RC_DSP, BUTTON_NONE }, 507 { ACTION_USB_HID_SELECT_LONG, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
508 { ACTION_USB_HID_MENU, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_RC_DSP },
509 { ACTION_USB_HID_MODE, BUTTON_RC_DSP|BUTTON_REL, BUTTON_RC_DSP },
502 510
503 LAST_ITEM_IN_LIST 511 LAST_ITEM_IN_LIST
504}; /* remote_button_context_usb_hid */ 512}; /* remote_button_context_usb_hid */
513
514static const struct button_mapping button_context_usb_hid_mouse[] = {
515 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
516 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
517 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
518 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
519 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
520 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
521 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
522 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
523 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
524 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_BACK|BUTTON_UP, BUTTON_NONE },
525 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
526 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_BACK|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
527 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
528 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_BACK|BUTTON_DOWN, BUTTON_NONE },
529 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
530 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_BACK|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
531 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
532 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_BACK|BUTTON_LEFT, BUTTON_NONE },
533 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
534 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_BACK|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
535 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
536 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_BACK|BUTTON_RIGHT, BUTTON_NONE },
537 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
538 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_BACK|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
539 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_MENU|BUTTON_UP, BUTTON_NONE },
540 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_MENU|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
541 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_MENU|BUTTON_DOWN, BUTTON_NONE },
542 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_MENU|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
543 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_MENU|BUTTON_LEFT, BUTTON_NONE },
544 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_MENU|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
545 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_MENU|BUTTON_RIGHT, BUTTON_NONE },
546 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_MENU|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
547 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
548 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_BACK, BUTTON_NONE },
549 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
550 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE },
551 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_MENU, BUTTON_NONE },
552 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_MENU|BUTTON_REL, BUTTON_NONE },
553
554 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
555}; /* button_context_usb_hid_mouse */
505#endif 556#endif
506 557
507static const struct button_mapping* get_context_mapping_remote( int context ) 558static const struct button_mapping* get_context_mapping_remote( int context )
@@ -546,7 +597,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
546 case CONTEXT_FM: 597 case CONTEXT_FM:
547 return remote_button_context_radio; 598 return remote_button_context_radio;
548 599
549#ifdef HAVE_USBSTACK 600#ifdef USB_ENABLE_HID
550 case CONTEXT_USB_HID: 601 case CONTEXT_USB_HID:
551 return remote_button_context_usb_hid; 602 return remote_button_context_usb_hid;
552#endif 603#endif
@@ -617,9 +668,11 @@ const struct button_mapping* get_context_mapping(int context)
617 case CONTEXT_FM: 668 case CONTEXT_FM:
618 return button_context_radio; 669 return button_context_radio;
619 670
620#ifdef HAVE_USBSTACK 671#ifdef USB_ENABLE_HID
621 case CONTEXT_USB_HID: 672 case CONTEXT_USB_HID:
622 return button_context_usb_hid; 673 return button_context_usb_hid;
674 case CONTEXT_USB_HID_MOUSE:
675 return button_context_usb_hid_mouse;
623#endif 676#endif
624 default: 677 default:
625 return button_context_standard; 678 return button_context_standard;
diff --git a/apps/keymaps/keymap-h10.c b/apps/keymaps/keymap-h10.c
index ad1ed64c5a..81673397c3 100644
--- a/apps/keymaps/keymap-h10.c
+++ b/apps/keymaps/keymap-h10.c
@@ -337,30 +337,37 @@ static const struct button_mapping button_context_radio[] = {
337 337
338}; 338};
339 339
340#ifdef HAVE_USBSTACK 340#ifdef USB_ENABLE_HID
341static const struct button_mapping button_context_usb_hid[] = { 341static const struct button_mapping button_context_usb_hid[] = {
342 { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 342 { ACTION_USB_HID_INC, BUTTON_SCROLL_UP, BUTTON_NONE },
343 { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 343 { ACTION_USB_HID_INC, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
344 { ACTION_USB_HID_SKIPPREV, BUTTON_REW, BUTTON_NONE }, 344 { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE },
345 { ACTION_USB_HID_SKIPNEXT, BUTTON_FF, BUTTON_NONE }, 345 { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
346 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP, BUTTON_NONE }, 346 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
347 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, 347 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
348 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 348 { ACTION_USB_HID_QUIT, BUTTON_REW|BUTTON_REL, BUTTON_REW },
349 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 349 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
350 { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, 350 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
351 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
352 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
353 { ACTION_USB_HID_SELECT, BUTTON_FF|BUTTON_REL, BUTTON_FF },
354 { ACTION_USB_HID_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
355 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
351 356
352 LAST_ITEM_IN_LIST 357 LAST_ITEM_IN_LIST
353}; /* button_context_usb_hid */ 358}; /* button_context_usb_hid */
354 359
355static const struct button_mapping remote_button_context_usb_hid[] = { 360static const struct button_mapping remote_button_context_usb_hid[] = {
356 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 361 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
357 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 362 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
358 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, 363 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
359 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, 364 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
360 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 365 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
361 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 366 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
362 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 367 { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
363 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 368 { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
369 { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
370 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
364 371
365 LAST_ITEM_IN_LIST 372 LAST_ITEM_IN_LIST
366}; /* remote_button_context_usb_hid */ 373}; /* remote_button_context_usb_hid */
@@ -395,7 +402,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
395 return remote_button_context_pitchscreen; 402 return remote_button_context_pitchscreen;
396 case CONTEXT_RECSCREEN: 403 case CONTEXT_RECSCREEN:
397 return button_context_recscreen; 404 return button_context_recscreen;
398#ifdef HAVE_USBSTACK 405#ifdef USB_ENABLE_HID
399 case CONTEXT_USB_HID: 406 case CONTEXT_USB_HID:
400 return remote_button_context_usb_hid; 407 return remote_button_context_usb_hid;
401#endif 408#endif
@@ -453,7 +460,7 @@ const struct button_mapping* get_context_mapping(int context)
453 return button_context_recscreen; 460 return button_context_recscreen;
454 case CONTEXT_FM: 461 case CONTEXT_FM:
455 return button_context_radio; 462 return button_context_radio;
456#ifdef HAVE_USBSTACK 463#ifdef USB_ENABLE_HID
457 case CONTEXT_USB_HID: 464 case CONTEXT_USB_HID:
458 return button_context_usb_hid; 465 return button_context_usb_hid;
459#endif 466#endif
diff --git a/apps/keymaps/keymap-hdd1630.c b/apps/keymaps/keymap-hdd1630.c
index 4565c2807b..ddb357a8b1 100644
--- a/apps/keymaps/keymap-hdd1630.c
+++ b/apps/keymaps/keymap-hdd1630.c
@@ -284,25 +284,62 @@ static const struct button_mapping button_context_radio[] = {
284}; 284};
285#endif 285#endif
286 286
287#ifdef HAVE_USBSTACK 287#ifdef USB_ENABLE_HID
288static const struct button_mapping button_context_usb_hid[] = { 288static const struct button_mapping button_context_usb_hid[] = {
289 { ACTION_USB_HID_PLAY, BUTTON_VIEW, BUTTON_NONE }, 289 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
290 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 290 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
291 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 291 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
292 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 292 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
293 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 293 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
294 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 294 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
295 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 295 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
296 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 296 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
297 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 297 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
298 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 298 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
299 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 299 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
300 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 300 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
301 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 301 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
302 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 302 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
303 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
304 { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
305 { ACTION_USB_HID_MODE, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW },
306 { ACTION_USB_HID_MODE_LONG, BUTTON_VIEW|BUTTON_REPEAT, BUTTON_VIEW },
303 307
304 LAST_ITEM_IN_LIST 308 LAST_ITEM_IN_LIST
305}; /* button_context_usb_hid */ 309}; /* button_context_usb_hid */
310
311static const struct button_mapping button_context_usb_hid_mouse[] = {
312 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
331 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
332 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
333 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
334 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
335 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
336 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
337 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
338 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
339 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
340
341 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
342}; /* button_context_usb_hid_mouse */
306#endif 343#endif
307 344
308const struct button_mapping* get_context_mapping(int context) 345const struct button_mapping* get_context_mapping(int context)
@@ -352,9 +389,11 @@ const struct button_mapping* get_context_mapping(int context)
352 case CONTEXT_FM: 389 case CONTEXT_FM:
353 return button_context_radio; 390 return button_context_radio;
354#endif 391#endif
355#ifdef HAVE_USBSTACK 392#ifdef USB_ENABLE_HID
356 case CONTEXT_USB_HID: 393 case CONTEXT_USB_HID:
357 return button_context_usb_hid; 394 return button_context_usb_hid;
395 case CONTEXT_USB_HID_MOUSE:
396 return button_context_usb_hid_mouse;
358#endif 397#endif
359 } 398 }
360 return button_context_standard; 399 return button_context_standard;
diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c
index 774597a3c0..99c7f93511 100644
--- a/apps/keymaps/keymap-ipod.c
+++ b/apps/keymaps/keymap-ipod.c
@@ -193,21 +193,48 @@ const struct button_mapping button_context_recscreen[] = {
193}; /* button_context_recscreen */ 193}; /* button_context_recscreen */
194#endif 194#endif
195 195
196#ifdef HAVE_USBSTACK 196#ifdef USB_ENABLE_HID
197static const struct button_mapping button_context_usb_hid[] = { 197static const struct button_mapping button_context_usb_hid[] = {
198 { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 198 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD, BUTTON_NONE },
199 { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 199 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE },
200 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 200 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE },
201 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 201 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE },
202 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, 202 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
203 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, 203 { ACTION_USB_HID_QUIT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
204 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, 204 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
205 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, 205 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
206 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 206 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
207 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 207 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
208 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
209 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
210 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
211 { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
208 212
209 LAST_ITEM_IN_LIST 213 LAST_ITEM_IN_LIST
210}; /* button_context_usb_hid */ 214}; /* button_context_usb_hid */
215
216static const struct button_mapping button_context_usb_hid_mouse[] = {
217 { ACTION_USB_HID_MOUSE_UP, BUTTON_MENU, BUTTON_NONE },
218 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
219 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_PLAY, BUTTON_NONE },
220 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
221 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
222 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
223 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
224 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
225 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_MENU, BUTTON_NONE },
226 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
227 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_PLAY, BUTTON_NONE },
228 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
229 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
230 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
231 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
232 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
233 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
234 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
235
236 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
237}; /* button_context_usb_hid_mouse */
211#endif 238#endif
212 239
213#if BUTTON_REMOTE != 0 240#if BUTTON_REMOTE != 0
@@ -242,16 +269,18 @@ static const struct button_mapping remote_button_context_wps[] = {
242 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 269 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
243}; 270};
244 271
245#ifdef HAVE_USBSTACK 272#ifdef USB_ENABLE_HID
246static const struct button_mapping remote_button_context_usb_hid[] = { 273static const struct button_mapping remote_button_context_usb_hid[] = {
247 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 274 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
248 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 275 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
249 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_LEFT, BUTTON_NONE }, 276 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
250 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, 277 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
251 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 278 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
252 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 279 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
253 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 280 { ACTION_USB_HID_LEFT, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT },
254 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 281 { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_RC_LEFT },
282 { ACTION_USB_HID_RIGHT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT },
283 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_RC_RIGHT },
255 284
256 LAST_ITEM_IN_LIST 285 LAST_ITEM_IN_LIST
257}; /* remote_button_context_usb_hid */ 286}; /* remote_button_context_usb_hid */
@@ -265,7 +294,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
265 { 294 {
266 case CONTEXT_WPS: 295 case CONTEXT_WPS:
267 return remote_button_context_wps; 296 return remote_button_context_wps;
268#ifdef HAVE_USBSTACK 297#ifdef USB_ENABLE_HID
269 case CONTEXT_USB_HID: 298 case CONTEXT_USB_HID:
270 return remote_button_context_usb_hid; 299 return remote_button_context_usb_hid;
271#endif 300#endif
@@ -321,9 +350,11 @@ const struct button_mapping* get_context_mapping(int context)
321 case CONTEXT_RECSCREEN: 350 case CONTEXT_RECSCREEN:
322 return button_context_recscreen; 351 return button_context_recscreen;
323#endif 352#endif
324#ifdef HAVE_USBSTACK 353#ifdef USB_ENABLE_HID
325 case CONTEXT_USB_HID: 354 case CONTEXT_USB_HID:
326 return button_context_usb_hid; 355 return button_context_usb_hid;
356 case CONTEXT_USB_HID_MOUSE:
357 return button_context_usb_hid_mouse;
327#endif 358#endif
328 default: 359 default:
329 return button_context_standard; 360 return button_context_standard;
diff --git a/apps/keymaps/keymap-mr100.c b/apps/keymaps/keymap-mr100.c
index bf9da0de58..a605131465 100644
--- a/apps/keymaps/keymap-mr100.c
+++ b/apps/keymaps/keymap-mr100.c
@@ -315,7 +315,7 @@ static const struct button_mapping remote_button_context_tree[] = {
315 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 315 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
316}; 316};
317 317
318#ifdef HAVE_USBSTACK 318#ifdef USB_ENABLE_HID
319static const struct button_mapping button_context_usb_hid[] = { 319static const struct button_mapping button_context_usb_hid[] = {
320 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 320 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE },
321 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 321 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE },
@@ -357,7 +357,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
357 case CONTEXT_MAINMENU: 357 case CONTEXT_MAINMENU:
358 case CONTEXT_TREE: 358 case CONTEXT_TREE:
359 return remote_button_context_tree; 359 return remote_button_context_tree;
360#ifdef HAVE_USBSTACK 360#ifdef USB_ENABLE_HID
361 case CONTEXT_USB_HID: 361 case CONTEXT_USB_HID:
362 return remote_button_context_usb_hid; 362 return remote_button_context_usb_hid;
363#endif 363#endif
@@ -411,7 +411,7 @@ const struct button_mapping* get_context_mapping(int context)
411 return button_context_pitchscreen; 411 return button_context_pitchscreen;
412 case CONTEXT_KEYBOARD: 412 case CONTEXT_KEYBOARD:
413 return button_context_keyboard; 413 return button_context_keyboard;
414#ifdef HAVE_USBSTACK 414#ifdef USB_ENABLE_HID
415 case CONTEXT_USB_HID: 415 case CONTEXT_USB_HID:
416 return button_context_usb_hid; 416 return button_context_usb_hid;
417#endif 417#endif
diff --git a/apps/keymaps/keymap-ondavx747.c b/apps/keymaps/keymap-ondavx747.c
index 6eb2230d49..ee590599b6 100644
--- a/apps/keymaps/keymap-ondavx747.c
+++ b/apps/keymaps/keymap-ondavx747.c
@@ -167,14 +167,16 @@ static const struct button_mapping button_context_keyboard[] = {
167 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 167 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
168}; /* button_context_keyboard */ 168}; /* button_context_keyboard */
169 169
170#ifdef HAVE_USBSTACK 170#ifdef USB_ENABLE_HID
171static const struct button_mapping button_context_usb_hid[] = { 171static const struct button_mapping button_context_usb_hid[] = {
172 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 172 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
173 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 173 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
174 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 174 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
175 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 175 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
176 { ACTION_USB_HID_MUTE, BUTTON_POWER, BUTTON_NONE }, 176 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_SELECT },
177 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 177 { ACTION_USB_HID_SELECT, BUTTON_POWER|BUTTON_REL, BUTTON_SELECT },
178 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
179 { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
178 180
179 LAST_ITEM_IN_LIST 181 LAST_ITEM_IN_LIST
180}; /* button_context_usb_hid */ 182}; /* button_context_usb_hid */
diff --git a/apps/keymaps/keymap-ondavx777.c b/apps/keymaps/keymap-ondavx777.c
index 99f509b18f..f492a1964f 100644
--- a/apps/keymaps/keymap-ondavx777.c
+++ b/apps/keymaps/keymap-ondavx777.c
@@ -110,7 +110,7 @@ static const struct button_mapping button_context_keyboard[] = {
110 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 110 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
111}; /* button_context_keyboard */ 111}; /* button_context_keyboard */
112 112
113#ifdef HAVE_USBSTACK 113#ifdef USB_ENABLE_HID
114static const struct button_mapping button_context_usb_hid[] = { 114static const struct button_mapping button_context_usb_hid[] = {
115 LAST_ITEM_IN_LIST 115 LAST_ITEM_IN_LIST
116}; /* button_context_usb_hid */ 116}; /* button_context_usb_hid */
@@ -162,7 +162,7 @@ const struct button_mapping* target_get_context_mapping(int context)
162 return button_context_pitchscreen; 162 return button_context_pitchscreen;
163 case CONTEXT_KEYBOARD: 163 case CONTEXT_KEYBOARD:
164 return button_context_keyboard; 164 return button_context_keyboard;
165#ifdef HAVE_USBSTACK 165#ifdef USB_ENABLE_HID
166 case CONTEXT_USB_HID: 166 case CONTEXT_USB_HID:
167 return button_context_usb_hid; 167 return button_context_usb_hid;
168#endif 168#endif
diff --git a/apps/keymaps/keymap-sa9200.c b/apps/keymaps/keymap-sa9200.c
index 3e83932347..cb9c746cf3 100644
--- a/apps/keymaps/keymap-sa9200.c
+++ b/apps/keymaps/keymap-sa9200.c
@@ -276,30 +276,66 @@ static const struct button_mapping button_context_keyboard[] = {
276 LAST_ITEM_IN_LIST 276 LAST_ITEM_IN_LIST
277}; /* button_context_keyboard */ 277}; /* button_context_keyboard */
278 278
279#ifdef HAVE_USBSTACK 279#ifdef USB_ENABLE_HID
280static const struct button_mapping button_context_usb_hid[] = { 280static const struct button_mapping button_context_usb_hid[] = {
281 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 281 { ACTION_USB_HID_INC, BUTTON_UP, BUTTON_NONE },
282 { ACTION_USB_HID_STOP, BUTTON_PREV, BUTTON_NONE }, 282 { ACTION_USB_HID_INC, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
283 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 283 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
284 284 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
285 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 285 { ACTION_USB_HID_DEC, BUTTON_DOWN, BUTTON_NONE },
286 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 286 { ACTION_USB_HID_DEC, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
287 287 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
288 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 288 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
289 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 289 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
290 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 290 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
291 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 291 { ACTION_USB_HID_QUIT, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
292 292 { ACTION_USB_HID_QUIT_LONG, BUTTON_PREV|BUTTON_REPEAT, BUTTON_PREV },
293 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 293 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
294 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 294 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
295 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 295 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
296 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 296 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT BUTTON_RIGHT },
297 297 { ACTION_USB_HID_SELECT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
298 { ACTION_USB_HID_MUTE, BUTTON_NEXT, BUTTON_NONE }, 298 { ACTION_USB_HID_SELECT_LONG, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NEXT },
299 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 299 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
300 { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
301 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
302 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
300 303
301 LAST_ITEM_IN_LIST 304 LAST_ITEM_IN_LIST
302}; /* button_context_usb_hid */ 305}; /* button_context_usb_hid */
306
307static const struct button_mapping button_context_usb_hid_mouse[] = {
308 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_PREV|BUTTON_UP, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_PREV|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_PREV|BUTTON_DOWN, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_PREV|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_PREV|BUTTON_LEFT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_PREV|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_PREV|BUTTON_RIGHT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_PREV|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_NEXT|BUTTON_UP, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_NEXT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_NEXT|BUTTON_DOWN, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_NEXT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_NEXT|BUTTON_LEFT, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_NEXT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_NEXT|BUTTON_RIGHT, BUTTON_NONE },
331 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_NEXT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
332 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_PREV, BUTTON_NONE },
333 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
334 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_NEXT, BUTTON_NONE },
335 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
336
337 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
338}; /* button_context_usb_hid_mouse */
303#endif 339#endif
304 340
305const struct button_mapping* get_context_mapping(int context) 341const struct button_mapping* get_context_mapping(int context)
@@ -349,9 +385,11 @@ const struct button_mapping* get_context_mapping(int context)
349 case CONTEXT_KEYBOARD: 385 case CONTEXT_KEYBOARD:
350 return button_context_keyboard; 386 return button_context_keyboard;
351 387
352#ifdef HAVE_USBSTACK 388#ifdef USB_ENABLE_HID
353 case CONTEXT_USB_HID: 389 case CONTEXT_USB_HID:
354 return button_context_usb_hid; 390 return button_context_usb_hid;
391 case CONTEXT_USB_HID_MOUSE:
392 return button_context_usb_hid_mouse;
355#endif 393#endif
356 } 394 }
357 return button_context_standard; 395 return button_context_standard;
diff --git a/apps/keymaps/keymap-touchscreen.c b/apps/keymaps/keymap-touchscreen.c
index 4b86efa29e..499eb2b562 100644
--- a/apps/keymaps/keymap-touchscreen.c
+++ b/apps/keymaps/keymap-touchscreen.c
@@ -251,13 +251,26 @@ static const struct button_mapping button_context_radio[] = {
251 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_FM) 251 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_FM)
252}; /* button_context_radio */ 252}; /* button_context_radio */
253 253
254#ifdef HAVE_USBSTACK 254#ifdef USB_ENABLE_HID
255static const struct button_mapping button_context_usb_hid[] = { 255static const struct button_mapping button_context_usb_hid[] = {
256 { ACTION_USB_HID_PLAY, BUTTON_TOPRIGHT, BUTTON_NONE }, 256 { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT },
257 { ACTION_USB_HID_SKIPPREV, BUTTON_MIDLEFT, BUTTON_NONE }, 257 { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REPEAT, BUTTON_BOTTOMRIGHT },
258 { ACTION_USB_HID_SKIPNEXT, BUTTON_MIDRIGHT, BUTTON_NONE }, 258 { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REL, BUTTON_BOTTOMMIDDLE },
259 { ACTION_USB_HID_MUTE, BUTTON_CENTER, BUTTON_NONE }, 259 { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REPEAT, BUTTON_BOTTOMMIDDLE },
260 { ACTION_USB_HID_MENU, BUTTON_TOPLEFT, BUTTON_NONE }, 260 { ACTION_USB_HID_START, BUTTON_TOPMIDDLE|BUTTON_REL, BUTTON_TOPMIDDLE },
261 { ACTION_USB_HID_START_LONG, BUTTON_TOPMIDDLE|BUTTON_REPEAT, BUTTON_TOPMIDDLE },
262 { ACTION_USB_HID_QUIT, BUTTON_BOTTOMLEFT|BUTTON_REL, BUTTON_BOTTOMLEFT },
263 { ACTION_USB_HID_QUIT_LONG, BUTTON_BOTTOMLEFT|BUTTON_REPEAT, BUTTON_BOTTOMLEFT },
264 { ACTION_USB_HID_LEFT, BUTTON_MIDLEFT|BUTTON_REL, BUTTON_MIDLEFT },
265 { ACTION_USB_HID_LEFT_LONG, BUTTON_MIDLEFT|BUTTON_REPEAT, BUTTON_MIDLEFT },
266 { ACTION_USB_HID_RIGHT, BUTTON_MIDRIGHT|BUTTON_REL, BUTTON_MIDRIGHT },
267 { ACTION_USB_HID_RIGHT_LONG, BUTTON_MIDRIGHT|BUTTON_REPEAT, BUTTON_MIDRIGHT },
268 { ACTION_USB_HID_SELECT, BUTTON_CENTER|BUTTON_REL, BUTTON_CENTER },
269 { ACTION_USB_HID_SELECT_LONG, BUTTON_CENTER|BUTTON_REPEAT, BUTTON_CENTER },
270 { ACTION_USB_HID_MENU, BUTTON_TOPRIGHT|BUTTON_REL, BUTTON_TOPRIGHT },
271 { ACTION_USB_HID_MENU_LONG, BUTTON_TOPRIGHT|BUTTON_REPEAT, BUTTON_TOPRIGHT },
272 { ACTION_USB_HID_MODE, BUTTON_TOPLEFT|BUTTON_REL, BUTTON_TOPLEFT },
273 { ACTION_USB_HID_MODE_LONG, BUTTON_TOPLEFT|BUTTON_REPEAT, BUTTON_TOPLEFT },
261 274
262 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_USB_HID) 275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_USB_HID)
263}; /* button_context_usb_hid */ 276}; /* button_context_usb_hid */
@@ -315,7 +328,7 @@ const struct button_mapping* get_context_mapping(int context)
315 return button_context_pitchscreen; 328 return button_context_pitchscreen;
316 case CONTEXT_KEYBOARD: 329 case CONTEXT_KEYBOARD:
317 return button_context_keyboard; 330 return button_context_keyboard;
318#ifdef HAVE_USBSTACK 331#ifdef USB_ENABLE_HID
319 case CONTEXT_USB_HID: 332 case CONTEXT_USB_HID:
320 return button_context_usb_hid; 333 return button_context_usb_hid;
321#endif 334#endif
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 72e0a4ce90..541e7ffbe0 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12654,6 +12654,76 @@
12654 </voice> 12654 </voice>
12655</phrase> 12655</phrase>
12656<phrase> 12656<phrase>
12657 id: LANG_USB_KEYPAD_MODE
12658 desc: in settings_menu
12659 user: core
12660 <source>
12661 *: "USB Keypad Mode:"
12662 </source>
12663 <dest>
12664 *: "USB Keypad Mode:"
12665 </dest>
12666 <voice>
12667 *: "USB Keypad Mode"
12668 </voice>
12669</phrase>
12670<phrase>
12671 id: LANG_MULTIMEDIA
12672 desc: in settings_menu
12673 user: core
12674 <source>
12675 *: "Multimedia"
12676 </source>
12677 <dest>
12678 *: "Multimedia"
12679 </dest>
12680 <voice>
12681 *: "Multimedia"
12682 </voice>
12683</phrase>
12684<phrase>
12685 id: LANG_PRESENTATION
12686 desc: in settings_menu
12687 user: core
12688 <source>
12689 *: "Presentation"
12690 </source>
12691 <dest>
12692 *: "Presentation"
12693 </dest>
12694 <voice>
12695 *: "Presentation"
12696 </voice>
12697</phrase>
12698<phrase>
12699 id: LANG_BROWSER
12700 desc: in settings_menu
12701 user: core
12702 <source>
12703 *: "Browser"
12704 </source>
12705 <dest>
12706 *: "Browser"
12707 </dest>
12708 <voice>
12709 *: "Browser"
12710 </voice>
12711</phrase>
12712<phrase>
12713 id: LANG_MOUSE
12714 desc: in settings_menu
12715 user: core
12716 <source>
12717 *: "Mouse"
12718 </source>
12719 <dest>
12720 *: "Mouse"
12721 </dest>
12722 <voice>
12723 *: "Mouse"
12724 </voice>
12725</phrase>
12726<phrase>
12657 id: LANG_SKIN_RAM_USAGE 12727 id: LANG_SKIN_RAM_USAGE
12658 desc: how much RAM the skins are using 12728 desc: how much RAM the skins are using
12659 user: core 12729 user: core
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index fdc775877a..71a6089e68 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -252,6 +252,9 @@ MENUITEM_SETTING(serial_bitrate, &global_settings.serial_bitrate, NULL);
252MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL); 252MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL);
253#endif 253#endif
254MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); 254MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL);
255#ifdef USB_ENABLE_HID
256MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL);
257#endif
255 258
256#ifdef HAVE_BUTTON_LIGHT 259#ifdef HAVE_BUTTON_LIGHT
257MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL); 260MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL);
@@ -300,6 +303,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
300#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING 303#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
301 &touchpad_sensitivity, 304 &touchpad_sensitivity,
302#endif 305#endif
306#ifdef USB_ENABLE_HID
307 &usb_keypad_mode,
308#endif
303 ); 309 );
304 310
305/* SYSTEM MENU */ 311/* SYSTEM MENU */
diff --git a/apps/plugin.c b/apps/plugin.c
index aa7077edae..945e99ec71 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -51,7 +51,7 @@
51#include "bidi.h" 51#include "bidi.h"
52#endif 52#endif
53 53
54#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 54#ifdef USB_ENABLE_HID
55#include "usbstack/usb_hid.h" 55#include "usbstack/usb_hid.h"
56#endif 56#endif
57 57
@@ -367,7 +367,7 @@ static const struct plugin_api rockbox_api = {
367 queue_reply, 367 queue_reply,
368#endif 368#endif
369 usb_acknowledge, 369 usb_acknowledge,
370#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 370#ifdef USB_ENABLE_HID
371 usb_hid_send, 371 usb_hid_send,
372#endif 372#endif
373#ifdef RB_PROFILE 373#ifdef RB_PROFILE
diff --git a/apps/plugin.h b/apps/plugin.h
index b4a6b4fc1b..766a309c01 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -105,7 +105,7 @@ void* plugin_get_buffer(size_t *buffer_size);
105 105
106#include "yesno.h" 106#include "yesno.h"
107 107
108#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 108#ifdef USB_ENABLE_HID
109#include "usbstack/usb_hid_usage_tables.h" 109#include "usbstack/usb_hid_usage_tables.h"
110#endif 110#endif
111 111
@@ -491,7 +491,7 @@ struct plugin_api {
491#endif /* CONFIG_CODEC == SWCODEC */ 491#endif /* CONFIG_CODEC == SWCODEC */
492 492
493 void (*usb_acknowledge)(long id); 493 void (*usb_acknowledge)(long id);
494#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 494#ifdef USB_ENABLE_HID
495 void (*usb_hid_send)(usage_page_t usage_page, int id); 495 void (*usb_hid_send)(usage_page_t usage_page, int id);
496#endif 496#endif
497#ifdef RB_PROFILE 497#ifdef RB_PROFILE
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index b9061ee74b..4cfc3a8b0f 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -169,6 +169,6 @@ md5sum.c
169lua.c 169lua.c
170#endif 170#endif
171 171
172#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 172#ifdef USB_ENABLE_HID
173remote_control.c 173remote_control.c
174#endif 174#endif
diff --git a/apps/screens.c b/apps/screens.c
index a7a4b27ea8..65b64eab3e 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -37,7 +37,7 @@
37#if defined(HAVE_USBSTACK) 37#if defined(HAVE_USBSTACK)
38#include "usb_core.h" 38#include "usb_core.h"
39#ifdef USB_ENABLE_HID 39#ifdef USB_ENABLE_HID
40#include "usbstack/usb_hid.h" 40#include "usb_keymaps.h"
41#endif 41#endif
42#endif 42#endif
43#include "settings.h" 43#include "settings.h"
@@ -93,59 +93,32 @@ static int clamp_value_wrap(int value, int max, int min)
93#endif 93#endif
94 94
95#ifndef SIMULATOR 95#ifndef SIMULATOR
96
97#ifdef USB_ENABLE_HID
98int usb_keypad_mode;
99#endif
100
96static int handle_usb_events(void) 101static int handle_usb_events(void)
97{ 102{
98#if (CONFIG_STORAGE & STORAGE_MMC) 103#if (CONFIG_STORAGE & STORAGE_MMC)
99 int next_update=0; 104 int next_update=0;
100#endif /* STORAGE_MMC */ 105#endif /* STORAGE_MMC */
101 106
102#ifdef HAVE_TOUCHSCREEN
103 enum touchscreen_mode old_mode = touchscreen_get_mode();
104
105 /* TODO: Paint buttons on screens OR switch to point mode and use
106 * touchscreen as a touchpad to move the host's mouse cursor */
107 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
108#endif
109
110 /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */ 107 /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
111 while(1) 108 while(1)
112 { 109 {
113 int button; 110 int button;
114#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 111#ifdef USB_ENABLE_HID
115 bool hid_enabled = usb_core_driver_enabled(USB_DRIVER_HID); 112 if (usb_core_driver_enabled(USB_DRIVER_HID))
116
117 if (hid_enabled)
118 { 113 {
119 int id = HID_CONSUMER_USAGE_UNASSIGNED; 114 button = get_hid_usb_action();
120 button = get_action(CONTEXT_USB_HID, HZ/2);
121 115
122 switch (button) 116 /* On mode change, we need to refresh the screen */
117 if (button == ACTION_USB_HID_MODE ||
118 button == ACTION_USB_HID_MODE_LONG)
123 { 119 {
124 case ACTION_USB_HID_PLAY: 120 break;
125 id = HID_CONSUMER_USAGE_PLAY_PAUSE;
126 break;
127 case ACTION_USB_HID_STOP:
128 id = HID_CONSUMER_USAGE_STOP;
129 break;
130 case ACTION_USB_HID_SKIPPREV:
131 id = HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK;
132 break;
133 case ACTION_USB_HID_SKIPNEXT:
134 id = HID_CONSUMER_USAGE_SCAN_NEXT_TRACK;
135 break;
136 case ACTION_USB_HID_VOLDOWN:
137 id = HID_CONSUMER_USAGE_VOLUME_DECREMENT;
138 break;
139 case ACTION_USB_HID_VOLUP:
140 id = HID_CONSUMER_USAGE_VOLUME_INCREMENT;
141 break;
142 case ACTION_USB_HID_MUTE:
143 id = HID_CONSUMER_USAGE_MUTE;
144 break;
145 } 121 }
146
147 if (id != HID_CONSUMER_USAGE_UNASSIGNED)
148 usb_hid_send(HID_USAGE_PAGE_CONSUMER, id);
149 } 122 }
150 else 123 else
151#endif 124#endif
@@ -159,7 +132,7 @@ static int handle_usb_events(void)
159 { 132 {
160 case SYS_USB_DISCONNECTED: 133 case SYS_USB_DISCONNECTED:
161 usb_acknowledge(SYS_USB_DISCONNECTED_ACK); 134 usb_acknowledge(SYS_USB_DISCONNECTED_ACK);
162 goto Exit; 135 return 1;
163 case SYS_TIMEOUT: 136 case SYS_TIMEOUT:
164 break; 137 break;
165 } 138 }
@@ -174,14 +147,12 @@ static int handle_usb_events(void)
174 } 147 }
175#endif /* STORAGE_MMC */ 148#endif /* STORAGE_MMC */
176 } 149 }
177Exit: 150
178#ifdef HAVE_TOUCHSCREEN
179 touchscreen_set_mode(old_mode);
180#endif
181 return 0; 151 return 0;
182} 152}
183#endif 153#endif
184 154
155#define MODE_NAME_LEN 32
185void usb_screen(void) 156void usb_screen(void)
186{ 157{
187#ifdef USB_NONE 158#ifdef USB_NONE
@@ -190,55 +161,107 @@ void usb_screen(void)
190 int i; 161 int i;
191 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */ 162 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */
192 int old_bars = viewportmanager_get_statusbar(); 163 int old_bars = viewportmanager_get_statusbar();
164#if defined HAVE_TOUCHSCREEN
165 enum touchscreen_mode old_mode = touchscreen_get_mode();
193 166
194 FOR_NB_SCREENS(i) 167 /* TODO: Paint buttons on screens OR switch to point mode and use
168 * touchscreen as a touchpad to move the host's mouse cursor */
169 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
170#endif
171
172#ifndef SIMULATOR
173 usb_acknowledge(SYS_USB_CONNECTED_ACK);
174#endif
175
176#ifdef USB_ENABLE_HID
177 usb_keypad_mode = global_settings.usb_keypad_mode;
178#endif
179
180 while (1)
195 { 181 {
196 screens[i].backdrop_show(BACKDROP_MAIN); 182 FOR_NB_SCREENS(i)
197 screens[i].backlight_on();
198 screens[i].clear_display();
199#ifdef HAVE_REMOTE_LCD
200 if (i == SCREEN_REMOTE)
201 { 183 {
202 screens[i].bitmap(remote_usblogo, 184 screens[i].backdrop_show(BACKDROP_MAIN);
203 (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo), 185 screens[i].backlight_on();
204 (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2, 186 screens[i].clear_display();
205 BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo); 187#ifdef HAVE_REMOTE_LCD
206 } 188 if (i == SCREEN_REMOTE)
207 else 189 {
190 screens[i].bitmap(remote_usblogo,
191 (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo),
192 (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2,
193 BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo);
194 }
195 else
208#endif 196#endif
209 { 197 {
198 char mode_name[MODE_NAME_LEN];
199
210#ifdef HAVE_LCD_BITMAP 200#ifdef HAVE_LCD_BITMAP
211 screens[i].transparent_bitmap(usblogo, 201 screens[i].transparent_bitmap(usblogo,
212 (LCD_WIDTH-BMPWIDTH_usblogo), 202 (LCD_WIDTH-BMPWIDTH_usblogo),
213 (LCD_HEIGHT-BMPHEIGHT_usblogo)/2, 203 (LCD_HEIGHT-BMPHEIGHT_usblogo)/2,
214 BMPWIDTH_usblogo, BMPHEIGHT_usblogo); 204 BMPWIDTH_usblogo, BMPHEIGHT_usblogo);
205
206#ifdef USB_ENABLE_HID
207 int y, w, h;
208
209 screens[i].getstringsize(str(LANG_USB_KEYPAD_MODE), &w, &h);
210
211 y = (LCD_HEIGHT - BMPHEIGHT_usblogo) / 2 + BMPHEIGHT_usblogo + h;
212 screens[i].putsxy((LCD_WIDTH - w) / 2, y,
213 str(LANG_USB_KEYPAD_MODE));
214 y += 3 * h / 2;
215
216 snprintf(mode_name, MODE_NAME_LEN, "%s",
217 str(keypad_mode_name_get()));
218 screens[i].getstringsize(mode_name, &w, &h);
219 screens[i].putsxy((LCD_WIDTH - w) / 2, y, mode_name);
220#endif /* HID */
221#else /* HAVE_LCD_BITMAP */
222 screens[i].double_height(false);
223#ifdef USB_ENABLE_HID
224 snprintf(mode_name, MODE_NAME_LEN, "[USB Mode; %s]",
225 str(keypad_mode_name_get()));
226 screens[i].puts_scroll(0, 0, mode_name);
215#else 227#else
216 screens[i].double_height(false); 228 screens[i].puts_scroll(0, 0, "[USB Mode]");
217 screens[i].puts_scroll(0, 0, "[USB Mode]"); 229#endif
218 status_set_param(false); 230 status_set_param(false);
219 status_set_audio(false); 231 status_set_audio(false);
220 status_set_usb(true); 232 status_set_usb(true);
221#endif /* HAVE_LCD_BITMAP */ 233#endif /* HAVE_LCD_BITMAP */
222 } 234 }
223 screens[i].update(); 235 screens[i].update();
224 236
225 /* force statusbar by ignoring the setting */ 237 /* force statusbar by ignoring the setting */
226 usb_bars |= VP_SB_IGNORE_SETTING(i); 238 usb_bars |= VP_SB_IGNORE_SETTING(i);
227 } 239 }
228 240
229 viewportmanager_set_statusbar(usb_bars); 241 viewportmanager_set_statusbar(usb_bars);
230 242
231#ifdef SIMULATOR 243#ifdef SIMULATOR
232 while (1)
233 {
234 if (button_get_w_tmo(HZ/2)) 244 if (button_get_w_tmo(HZ/2))
235 break; 245 break;
236 send_event(GUI_EVENT_ACTIONUPDATE, NULL); 246 send_event(GUI_EVENT_ACTIONUPDATE, NULL);
237 }
238#else 247#else
239 usb_acknowledge(SYS_USB_CONNECTED_ACK); 248 if (handle_usb_events())
240 while (handle_usb_events()); 249 break;
241#endif /* SIMULATOR */ 250#endif /* SIMULATOR */
251 }
252
253#ifdef USB_ENABLE_HID
254 if (global_settings.usb_keypad_mode != usb_keypad_mode)
255 {
256 global_settings.usb_keypad_mode = usb_keypad_mode;
257 settings_save();
258 }
259#endif
260
261#ifdef HAVE_TOUCHSCREEN
262 touchscreen_set_mode(old_mode);
263#endif
264
242#ifdef HAVE_LCD_CHARCELLS 265#ifdef HAVE_LCD_CHARCELLS
243 status_set_usb(false); 266 status_set_usb(false);
244#endif /* HAVE_LCD_CHARCELLS */ 267#endif /* HAVE_LCD_CHARCELLS */
@@ -248,7 +271,7 @@ void usb_screen(void)
248 } 271 }
249 viewportmanager_set_statusbar(old_bars); 272 viewportmanager_set_statusbar(old_bars);
250 send_event(GUI_EVENT_REFRESH, NULL); 273 send_event(GUI_EVENT_REFRESH, NULL);
251 274
252#endif /* USB_NONE */ 275#endif /* USB_NONE */
253} 276}
254 277
diff --git a/apps/settings.h b/apps/settings.h
index ec92a81734..b208ee5872 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -768,7 +768,11 @@ struct user_settings
768 /* If values are just added to the end, no need to bump plugin API 768 /* If values are just added to the end, no need to bump plugin API
769 version. */ 769 version. */
770 /* new stuff to be added at the end */ 770 /* new stuff to be added at the end */
771 771
772#ifdef USB_ENABLE_HID
773 int usb_keypad_mode;
774#endif
775
772#ifdef HAVE_LCD_BITMAP 776#ifdef HAVE_LCD_BITMAP
773 unsigned char ui_vp_config[64]; /* viewport string for the lists */ 777 unsigned char ui_vp_config[64]; /* viewport string for the lists */
774#ifdef HAVE_REMOTE_LCD 778#ifdef HAVE_REMOTE_LCD
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 2e3632b949..34e8854421 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1613,6 +1613,13 @@ const struct settings_list settings[] = {
1613#endif 1613#endif
1614#endif 1614#endif
1615 1615
1616#ifdef USB_ENABLE_HID
1617 CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0,
1618 "usb keypad mode", "multimedia,presentation,browser,mouse",
1619 NULL, 3, ID2P(LANG_MULTIMEDIA), ID2P(LANG_PRESENTATION),
1620 ID2P(LANG_BROWSER), ID2P(LANG_MOUSE)),
1621#endif
1622
1616 /* Customizable list */ 1623 /* Customizable list */
1617#ifdef HAVE_LCD_BITMAP 1624#ifdef HAVE_LCD_BITMAP
1618 VIEWPORT_SETTING(ui_vp_config, "ui viewport"), 1625 VIEWPORT_SETTING(ui_vp_config, "ui viewport"),
diff --git a/apps/usb_keymaps.c b/apps/usb_keymaps.c
new file mode 100644
index 0000000000..c791b11b25
--- /dev/null
+++ b/apps/usb_keymaps.c
@@ -0,0 +1,249 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Tomer Shalev
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "config.h"
22
23#ifdef USB_ENABLE_HID
24#include "action.h"
25#include "lang.h"
26#include "usbstack/usb_hid.h"
27//#define LOGF_ENABLE
28#include "logf.h"
29
30#define MODIFIER(modifier, key) ((key) | (modifier << 8))
31
32#define ALT(key) MODIFIER(HID_KEYBOARD_LEFT_ALT, key)
33#define CTRL(key) MODIFIER(HID_KEYBOARD_LEFT_CONTROL, key)
34#define SHIFT(key) MODIFIER(HID_KEYBOARD_LEFT_SHIFT, key)
35
36#define NUM_KEY_MAPPINGS (sizeof(hid_key_mappings) / \
37 sizeof(hid_key_mappings[0]))
38
39typedef struct
40{
41 int action;
42 int id;
43} mapping_t;
44
45typedef struct
46{
47 int lang_name;
48 usage_page_t usage_page;
49 mapping_t mapping[];
50} hid_key_mapping_t;
51
52static const hid_key_mapping_t hid_key_mapping_multimedia = {
53 LANG_MULTIMEDIA,
54 HID_USAGE_PAGE_CONSUMER,
55 {
56 /* Volume up */
57 { ACTION_USB_HID_DEC, HID_CONSUMER_USAGE_VOLUME_DECREMENT },
58 /* Volume down */
59 { ACTION_USB_HID_INC, HID_CONSUMER_USAGE_VOLUME_INCREMENT },
60 /* Volume mute */
61 { ACTION_USB_HID_SELECT, HID_CONSUMER_USAGE_MUTE },
62 /* Play / pause */
63 { ACTION_USB_HID_START, HID_CONSUMER_USAGE_PLAY_PAUSE },
64 /* Stop */
65 { ACTION_USB_HID_QUIT, HID_CONSUMER_USAGE_STOP },
66 /* Scan previous track */
67 { ACTION_USB_HID_LEFT, HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK },
68 /* Scan next track */
69 { ACTION_USB_HID_RIGHT, HID_CONSUMER_USAGE_SCAN_NEXT_TRACK },
70 { 0, 0 },
71 }
72};
73
74static const hid_key_mapping_t hid_key_mapping_presentation = {
75 LANG_PRESENTATION,
76 HID_USAGE_PAGE_KEYBOARD_KEYPAD,
77 {
78 /* Slideshow start */
79 { ACTION_USB_HID_START, HID_KEYBOARD_F5 },
80 /* Slideshow leave */
81 { ACTION_USB_HID_QUIT, HID_KEYBOARD_ESCAPE },
82 /* Slide previous */
83 { ACTION_USB_HID_LEFT, HID_KEYBOARD_P },
84 /* Slide next */
85 { ACTION_USB_HID_RIGHT, HID_KEYBOARD_N },
86 /* Slide first */
87 { ACTION_USB_HID_LEFT_LONG, HID_KEYBOARD_HOME },
88 /* Slide Last */
89 { ACTION_USB_HID_RIGHT_LONG, HID_KEYBOARD_END },
90 /* Black screen */
91 { ACTION_USB_HID_MENU, HID_KEYBOARD_DOT },
92 /* White screen */
93 { ACTION_USB_HID_MENU_LONG, HID_KEYBOARD_COMMA },
94 /* Link previous */
95 { ACTION_USB_HID_DEC, SHIFT(HID_KEYBOARD_TAB) },
96 /* Link next */
97 { ACTION_USB_HID_INC, HID_KEYBOARD_TAB },
98 /* 'Mouse click' */
99 { ACTION_USB_HID_SELECT, HID_KEYBOARD_RETURN },
100 /* 'Mouse over' */
101 { ACTION_USB_HID_SELECT_LONG, SHIFT(HID_KEYBOARD_RETURN) },
102 { 0, 0 },
103 }
104};
105
106static const hid_key_mapping_t hid_key_mapping_browser = {
107 LANG_BROWSER,
108 HID_USAGE_PAGE_KEYBOARD_KEYPAD,
109 {
110 /* Scroll up */
111 { ACTION_USB_HID_DEC, HID_KEYBOARD_UP_ARROW },
112 /* Scroll down */
113 { ACTION_USB_HID_INC, HID_KEYBOARD_DOWN_ARROW },
114 /* Scroll page up */
115 { ACTION_USB_HID_START, HID_KEYBOARD_PAGE_UP },
116 /* Scroll page down */
117 { ACTION_USB_HID_MENU, HID_KEYBOARD_PAGE_DOWN },
118 /* Zoom in */
119 { ACTION_USB_HID_START_LONG, CTRL(HID_KEYPAD_PLUS) },
120 /* Zoom out */
121 { ACTION_USB_HID_MENU_LONG, CTRL(HID_KEYPAD_MINUS) },
122 /* Zoom reset */
123 { ACTION_USB_HID_SELECT_LONG, CTRL(HID_KEYPAD_0_AND_INSERT) },
124 /* Tab previous */
125 { ACTION_USB_HID_LEFT, CTRL(HID_KEYBOARD_PAGE_UP) },
126 /* Tab next */
127 { ACTION_USB_HID_RIGHT, CTRL(HID_KEYBOARD_PAGE_DOWN) },
128 /* Tab close */
129 { ACTION_USB_HID_QUIT_LONG, CTRL(HID_KEYBOARD_W) },
130 /* History back */
131 { ACTION_USB_HID_LEFT_LONG, ALT(HID_KEYBOARD_LEFT_ARROW) },
132 /* History forward */
133 { ACTION_USB_HID_RIGHT_LONG, ALT(HID_KEYBOARD_RIGHT_ARROW) },
134 /* Full-Screen */
135 { ACTION_USB_HID_SELECT, HID_KEYBOARD_F11 },
136 { 0, 0 },
137 }
138};
139
140#ifdef HAVE_USB_HID_MOUSE
141static const hid_key_mapping_t hid_key_mapping_mouse = {
142 LANG_MOUSE,
143 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
144 {
145 /* Mouse up */
146 { ACTION_USB_HID_MOUSE_UP, HID_MOUSE_UP },
147 { ACTION_USB_HID_MOUSE_UP_REP, HID_MOUSE_UP_REP },
148 { ACTION_USB_HID_MOUSE_LDRAG_UP, HID_MOUSE_LDRAG_UP },
149 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, HID_MOUSE_LDRAG_UP_REP },
150 { ACTION_USB_HID_MOUSE_RDRAG_UP, HID_MOUSE_RDRAG_UP },
151 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, HID_MOUSE_RDRAG_UP_REP },
152 /* Mouse down */
153 { ACTION_USB_HID_MOUSE_DOWN, HID_MOUSE_DOWN },
154 { ACTION_USB_HID_MOUSE_DOWN_REP, HID_MOUSE_DOWN_REP },
155 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, HID_MOUSE_LDRAG_DOWN },
156 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, HID_MOUSE_LDRAG_DOWN_REP },
157 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, HID_MOUSE_RDRAG_DOWN },
158 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, HID_MOUSE_RDRAG_DOWN_REP },
159 /* Mouse left */
160 { ACTION_USB_HID_MOUSE_LEFT, HID_MOUSE_LEFT },
161 { ACTION_USB_HID_MOUSE_LEFT_REP, HID_MOUSE_LEFT_REP },
162 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, HID_MOUSE_LDRAG_LEFT },
163 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, HID_MOUSE_LDRAG_LEFT_REP },
164 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, HID_MOUSE_RDRAG_LEFT },
165 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, HID_MOUSE_RDRAG_LEFT_REP },
166 /* Mouse right */
167 { ACTION_USB_HID_MOUSE_RIGHT, HID_MOUSE_RIGHT },
168 { ACTION_USB_HID_MOUSE_RIGHT_REP, HID_MOUSE_RIGHT_REP },
169 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, HID_MOUSE_LDRAG_RIGHT },
170 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, HID_MOUSE_LDRAG_RIGHT_REP },
171 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, HID_MOUSE_RDRAG_RIGHT },
172 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, HID_MOUSE_RDRAG_RIGHT_REP },
173 /* Mouse buttons */
174 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, HID_MOUSE_BUTTON_LEFT },
175 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, HID_MOUSE_BUTTON_LEFT_REL },
176 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, HID_MOUSE_BUTTON_RIGHT },
177 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, HID_MOUSE_BUTTON_RIGHT_REL },
178 /* Mouse wheel scroll up */
179 { ACTION_USB_HID_DEC, HID_MOUSE_SCROLL_UP },
180 /* Mouse wheel scroll down */
181 { ACTION_USB_HID_INC, HID_MOUSE_SCROLL_DOWN },
182 { 0, 0 },
183 }
184};
185
186#define USB_KEYPAD_MODE_MOUSE 3 /* Value of the mouse setting (hard-coded) */
187#endif /* HAVE_USB_HID_MOUSE */
188
189static const hid_key_mapping_t *hid_key_mappings[] =
190{
191 &hid_key_mapping_multimedia,
192 &hid_key_mapping_presentation,
193 &hid_key_mapping_browser,
194#ifdef HAVE_USB_HID_MOUSE
195 &hid_key_mapping_mouse,
196#endif
197};
198
199extern int usb_keypad_mode;
200
201int get_hid_usb_action(void)
202{
203 int action, context = CONTEXT_USB_HID;
204
205#ifdef HAVE_USB_HID_MOUSE
206 if (usb_keypad_mode == USB_KEYPAD_MODE_MOUSE)
207 context = CONTEXT_USB_HID_MOUSE;
208#endif
209
210 action = get_action(context, HZ/4);
211 /* Skip key mappings in a cyclic way */
212 if (action == ACTION_USB_HID_MODE)
213 {
214 usb_keypad_mode = (usb_keypad_mode + 1) % NUM_KEY_MAPPINGS;
215 }
216 else if (action == ACTION_USB_HID_MODE_LONG)
217 {
218 usb_keypad_mode = (usb_keypad_mode - 1) % NUM_KEY_MAPPINGS;
219 }
220 else if (action > ACTION_USB_HID_FIRST && action < ACTION_USB_HID_LAST)
221 {
222 const mapping_t *mapping;
223 const hid_key_mapping_t *key_mapping =
224 hid_key_mappings[usb_keypad_mode];
225
226 for (mapping = key_mapping->mapping; mapping->action; mapping++)
227 {
228 if (action == mapping->action)
229 {
230 logf("Action %d", action);
231 usb_hid_send(key_mapping->usage_page, mapping->id);
232 break;
233 }
234 }
235#ifdef DEBUG
236 if (!mapping->action)
237 logf("Action %d not found", action);
238#endif
239 }
240
241 return action;
242}
243
244int keypad_mode_name_get(void)
245{
246 return hid_key_mappings[usb_keypad_mode]->lang_name;
247}
248
249#endif
diff --git a/apps/usb_keymaps.h b/apps/usb_keymaps.h
new file mode 100644
index 0000000000..8b08bfda2d
--- /dev/null
+++ b/apps/usb_keymaps.h
@@ -0,0 +1,28 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Tomer Shalev
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#ifndef _USB_KEYMAPS_H_
22#define _USB_KEYMAPS_H_
23
24int get_hid_usb_action(void);
25
26int keypad_mode_name_get(void);
27
28#endif
diff --git a/firmware/export/config-c200.h b/firmware/export/config-c200.h
index 654ac7b9cf..ab70396eef 100644
--- a/firmware/export/config-c200.h
+++ b/firmware/export/config-c200.h
@@ -190,6 +190,7 @@
190#define USE_ROCKBOX_USB 190#define USE_ROCKBOX_USB
191#define USB_VENDOR_ID 0x0781 191#define USB_VENDOR_ID 0x0781
192#define USB_PRODUCT_ID 0x7451 192#define USB_PRODUCT_ID 0x7451
193#define HAVE_USB_HID_MOUSE
193 194
194/* Define this if you have adjustable CPU frequency */ 195/* Define this if you have adjustable CPU frequency */
195#define HAVE_ADJUSTABLE_CPU_FREQ 196#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-e200.h b/firmware/export/config-e200.h
index 8b7e0d68b2..18de2f65f1 100644
--- a/firmware/export/config-e200.h
+++ b/firmware/export/config-e200.h
@@ -184,7 +184,7 @@
184#define USE_ROCKBOX_USB 184#define USE_ROCKBOX_USB
185#define USB_VENDOR_ID 0x0781 185#define USB_VENDOR_ID 0x0781
186#define USB_PRODUCT_ID 0x7421 186#define USB_PRODUCT_ID 0x7421
187 187#define HAVE_USB_HID_MOUSE
188 188
189/* Define this if you have adjustable CPU frequency */ 189/* Define this if you have adjustable CPU frequency */
190#define HAVE_ADJUSTABLE_CPU_FREQ 190#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-gigabeat-s.h b/firmware/export/config-gigabeat-s.h
index 3f001af737..ae57825388 100644
--- a/firmware/export/config-gigabeat-s.h
+++ b/firmware/export/config-gigabeat-s.h
@@ -187,6 +187,7 @@
187#define USB_PORTSCX_PHY_TYPE PORTSCX_PTS_ULPI 187#define USB_PORTSCX_PHY_TYPE PORTSCX_PTS_ULPI
188#define USB_VENDOR_ID 0x0930 188#define USB_VENDOR_ID 0x0930
189#define USB_PRODUCT_ID 0x0010 189#define USB_PRODUCT_ID 0x0010
190#define HAVE_USB_HID_MOUSE
190 191
191/* Define this if you have ATA power-off control */ 192/* Define this if you have ATA power-off control */
192#define HAVE_ATA_POWER_OFF 193#define HAVE_ATA_POWER_OFF
diff --git a/firmware/export/config-hdd1630.h b/firmware/export/config-hdd1630.h
index 05450e01c2..1d7bff3ee6 100755
--- a/firmware/export/config-hdd1630.h
+++ b/firmware/export/config-hdd1630.h
@@ -187,6 +187,7 @@
187#define USE_ROCKBOX_USB 187#define USE_ROCKBOX_USB
188#define USB_VENDOR_ID 0x0471 188#define USB_VENDOR_ID 0x0471
189#define USB_PRODUCT_ID 0x014C 189#define USB_PRODUCT_ID 0x014C
190#define HAVE_USB_HID_MOUSE
190 191
191/* Define this if you have adjustable CPU frequency */ 192/* Define this if you have adjustable CPU frequency */
192#define HAVE_ADJUSTABLE_CPU_FREQ 193#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-ipod4g.h b/firmware/export/config-ipod4g.h
index 6c08e7533e..232e0aa5a3 100644
--- a/firmware/export/config-ipod4g.h
+++ b/firmware/export/config-ipod4g.h
@@ -183,6 +183,7 @@
183#define USE_ROCKBOX_USB 183#define USE_ROCKBOX_USB
184#define USB_VENDOR_ID 0x05ac 184#define USB_VENDOR_ID 0x05ac
185#define USB_PRODUCT_ID 0x1203 185#define USB_PRODUCT_ID 0x1203
186#define HAVE_USB_HID_MOUSE
186 187
187/* Virtual LED (icon) */ 188/* Virtual LED (icon) */
188#define CONFIG_LED LED_VIRTUAL 189#define CONFIG_LED LED_VIRTUAL
diff --git a/firmware/export/config-ipodcolor.h b/firmware/export/config-ipodcolor.h
index ea02b90964..3254c0abfb 100644
--- a/firmware/export/config-ipodcolor.h
+++ b/firmware/export/config-ipodcolor.h
@@ -160,6 +160,7 @@
160#define USE_ROCKBOX_USB 160#define USE_ROCKBOX_USB
161#define USB_VENDOR_ID 0x05ac 161#define USB_VENDOR_ID 0x05ac
162#define USB_PRODUCT_ID 0x1204 162#define USB_PRODUCT_ID 0x1204
163#define HAVE_USB_HID_MOUSE
163 164
164/* Define this if you have adjustable CPU frequency */ 165/* Define this if you have adjustable CPU frequency */
165#define HAVE_ADJUSTABLE_CPU_FREQ 166#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-ipodmini.h b/firmware/export/config-ipodmini.h
index 9036adcc46..9cf377f99a 100644
--- a/firmware/export/config-ipodmini.h
+++ b/firmware/export/config-ipodmini.h
@@ -179,6 +179,7 @@
179#define USE_ROCKBOX_USB 179#define USE_ROCKBOX_USB
180#define USB_VENDOR_ID 0x05ac 180#define USB_VENDOR_ID 0x05ac
181#define USB_PRODUCT_ID 0x1205 181#define USB_PRODUCT_ID 0x1205
182#define HAVE_USB_HID_MOUSE
182 183
183/* Define this if you have adjustable CPU frequency */ 184/* Define this if you have adjustable CPU frequency */
184#define HAVE_ADJUSTABLE_CPU_FREQ 185#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-ipodmini2g.h b/firmware/export/config-ipodmini2g.h
index b69810e198..dcd3113d77 100644
--- a/firmware/export/config-ipodmini2g.h
+++ b/firmware/export/config-ipodmini2g.h
@@ -186,6 +186,7 @@
186#define USE_ROCKBOX_USB 186#define USE_ROCKBOX_USB
187#define USB_VENDOR_ID 0x05ac 187#define USB_VENDOR_ID 0x05ac
188#define USB_PRODUCT_ID 0x1205 188#define USB_PRODUCT_ID 0x1205
189#define HAVE_USB_HID_MOUSE
189 190
190/* Define this if you have adjustable CPU frequency */ 191/* Define this if you have adjustable CPU frequency */
191#define HAVE_ADJUSTABLE_CPU_FREQ 192#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-ipodnano.h b/firmware/export/config-ipodnano.h
index 31108091b9..005d2ffd9c 100644
--- a/firmware/export/config-ipodnano.h
+++ b/firmware/export/config-ipodnano.h
@@ -170,6 +170,7 @@
170#define USE_ROCKBOX_USB 170#define USE_ROCKBOX_USB
171#define USB_VENDOR_ID 0x05ac 171#define USB_VENDOR_ID 0x05ac
172#define USB_PRODUCT_ID 0x120a 172#define USB_PRODUCT_ID 0x120a
173#define HAVE_USB_HID_MOUSE
173 174
174/* Define this if you have adjustable CPU frequency */ 175/* Define this if you have adjustable CPU frequency */
175#define HAVE_ADJUSTABLE_CPU_FREQ 176#define HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/firmware/export/config-ipodvideo.h b/firmware/export/config-ipodvideo.h
index bd93f8fb36..f760a5656f 100644
--- a/firmware/export/config-ipodvideo.h
+++ b/firmware/export/config-ipodvideo.h
@@ -194,6 +194,7 @@
194#define USE_ROCKBOX_USB 194#define USE_ROCKBOX_USB
195#define USB_VENDOR_ID 0x05ac 195#define USB_VENDOR_ID 0x05ac
196#define USB_PRODUCT_ID 0x1209 196#define USB_PRODUCT_ID 0x1209
197#define HAVE_USB_HID_MOUSE
197 198
198/* Virtual LED (icon) */ 199/* Virtual LED (icon) */
199#define CONFIG_LED LED_VIRTUAL 200#define CONFIG_LED LED_VIRTUAL
diff --git a/firmware/export/config-sa9200.h b/firmware/export/config-sa9200.h
index 7af50b5145..2ab538e98c 100755
--- a/firmware/export/config-sa9200.h
+++ b/firmware/export/config-sa9200.h
@@ -171,6 +171,7 @@
171#define USE_ROCKBOX_USB 171#define USE_ROCKBOX_USB
172#define USB_VENDOR_ID 0x0471 172#define USB_VENDOR_ID 0x0471
173#define USB_PRODUCT_ID 0x014f 173#define USB_PRODUCT_ID 0x014f
174#define HAVE_USB_HID_MOUSE
174 175
175/* WARNING! Enable Rockbox USB mass storage. */ 176/* WARNING! Enable Rockbox USB mass storage. */
176#ifndef BOOTLOADER 177#ifndef BOOTLOADER
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index d45c0efc90..7321d3e565 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -43,7 +43,7 @@
43#include "usb_charging_only.h" 43#include "usb_charging_only.h"
44#endif 44#endif
45 45
46#if defined(USB_ENABLE_HID) 46#ifdef USB_ENABLE_HID
47#include "usb_hid.h" 47#include "usb_hid.h"
48#endif 48#endif
49 49
diff --git a/firmware/usbstack/usb_hid.c b/firmware/usbstack/usb_hid.c
index 4eb25841bb..4e9795b210 100644
--- a/firmware/usbstack/usb_hid.c
+++ b/firmware/usbstack/usb_hid.c
@@ -28,11 +28,6 @@
28//#define LOGF_ENABLE 28//#define LOGF_ENABLE
29#include "logf.h" 29#include "logf.h"
30 30
31#define CONCAT(low, high) ((high << 8) | low)
32#define PACK_VAL1(dest, val) *(dest)++ = (val) & 0xff
33#define PACK_VAL2(dest, val) PACK_VAL1((dest), (val)); \
34 PACK_VAL1((dest), (val >> 8))
35
36/* Documents avaiable here: http://www.usb.org/developers/devclass_docs/ */ 31/* Documents avaiable here: http://www.usb.org/developers/devclass_docs/ */
37 32
38#define HID_VER 0x0110 /* 1.1 */ 33#define HID_VER 0x0110 /* 1.1 */
@@ -47,6 +42,7 @@
47#define INPUT 0x80 42#define INPUT 0x80
48#define OUTPUT 0x90 43#define OUTPUT 0x90
49#define COLLECTION 0xA0 44#define COLLECTION 0xA0
45#define COLLECTION_PHYSICAL 0x00
50#define COLLECTION_APPLICATION 0x01 46#define COLLECTION_APPLICATION 0x01
51#define END_COLLECTION 0xC0 47#define END_COLLECTION 0xC0
52/* Parts (HID1_11.pdf, page 40) */ 48/* Parts (HID1_11.pdf, page 40) */
@@ -90,24 +86,30 @@
90 86
91#define HID_BUF_SIZE_MSG 16 87#define HID_BUF_SIZE_MSG 16
92#define HID_BUF_SIZE_CMD 16 88#define HID_BUF_SIZE_CMD 16
93#define HID_BUF_SIZE_REPORT 96 89#define HID_BUF_SIZE_REPORT 160
94#define HID_NUM_BUFFERS 5 90#define HID_NUM_BUFFERS 5
95#define SET_REPORT_BUF_LEN 2 91#define SET_REPORT_BUF_LEN 2
96 92
93//#ifdef LOGF_ENABLE
97#ifdef LOGF_ENABLE 94#ifdef LOGF_ENABLE
95
98#define BUF_DUMP_BUF_LEN HID_BUF_SIZE_REPORT 96#define BUF_DUMP_BUF_LEN HID_BUF_SIZE_REPORT
99#define BUF_DUMP_PREFIX_SIZE 5 97#define BUF_DUMP_PREFIX_SIZE 5
100#define BUF_DUMP_LINE_SIZE (MAX_LOGF_ENTRY - BUF_DUMP_PREFIX_SIZE) 98#define BUF_DUMP_ITEMS_IN_LINE 8
101#define BUF_DUMP_ITEMS_IN_LINE (BUF_DUMP_LINE_SIZE / 3) 99#define BUF_DUMP_LINE_SIZE (BUF_DUMP_ITEMS_IN_LINE * 3)
102#define BUF_DUMP_NUM_LINES (BUF_DUMP_BUF_LEN / (BUF_DUMP_LINE_SIZE / 3)) 100#define BUF_DUMP_NUM_LINES (BUF_DUMP_BUF_LEN / BUF_DUMP_ITEMS_IN_LINE)
103#endif 101#endif
104 102
105#define HID_BUF_INC(i) do { (i) = ((i) + 1) % HID_NUM_BUFFERS; } while (0) 103#define HID_BUF_INC(i) do { (i) = ((i) + 1) % HID_NUM_BUFFERS; } while (0)
104#define PACK_VAL(dest, val) *(dest)++ = (val) & 0xff
106 105
107typedef enum 106typedef enum
108{ 107{
109 REPORT_ID_KEYBOARD = 1, 108 REPORT_ID_KEYBOARD = 1,
110 REPORT_ID_CONSUMER, 109 REPORT_ID_CONSUMER,
110#ifdef HAVE_USB_HID_MOUSE
111 REPORT_ID_MOUSE,
112#endif
111 REPORT_ID_COUNT, 113 REPORT_ID_COUNT,
112} report_id_t; 114} report_id_t;
113 115
@@ -164,6 +166,7 @@ typedef struct
164 /* Write the id into the buffer in the appropriate location, and returns the 166 /* Write the id into the buffer in the appropriate location, and returns the
165 * buffer length */ 167 * buffer length */
166 uint8_t (*buf_set)(unsigned char *buf, int id); 168 uint8_t (*buf_set)(unsigned char *buf, int id);
169 bool is_key_released;
167} usb_hid_report_t; 170} usb_hid_report_t;
168 171
169usb_hid_report_t usb_hid_reports[REPORT_ID_COUNT]; 172usb_hid_report_t usb_hid_reports[REPORT_ID_COUNT];
@@ -183,7 +186,7 @@ static int usb_interface;
183 186
184static void usb_hid_try_send_drv(void); 187static void usb_hid_try_send_drv(void);
185 188
186static void pack_parameter(unsigned char **dest, bool is_signed, 189static void pack_parameter(unsigned char **dest, bool is_signed, bool mark_size,
187 uint8_t parameter, uint32_t value) 190 uint8_t parameter, uint32_t value)
188{ 191{
189 uint8_t size_value = 1; /* # of bytes */ 192 uint8_t size_value = 1; /* # of bytes */
@@ -216,7 +219,7 @@ static void pack_parameter(unsigned char **dest, bool is_signed,
216 size_value++; 219 size_value++;
217 } 220 }
218 221
219 **dest = parameter | size_value; 222 **dest = parameter | (mark_size ? size_value : 0);
220 (*dest)++; 223 (*dest)++;
221 224
222 while (size_value--) 225 while (size_value--)
@@ -244,11 +247,10 @@ int usb_hid_set_first_interface(int interface)
244} 247}
245 248
246#ifdef LOGF_ENABLE 249#ifdef LOGF_ENABLE
247static unsigned char 250static unsigned char buf_dump_ar[BUF_DUMP_NUM_LINES][BUF_DUMP_LINE_SIZE + 1]
248 buf_dump_ar[BUF_DUMP_NUM_LINES][BUF_DUMP_LINE_SIZE + 1]
249 USB_DEVBSS_ATTR __attribute__((aligned(32))); 251 USB_DEVBSS_ATTR __attribute__((aligned(32)));
250 252
251void buf_dump(unsigned char *buf, size_t size) 253void buf_dump(unsigned char *buf, size_t size, char *msg)
252{ 254{
253 size_t i; 255 size_t i;
254 int line; 256 int line;
@@ -269,7 +271,7 @@ void buf_dump(unsigned char *buf, size_t size)
269 *b = 0; 271 *b = 0;
270 272
271 /* Prefix must be of len BUF_DUMP_PREFIX_SIZE */ 273 /* Prefix must be of len BUF_DUMP_PREFIX_SIZE */
272 logf("%03d: %s", i0, buf_dump_ar[line]); 274 logf("%03d: %s %s", i0, buf_dump_ar[line], msg);
273 } 275 }
274} 276}
275#else 277#else
@@ -277,26 +279,178 @@ void buf_dump(unsigned char *buf, size_t size)
277#define buf_dump(...) 279#define buf_dump(...)
278#endif 280#endif
279 281
282#define BUF_LEN_KEYBOARD 7
280static uint8_t buf_set_keyboard(unsigned char *buf, int id) 283static uint8_t buf_set_keyboard(unsigned char *buf, int id)
281{ 284{
282 memset(buf, 0, 7); 285 memset(buf, 0, BUF_LEN_KEYBOARD);
286 int key, i = 1;
283 287
284 if (HID_KEYBOARD_LEFT_CONTROL <= id && id <= HID_KEYBOARD_RIGHT_GUI) 288 /* Each key is a word in id (up to 4 keys supported) */
285 buf[0] = (1 << (id - HID_KEYBOARD_LEFT_CONTROL)); 289 while ((key = id & 0xff))
286 else 290 {
287 buf[1] = (uint8_t)id; 291 /* Each modifier key is a bit in the first byte */
292 if (HID_KEYBOARD_LEFT_CONTROL <= key && key <= HID_KEYBOARD_RIGHT_GUI)
293 buf[0] |= (1 << (key - HID_KEYBOARD_LEFT_CONTROL));
294 else /* Any other key should be set in a separate byte */
295 buf[i++] = (uint8_t)key;
288 296
289 return 7; 297 id >>= 8;
298 }
299
300 return BUF_LEN_KEYBOARD;
290} 301}
291 302
303#define BUF_LEN_CONSUMER 4
292static uint8_t buf_set_consumer(unsigned char *buf, int id) 304static uint8_t buf_set_consumer(unsigned char *buf, int id)
293{ 305{
294 memset(buf, 0, 4); 306 memset(buf, 0, BUF_LEN_CONSUMER);
295 buf[0] = (uint8_t)id; 307 buf[0] = (uint8_t)id;
296 308
297 return 4; 309 return BUF_LEN_CONSUMER;
298} 310}
299 311
312#ifdef HAVE_USB_HID_MOUSE
313#define MOUSE_WHEEL_STEP 1
314#define MOUSE_STEP 8
315#define MOUSE_BUTTON_LEFT 0x1
316#define MOUSE_BUTTON_RIGHT 0x2
317//#define MOUSE_BUTTON_MIDDLE 0x4
318#define MOUSE_BUTTON 0
319#define MOUSE_X 1
320#define MOUSE_Y 2
321#define MOUSE_WHEEL 3
322#define BUF_LEN_MOUSE 4
323#define MOUSE_ACCEL_FACTOR(count) ((count) / 2)
324#define MOUSE_DO(item, step) (buf[(item)] = ((uint8_t)(step)))
325
326static uint8_t buf_set_mouse(unsigned char *buf, int id)
327{
328 static int count = 0;
329 int step = MOUSE_STEP;
330
331 memset(buf, 0, BUF_LEN_MOUSE);
332
333 /* Set proper button */
334 switch (id)
335 {
336 case HID_MOUSE_BUTTON_LEFT:
337 case HID_MOUSE_LDRAG_UP:
338 case HID_MOUSE_LDRAG_UP_REP:
339 case HID_MOUSE_LDRAG_DOWN:
340 case HID_MOUSE_LDRAG_DOWN_REP:
341 case HID_MOUSE_LDRAG_LEFT:
342 case HID_MOUSE_LDRAG_LEFT_REP:
343 case HID_MOUSE_LDRAG_RIGHT:
344 case HID_MOUSE_LDRAG_RIGHT_REP:
345 MOUSE_DO(MOUSE_BUTTON, MOUSE_BUTTON_LEFT);
346 break;
347 case HID_MOUSE_BUTTON_RIGHT:
348 case HID_MOUSE_RDRAG_UP:
349 case HID_MOUSE_RDRAG_UP_REP:
350 case HID_MOUSE_RDRAG_DOWN:
351 case HID_MOUSE_RDRAG_DOWN_REP:
352 case HID_MOUSE_RDRAG_LEFT:
353 case HID_MOUSE_RDRAG_LEFT_REP:
354 case HID_MOUSE_RDRAG_RIGHT:
355 case HID_MOUSE_RDRAG_RIGHT_REP:
356 MOUSE_DO(MOUSE_BUTTON, MOUSE_BUTTON_RIGHT);
357 break;
358 case HID_MOUSE_BUTTON_LEFT_REL:
359 case HID_MOUSE_BUTTON_RIGHT_REL:
360 /* Keep buf empty, to mark mouse button release */
361 break;
362 default:
363 break;
364 }
365
366 /* Handle mouse accelarated movement */
367 switch (id)
368 {
369 case HID_MOUSE_UP:
370 case HID_MOUSE_DOWN:
371 case HID_MOUSE_LEFT:
372 case HID_MOUSE_RIGHT:
373 case HID_MOUSE_LDRAG_UP:
374 case HID_MOUSE_LDRAG_DOWN:
375 case HID_MOUSE_LDRAG_LEFT:
376 case HID_MOUSE_LDRAG_RIGHT:
377 case HID_MOUSE_RDRAG_UP:
378 case HID_MOUSE_RDRAG_DOWN:
379 case HID_MOUSE_RDRAG_LEFT:
380 case HID_MOUSE_RDRAG_RIGHT:
381 count = 0;
382 break;
383 case HID_MOUSE_UP_REP:
384 case HID_MOUSE_DOWN_REP:
385 case HID_MOUSE_LEFT_REP:
386 case HID_MOUSE_RIGHT_REP:
387 case HID_MOUSE_LDRAG_UP_REP:
388 case HID_MOUSE_LDRAG_DOWN_REP:
389 case HID_MOUSE_LDRAG_LEFT_REP:
390 case HID_MOUSE_LDRAG_RIGHT_REP:
391 case HID_MOUSE_RDRAG_UP_REP:
392 case HID_MOUSE_RDRAG_DOWN_REP:
393 case HID_MOUSE_RDRAG_LEFT_REP:
394 case HID_MOUSE_RDRAG_RIGHT_REP:
395 count++;
396 /* TODO: Find a better mouse accellaration algorithm */
397 step *= 1 + MOUSE_ACCEL_FACTOR(count);
398 if (step > 255)
399 step = 255;
400 break;
401 default:
402 break;
403 }
404
405 /* Move/scroll mouse */
406 switch (id)
407 {
408 case HID_MOUSE_UP:
409 case HID_MOUSE_UP_REP:
410 case HID_MOUSE_LDRAG_UP:
411 case HID_MOUSE_LDRAG_UP_REP:
412 case HID_MOUSE_RDRAG_UP:
413 case HID_MOUSE_RDRAG_UP_REP:
414 MOUSE_DO(MOUSE_Y, -step);
415 break;
416 case HID_MOUSE_DOWN:
417 case HID_MOUSE_DOWN_REP:
418 case HID_MOUSE_LDRAG_DOWN:
419 case HID_MOUSE_LDRAG_DOWN_REP:
420 case HID_MOUSE_RDRAG_DOWN:
421 case HID_MOUSE_RDRAG_DOWN_REP:
422 MOUSE_DO(MOUSE_Y, step);
423 break;
424 case HID_MOUSE_LEFT:
425 case HID_MOUSE_LEFT_REP:
426 case HID_MOUSE_LDRAG_LEFT:
427 case HID_MOUSE_LDRAG_LEFT_REP:
428 case HID_MOUSE_RDRAG_LEFT:
429 case HID_MOUSE_RDRAG_LEFT_REP:
430 MOUSE_DO(MOUSE_X, -step);
431 break;
432 case HID_MOUSE_RIGHT:
433 case HID_MOUSE_RIGHT_REP:
434 case HID_MOUSE_LDRAG_RIGHT:
435 case HID_MOUSE_LDRAG_RIGHT_REP:
436 case HID_MOUSE_RDRAG_RIGHT:
437 case HID_MOUSE_RDRAG_RIGHT_REP:
438 MOUSE_DO(MOUSE_X, step);
439 break;
440 case HID_MOUSE_SCROLL_UP:
441 MOUSE_DO(MOUSE_WHEEL, MOUSE_WHEEL_STEP);
442 break;
443 case HID_MOUSE_SCROLL_DOWN:
444 MOUSE_DO(MOUSE_WHEEL, -MOUSE_WHEEL_STEP);
445 break;
446 default:
447 break;
448 }
449
450 return BUF_LEN_MOUSE;
451}
452#endif /* HAVE_USB_HID_MOUSE */
453
300static size_t descriptor_report_get(unsigned char *dest) 454static size_t descriptor_report_get(unsigned char *dest)
301{ 455{
302 unsigned char *report = dest; 456 unsigned char *report = dest;
@@ -306,59 +460,97 @@ static size_t descriptor_report_get(unsigned char *dest)
306 usb_hid_report = &usb_hid_reports[REPORT_ID_KEYBOARD]; 460 usb_hid_report = &usb_hid_reports[REPORT_ID_KEYBOARD];
307 usb_hid_report->usage_page = HID_USAGE_PAGE_KEYBOARD_KEYPAD; 461 usb_hid_report->usage_page = HID_USAGE_PAGE_KEYBOARD_KEYPAD;
308 usb_hid_report->buf_set = buf_set_keyboard; 462 usb_hid_report->buf_set = buf_set_keyboard;
463 usb_hid_report->is_key_released = 1;
309 464
310 pack_parameter(&report, 0, USAGE_PAGE, 465 pack_parameter(&report, 0, 1, USAGE_PAGE,
311 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS); 466 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS);
312 PACK_VAL2(report, CONCAT(CONSUMER_USAGE, HID_GENERIC_DESKTOP_KEYBOARD)); 467 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_KEYBOARD);
313 pack_parameter(&report, 0, COLLECTION, COLLECTION_APPLICATION); 468 pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION);
314 pack_parameter(&report, 0, REPORT_ID, REPORT_ID_KEYBOARD); 469 pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_KEYBOARD);
315 pack_parameter(&report, 0, USAGE_PAGE, HID_GENERIC_DESKTOP_KEYPAD); 470 pack_parameter(&report, 0, 1, USAGE_PAGE, HID_GENERIC_DESKTOP_KEYPAD);
316 pack_parameter(&report, 0, USAGE_MINIMUM, HID_KEYBOARD_LEFT_CONTROL); 471 pack_parameter(&report, 0, 1, USAGE_MINIMUM, HID_KEYBOARD_LEFT_CONTROL);
317 pack_parameter(&report, 0, USAGE_MAXIMUM, HID_KEYBOARD_RIGHT_GUI); 472 pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_KEYBOARD_RIGHT_GUI);
318 pack_parameter(&report, 1, LOGICAL_MINIMUM, 0); 473 pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0);
319 pack_parameter(&report, 1, LOGICAL_MAXIMUM, 1); 474 pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 1);
320 pack_parameter(&report, 0, REPORT_SIZE, 1); 475 pack_parameter(&report, 0, 1, REPORT_SIZE, 1);
321 pack_parameter(&report, 0, REPORT_COUNT, 8); 476 pack_parameter(&report, 0, 1, REPORT_COUNT, 8);
322 pack_parameter(&report, 0, INPUT, MAIN_ITEM_VARIABLE); 477 pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE);
323 pack_parameter(&report, 0, REPORT_SIZE, 1); 478 pack_parameter(&report, 0, 1, REPORT_SIZE, 1);
324 pack_parameter(&report, 0, REPORT_COUNT, 5); 479 pack_parameter(&report, 0, 1, REPORT_COUNT, 5);
325 pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_LEDS); 480 pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_LEDS);
326 pack_parameter(&report, 0, USAGE_MINIMUM, HID_LED_NUM_LOCK); 481 pack_parameter(&report, 0, 1, USAGE_MINIMUM, HID_LED_NUM_LOCK);
327 pack_parameter(&report, 0, USAGE_MAXIMUM, HID_LED_KANA); 482 pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_LED_KANA);
328 pack_parameter(&report, 0, OUTPUT, MAIN_ITEM_VARIABLE); 483 pack_parameter(&report, 0, 1, OUTPUT, MAIN_ITEM_VARIABLE);
329 pack_parameter(&report, 0, REPORT_SIZE, 3); 484 pack_parameter(&report, 0, 1, REPORT_SIZE, 3);
330 pack_parameter(&report, 0, REPORT_COUNT, 1); 485 pack_parameter(&report, 0, 1, REPORT_COUNT, 1);
331 pack_parameter(&report, 0, OUTPUT, MAIN_ITEM_CONSTANT); 486 pack_parameter(&report, 0, 1, OUTPUT, MAIN_ITEM_CONSTANT);
332 pack_parameter(&report, 0, REPORT_SIZE, 8); 487 pack_parameter(&report, 0, 1, REPORT_SIZE, 8);
333 pack_parameter(&report, 0, REPORT_COUNT, 6); 488 pack_parameter(&report, 0, 1, REPORT_COUNT, 6);
334 pack_parameter(&report, 1, LOGICAL_MINIMUM, 0); 489 pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0);
335 pack_parameter(&report, 1, LOGICAL_MAXIMUM, HID_KEYBOARD_EX_SEL); 490 pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, HID_KEYBOARD_EX_SEL);
336 pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_KEYBOARD_KEYPAD); 491 pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_KEYBOARD_KEYPAD);
337 pack_parameter(&report, 0, USAGE_MINIMUM, 0); 492 pack_parameter(&report, 0, 1, USAGE_MINIMUM, 0);
338 pack_parameter(&report, 0, USAGE_MAXIMUM, HID_KEYBOARD_EX_SEL); 493 pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_KEYBOARD_EX_SEL);
339 pack_parameter(&report, 0, INPUT, 0); 494 pack_parameter(&report, 0, 1, INPUT, 0);
340 PACK_VAL1(report, END_COLLECTION); 495 PACK_VAL(report, END_COLLECTION);
341 496
342 /* Consumer usage controls - play/pause, stop, etc. */ 497 /* Consumer usage controls - play/pause, stop, etc. */
343 usb_hid_report = &usb_hid_reports[REPORT_ID_CONSUMER]; 498 usb_hid_report = &usb_hid_reports[REPORT_ID_CONSUMER];
344 usb_hid_report->usage_page = HID_USAGE_PAGE_CONSUMER; 499 usb_hid_report->usage_page = HID_USAGE_PAGE_CONSUMER;
345 usb_hid_report->buf_set = buf_set_consumer; 500 usb_hid_report->buf_set = buf_set_consumer;
501 usb_hid_report->is_key_released = 1;
346 502
347 pack_parameter(&report, 0, USAGE_PAGE, HID_USAGE_PAGE_CONSUMER); 503 pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_CONSUMER);
348 PACK_VAL2(report, CONCAT(CONSUMER_USAGE, 504 pack_parameter(&report, 0, 0, CONSUMER_USAGE,
349 HID_CONSUMER_USAGE_CONSUMER_CONTROL));
350 pack_parameter(&report, 0, COLLECTION, COLLECTION_APPLICATION);
351 pack_parameter(&report, 0, REPORT_ID, REPORT_ID_CONSUMER);
352 pack_parameter(&report, 0, REPORT_SIZE, 16);
353 pack_parameter(&report, 0, REPORT_COUNT, 2);
354 pack_parameter(&report, 1, LOGICAL_MINIMUM, 1);
355 pack_parameter(&report, 1, LOGICAL_MAXIMUM, 652);
356 pack_parameter(&report, 0, USAGE_MINIMUM,
357 HID_CONSUMER_USAGE_CONSUMER_CONTROL); 505 HID_CONSUMER_USAGE_CONSUMER_CONTROL);
358 pack_parameter(&report, 0, USAGE_MAXIMUM, HID_CONSUMER_USAGE_AC_SEND); 506 pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION);
359 pack_parameter(&report, 0, INPUT, MAIN_ITEM_NO_PREFERRED | 507 pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_CONSUMER);
508 pack_parameter(&report, 0, 1, REPORT_SIZE, 16);
509 pack_parameter(&report, 0, 1, REPORT_COUNT, 2);
510 pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 1);
511 pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 652);
512 pack_parameter(&report, 0, 1, USAGE_MINIMUM,
513 HID_CONSUMER_USAGE_CONSUMER_CONTROL);
514 pack_parameter(&report, 0, 1, USAGE_MAXIMUM, HID_CONSUMER_USAGE_AC_SEND);
515 pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_NO_PREFERRED |
360 MAIN_ITEM_NULL_STATE); 516 MAIN_ITEM_NULL_STATE);
361 PACK_VAL1(report, END_COLLECTION); 517 PACK_VAL(report, END_COLLECTION);
518
519#ifdef HAVE_USB_HID_MOUSE
520 /* Mouse control */
521 usb_hid_report = &usb_hid_reports[REPORT_ID_MOUSE];
522 usb_hid_report->usage_page = HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS;
523 usb_hid_report->buf_set = buf_set_mouse;
524 usb_hid_report->is_key_released = 0;
525
526 pack_parameter(&report, 0, 1, USAGE_PAGE,
527 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS);
528 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_MOUSE);
529 pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_APPLICATION);
530 pack_parameter(&report, 0, 1, REPORT_ID, REPORT_ID_MOUSE);
531 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_POINTER);
532 pack_parameter(&report, 0, 1, COLLECTION, COLLECTION_PHYSICAL);
533 pack_parameter(&report, 0, 1, USAGE_PAGE, HID_USAGE_PAGE_BUTTON);
534 pack_parameter(&report, 0, 1, USAGE_MINIMUM, 1);
535 pack_parameter(&report, 0, 1, USAGE_MAXIMUM, 8);
536 pack_parameter(&report, 1, 1, LOGICAL_MINIMUM, 0);
537 pack_parameter(&report, 1, 1, LOGICAL_MAXIMUM, 1);
538 pack_parameter(&report, 0, 1, REPORT_SIZE, 1);
539 pack_parameter(&report, 0, 1, REPORT_COUNT, 8);
540 pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE);
541 pack_parameter(&report, 0, 1, USAGE_PAGE,
542 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS);
543 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_X);
544 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_Y);
545 pack_parameter(&report, 0, 0, CONSUMER_USAGE, HID_GENERIC_DESKTOP_WHEEL);
546 pack_parameter(&report, 0, 1, LOGICAL_MINIMUM, -127 & 0xFF);
547 pack_parameter(&report, 0, 1, LOGICAL_MAXIMUM, 127);
548 pack_parameter(&report, 0, 1, REPORT_SIZE, 8);
549 pack_parameter(&report, 0, 1, REPORT_COUNT, 3);
550 pack_parameter(&report, 0, 1, INPUT, MAIN_ITEM_VARIABLE | MAIN_ITEM_RELATIVE);
551 PACK_VAL(report, END_COLLECTION);
552 PACK_VAL(report, END_COLLECTION);
553#endif /* HAVE_USB_HID_MOUSE */
362 554
363 return (size_t)((uint32_t)report - (uint32_t)dest); 555 return (size_t)((uint32_t)report - (uint32_t)dest);
364} 556}
@@ -368,6 +560,9 @@ static void descriptor_hid_get(unsigned char **dest)
368 hid_descriptor.wDescriptorLength0 = 560 hid_descriptor.wDescriptorLength0 =
369 (uint16_t)descriptor_report_get(report_descriptor); 561 (uint16_t)descriptor_report_get(report_descriptor);
370 562
563 logf("hid: desc len %u", hid_descriptor.wDescriptorLength0);
564 buf_dump(report_descriptor, hid_descriptor.wDescriptorLength0, "desc");
565
371 PACK_DATA(*dest, hid_descriptor); 566 PACK_DATA(*dest, hid_descriptor);
372} 567}
373 568
@@ -457,8 +652,8 @@ void usb_hid_transfer_complete(int ep, int dir, int status, int length)
457 * to the DAP using the host's custom driver */ 652 * to the DAP using the host's custom driver */
458static int usb_hid_set_report(struct usb_ctrlrequest *req) 653static int usb_hid_set_report(struct usb_ctrlrequest *req)
459{ 654{
460 static unsigned char buf[SET_REPORT_BUF_LEN] 655 static unsigned char buf[SET_REPORT_BUF_LEN] USB_DEVBSS_ATTR
461 USB_DEVBSS_ATTR __attribute__((aligned(32))); 656 __attribute__((aligned(32)));
462 int length; 657 int length;
463 int rc = 0; 658 int rc = 0;
464 659
@@ -645,16 +840,22 @@ void usb_hid_send(usage_page_t usage_page, int id)
645 length = report->buf_set(&buf[1], id) + 1; 840 length = report->buf_set(&buf[1], id) + 1;
646 logf("length %u", length); 841 logf("length %u", length);
647 842
843 if (!length)
844 return;
845
648 /* Key pressed */ 846 /* Key pressed */
649 buf_dump(buf, length); 847 buf_dump(buf, length, "key press");
650 usb_hid_queue(buf, length); 848 usb_hid_queue(buf, length);
651 849
652 /* Key released */ 850 if (report->is_key_released)
653 memset(buf, 0, length); 851 {
654 buf[0] = report_id; 852 /* Key released */
853 memset(buf, 0, length);
854 buf[0] = report_id;
655 855
656 buf_dump(buf, length); 856 buf_dump(buf, length, "key release");
657 usb_hid_queue(buf, length); 857 usb_hid_queue(buf, length);
858 }
658 859
659 usb_hid_try_send_drv(); 860 usb_hid_try_send_drv();
660} 861}
diff --git a/firmware/usbstack/usb_hid_usage_tables.h b/firmware/usbstack/usb_hid_usage_tables.h
index 9b64cd0328..d23c704eae 100644
--- a/firmware/usbstack/usb_hid_usage_tables.h
+++ b/firmware/usbstack/usb_hid_usage_tables.h
@@ -701,5 +701,39 @@ typedef enum usage_page
701#define HID_CONSUMER_USAGE_AC_DISRIBUTE_HORIZONTALLY 0x29B 701#define HID_CONSUMER_USAGE_AC_DISRIBUTE_HORIZONTALLY 0x29B
702#define HID_CONSUMER_USAGE_AC_DISTRIBUTE_VERTICALLY 0x29C 702#define HID_CONSUMER_USAGE_AC_DISTRIBUTE_VERTICALLY 0x29C
703 703
704#endif 704#ifdef HAVE_USB_HID_MOUSE
705/* Mouse defines (custom made - Rockbox specific) */
706#define HID_MOUSE_NONE 0x00
707#define HID_MOUSE_UP 0x01
708#define HID_MOUSE_UP_REP 0x02
709#define HID_MOUSE_DOWN 0x03
710#define HID_MOUSE_DOWN_REP 0x04
711#define HID_MOUSE_LEFT 0x05
712#define HID_MOUSE_LEFT_REP 0x06
713#define HID_MOUSE_RIGHT 0x07
714#define HID_MOUSE_RIGHT_REP 0x08
715#define HID_MOUSE_LDRAG_UP 0x09
716#define HID_MOUSE_LDRAG_UP_REP 0x0A
717#define HID_MOUSE_LDRAG_DOWN 0x0B
718#define HID_MOUSE_LDRAG_DOWN_REP 0x0C
719#define HID_MOUSE_LDRAG_LEFT 0x0D
720#define HID_MOUSE_LDRAG_LEFT_REP 0x0E
721#define HID_MOUSE_LDRAG_RIGHT 0x0F
722#define HID_MOUSE_LDRAG_RIGHT_REP 0x10
723#define HID_MOUSE_RDRAG_UP 0x11
724#define HID_MOUSE_RDRAG_UP_REP 0x12
725#define HID_MOUSE_RDRAG_DOWN 0x13
726#define HID_MOUSE_RDRAG_DOWN_REP 0x14
727#define HID_MOUSE_RDRAG_LEFT 0x15
728#define HID_MOUSE_RDRAG_LEFT_REP 0x16
729#define HID_MOUSE_RDRAG_RIGHT 0x17
730#define HID_MOUSE_RDRAG_RIGHT_REP 0x18
731#define HID_MOUSE_SCROLL_UP 0x19
732#define HID_MOUSE_SCROLL_DOWN 0x1A
733#define HID_MOUSE_BUTTON_LEFT 0x1B
734#define HID_MOUSE_BUTTON_LEFT_REL 0x1C
735#define HID_MOUSE_BUTTON_RIGHT 0x1D
736#define HID_MOUSE_BUTTON_RIGHT_REL 0x1E
737#endif /* HAVE_USB_HID_MOUSE */
705 738
739#endif
diff --git a/manual/configure_rockbox/system_options.tex b/manual/configure_rockbox/system_options.tex
index 52c42e0ccf..be6e08ac81 100644
--- a/manual/configure_rockbox/system_options.tex
+++ b/manual/configure_rockbox/system_options.tex
@@ -182,3 +182,266 @@ this option \setting{On}. If it is not required, then turning this setting
182 Changes the brightness of the button lights. 182 Changes the brightness of the button lights.
183 } 183 }
184} 184}
185\opt{USB_ENABLE_HID}{
186 \subsection{USB keypad Mode}
187 This setting control the keypad mode when the \dap{} is attached to a
188 computer through USB. The \dap{} registers itself as a USB keyboard (in
189 addition to being identified as a mass-storage device). Pressing a button
190 on the \dap{} sends a keystroke the computer the \dap{} is attached to,
191 according to the mapping set by the keypad mode.
192 The \dap{}'s keys can be mapped in different sets (modes) to achieve
193 different functionality. The following modes are available:
194 \begin{description}
195
196 \item [Multimedia: ]This mode lets you control the volume, playback, and
197 skips tracks on the host computer. It is equivalent for the multimedia
198 keys found on top of some multimedia keyboards.
199 \begin{table}
200 \begin{btnmap}{}{}
201 \opt{SANSA_E200_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
202 {\ButtonScrollBack / \ButtonScrollFwd}
203 \opt{GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
204 {\ButtonVolUp / \ButtonVolDown}
205 \opt{IRIVER_H10_PAD}{\ButtonScrollUp / \ButtonScrollDown}
206 \opt{HAVEREMOTEKEYMAP}{
207 &
208 \opt{GIGABEAT_RC_PAD}{\ButtonRCVolUp / \ButtonRCVolDown}%
209 }
210 & Volume up / down, respectively \\
211 %
212 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD,IPOD_4G_PAD%
213 ,IPOD_3G_PAD,IPOD_1G2G_PAD}
214 {\ButtonSelect}
215 \opt{GIGABEAT_S_PAD}{\ButtonSelect; \ButtonBack}
216 \opt{IRIVER_H10_PAD}{\ButtonFF}
217 \opt{HAVEREMOTEKEYMAP}{
218 &
219 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCFF}%
220 }
221 & Volume mute \\
222 %
223 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}{\ButtonUp}
224 \opt{GIGABEAT_S_PAD,IRIVER_H10_PAD,IPOD_4G_PAD,IPOD_3G_PAD%
225 ,IPOD_1G2G_PAD}
226 {\ButtonPlay}
227 \opt{HAVEREMOTEKEYMAP}{
228 &
229 \opt{GIGABEAT_RC_PAD}{\ButtonRCPlay}%
230 }
231 & Play / Pause \\
232 %
233 \opt{SANSA_E200_PAD,SANSA_C200_PAD}{\ButtonPower}
234 \opt{GIGABEAT_S_PAD}{\ButtonMenu}
235 \opt{SANSA_CLIP_PAD}{\ButtonHome}
236 \opt{IRIVER_H10_PAD}{\ButtonRew}
237 \opt{IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}{Long \ButtonPlay}
238 \opt{HAVEREMOTEKEYMAP}{
239 &
240 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCPlay}%
241 }
242 & Stop \\
243 %
244 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD%
245 ,IRIVER_H10_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
246 {\ButtonLeft / \ButtonRight}
247 \opt{SANSA_E200_PAD}{\ButtonMenu}
248 \opt{HAVEREMOTEKEYMAP}{
249 &
250 \opt{GIGABEAT_RC_PAD}{\ButtonRCRew / \ButtonRCFF}%
251 }
252 & Scan previous / next track \\
253 \end{btnmap}
254 \end{table}
255
256 \item [Presentation: ]This mode lets you control a presentation program
257 (e.g. OpenOffice Impress, and some other popular application), making
258 the \dap{} a wired remote control device. This mode is can be useful
259 for lecturers who does not have a wireless remote control for this
260 purpose.
261 \begin{table}
262 \begin{btnmap}{}{}
263 \opt{SANSA_E200_PAD,SANSA_C200_PAD}{\ButtonUp / \ButtonPower}
264 \opt{GIGABEAT_S_PADIRIVER_H10_PAD}{\ButtonPlay / \ButtonMenu}
265 \opt{SANSA_CLIP_PAD}{\ButtonUp / \ButtonHome}
266 \opt{IRIVER_H10_PAD}{\ButtonPlay / \ButtonRew}
267 \opt{IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
268 {\ButtonPlay / Long \ButtonPlay}
269 \opt{HAVEREMOTEKEYMAP}{
270 &
271 \opt{GIGABEAT_RC_PAD}{\ButtonRCPlay / Long \ButtonRCPlay}%
272 }
273 & Slideshow start / leave, respectively \\
274 %
275 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD%
276 ,IRIVER_H10_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
277 {\ButtonLeft / \ButtonRight}
278 \opt{HAVEREMOTEKEYMAP}{
279 &
280 \opt{GIGABEAT_RC_PAD}{\ButtonRCRew / \ButtonRCFF}%
281 }
282 & Slide previous / next, respectively \\
283 %
284 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD%
285 ,IRIVER_H10_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
286 {Long \ButtonLeft / Long \ButtonRight}
287 \opt{HAVEREMOTEKEYMAP}{& }
288 & Slide first / last, respectively \\
289 %
290 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
291 {\ButtonDown}
292 \opt{IRIVER_H10_PAD}{\ButtonPower}
293 \opt{IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}{\ButtonMenu}
294 \opt{HAVEREMOTEKEYMAP}{& }
295 & Blank screen \\
296 %
297 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
298 {Long \ButtonDown}
299 \opt{HAVEREMOTEKEYMAP}{& }
300 & White screen \\
301 %
302 \opt{SANSA_E200_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
303 {\ButtonScrollBack / \ButtonScrollFwd}
304 \opt{GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
305 {\ButtonVolUp / \ButtonVolDown}
306 \opt{IRIVER_H10_PAD}{\ButtonScrollUp / \ButtonScrollDown}
307 \opt{HAVEREMOTEKEYMAP}{
308 &
309 \opt{GIGABEAT_RC_PAD}{\ButtonRCVolUp / \ButtonRCVolDown}%
310 }
311 & Previous / next link in slide, respectively \\
312 %
313 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD,IPOD_4G_PAD%
314 ,IPOD_3G_PAD,IPOD_1G2G_PAD}
315 {\ButtonSelect}
316 \opt{GIGABEAT_S_PAD}{\ButtonSelect; \ButtonBack}
317 \opt{IRIVER_H10_PAD}{\ButtonFF}
318 \opt{HAVEREMOTEKEYMAP}{
319 &
320 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCFF}%
321 }
322 & Perform a 'mouse click' over a link \\
323 %
324 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD,IPOD_4G_PAD%
325 ,IPOD_3G_PAD,IPOD_1G2G_PAD}
326 {Long \ButtonSelect}
327 \opt{GIGABEAT_S_PAD}{Long \ButtonSelect; Long \ButtonBack}
328 \opt{HAVEREMOTEKEYMAP}{
329 &
330 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCRew}%
331 }
332 & Perform a 'mouse over' over a link \\
333 \end{btnmap}
334 \end{table}
335
336 \item [Browser: ]This mode lets you control a web browser (e.g. Firefox).
337 It uses the \dap{}'s keys to navigate through the web page and
338 different tabs, navigate through history, and to control zoom.
339 \begin{table}
340 \begin{btnmap}{}{}
341 \opt{SANSA_E200_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
342 {\ButtonScrollBack / \ButtonScrollFwd}
343 \opt{GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
344 {\ButtonVolUp / \ButtonVolDown}
345 \opt{IRIVER_H10_PAD}{\ButtonScrollUp / \ButtonScrollDown}
346 \opt{HAVEREMOTEKEYMAP}{
347 &
348 \opt{GIGABEAT_RC_PAD}{\ButtonRCVolUp / \ButtonRCVolDown}%
349 }
350 & Scroll up / down, respectively \\
351 %
352 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
353 {\ButtonUp / \ButtonDown}
354 \opt{GIGABEAT_S_PAD}{\ButtonPlay / \ButtonDown}
355 \opt{IRIVER_H10_PAD}{\ButtonPlay / \ButtonPower}
356 \opt{IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
357 {\ButtonPlay / \ButtonMenu}
358 \opt{HAVEREMOTEKEYMAP}{
359 &
360 \opt{GIGABEAT_RC_PAD}{\ButtonRCPlay / Long \ButtonRCDsp}%
361 }
362 & Scroll page up / down, respectively \\
363 %
364 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
365 {Long \ButtonUp / Long \ButtonDown}
366 \opt{GIGABEAT_S_PAD}{Long \ButtonPlay / Long \ButtonPower}
367 \opt{HAVEREMOTEKEYMAP}{& }
368 & Zoom in / out, respectively \\
369 %
370 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
371 {Long \ButtonSelect}
372 \opt{GIGABEAT_S_PAD}{Long \ButtonSelect; Long \ButtonBack}
373 \opt{HAVEREMOTEKEYMAP}{
374 &
375 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCRew}%
376 }
377 & Zoom reset \\
378 %
379 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD%
380 ,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
381 {\ButtonLeft / \ButtonRight}
382 \opt{IRIVER_H10_PAD}{\ButtonRew / \ButtonFF}
383 \opt{HAVEREMOTEKEYMAP}{& }
384 & Tab previous / next, respectively \\
385 %
386 \opt{SANSA_E200_PAD,SANSA_C200_PAD}{Long \ButtonPower}
387 \opt{GIGABEAT_S_PAD}{Long \ButtonMenu}
388 \opt{SANSA_CLIP_PAD}{Long \ButtonHome}
389 \opt{HAVEREMOTEKEYMAP}{& }
390 & Tab close \\
391 %
392 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD%
393 ,IRIVER_H10_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
394 {Long \ButtonLeft / Long \ButtonRight}
395 \opt{HAVEREMOTEKEYMAP}{
396 &
397 \opt{GIGABEAT_RC_PAD}{\ButtonRCRew / \ButtonRCFF}%
398 }
399 & History back / forward \\
400 %
401 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD,IPOD_4G_PAD%
402 ,IPOD_3G_PAD,IPOD_1G2G_PAD}
403 {\ButtonSelect}
404 \opt{GIGABEAT_S_PAD}{Long \ButtonSelect; Long \ButtonBack}
405 \opt{IRIVER_H10_PAD}{\ButtonFF}
406 \opt{HAVEREMOTEKEYMAP}{
407 &
408 \opt{GIGABEAT_RC_PAD}{Long \ButtonRCRew}%
409 }
410 & View full screen toggle \\
411 \end{btnmap}
412 \end{table}
413
414 \item [Mouse: ]This mode emulates a mouse. Features supported: Mouse
415 movement; left and right button clicking; and dragging and dropping.
416 \begin{table}
417 \begin{btnmap}{}{}
418 \opt{SANSA_E200_PAD,GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
419 {\ButtonUp / \ButtonDown / \ButtonLeft / \ButtonRight}
420 \opt{IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
421 {\ButtonMenu / \ButtonPlay / \ButtonLeft / \ButtonRight}
422 \opt{HAVEREMOTEKEYMAP}{& }
423 & Move cursor up / down / left / right, respectively \\
424 %
425 \opt{SANSA_E200_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD,IPOD_4G_PAD%
426 ,IPOD_3G_PAD,IPOD_1G2G_PAD}
427 {\ButtonSelect}
428 \opt{GIGABEAT_S_PAD}{\ButtonSelect; \ButtonBack}
429 \opt{HAVEREMOTEKEYMAP}{& }
430 & Left mouse button click \\
431 %
432 \opt{SANSA_E200_PAD,SANSA_C200_PAD}{\ButtonPower}
433 \opt{GIGABEAT_S_PAD}{\ButtonMenu}
434 \opt{SANSA_CLIP_PAD}{\ButtonHome}
435 \opt{HAVEREMOTEKEYMAP}{& }
436 & Right mouse button click \\
437 %
438 \opt{SANSA_E200_PAD,IPOD_4G_PAD,IPOD_3G_PAD,IPOD_1G2G_PAD}
439 {\ButtonScrollBack / \ButtonScrollFwd}
440 \opt{GIGABEAT_S_PAD,SANSA_C200_PAD,SANSA_CLIP_PAD}
441 {\ButtonVolUp / \ButtonVolDown}
442 \opt{HAVEREMOTEKEYMAP}{& }
443 & Mouse wheel scroll up / down, respectively \\
444 \end{btnmap}
445 \end{table}
446 \end{description}
447}
diff --git a/manual/platform/c200.tex b/manual/platform/c200.tex
index 0c7473ee18..9b5c9b504d 100644
--- a/manual/platform/c200.tex
+++ b/manual/platform/c200.tex
@@ -5,6 +5,7 @@
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 6\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
7\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS} 7\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS}
8\edef\UseOption{\UseOption,USB_ENABLE_HID}
8\edef\UseOption{\UseOption,sansa} 9\edef\UseOption{\UseOption,sansa}
9 10
10\newcommand{\playerman}{Sansa} 11\newcommand{\playerman}{Sansa}
diff --git a/manual/platform/clip.tex b/manual/platform/clip.tex
index c6811b6316..f0cf719eb1 100644
--- a/manual/platform/clip.tex
+++ b/manual/platform/clip.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 4\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
5\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 5\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
6\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS} 6\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS}
7%\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,sansaAMS} 8\edef\UseOption{\UseOption,sansaAMS}
8 9
9\newcommand{\playerman}{Sansa} 10\newcommand{\playerman}{Sansa}
diff --git a/manual/platform/e200.tex b/manual/platform/e200.tex
index d20d34f2d7..ec10b59e3d 100644
--- a/manual/platform/e200.tex
+++ b/manual/platform/e200.tex
@@ -5,6 +5,7 @@
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 6\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
7\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS} 7\edef\UseOption{\UseOption,HAVE_BUTTON_LIGHTS}
8\edef\UseOption{\UseOption,USB_ENABLE_HID}
8\edef\UseOption{\UseOption,sansa} 9\edef\UseOption{\UseOption,sansa}
9 10
10\newcommand{\playerman}{Sansa} 11\newcommand{\playerman}{Sansa}
diff --git a/manual/platform/gigabeats.tex b/manual/platform/gigabeats.tex
index 920eb1789f..6a470db6ea 100644
--- a/manual/platform/gigabeats.tex
+++ b/manual/platform/gigabeats.tex
@@ -8,6 +8,7 @@
8\edef\UseOption{\UseOption,gigabeat} 8\edef\UseOption{\UseOption,gigabeat}
9\edef\UseOption{\UseOption,GIGABEAT_RC_PAD} 9\edef\UseOption{\UseOption,GIGABEAT_RC_PAD}
10\edef\UseOption{\UseOption,HAVEREMOTEKEYMAP} 10\edef\UseOption{\UseOption,HAVEREMOTEKEYMAP}
11\edef\UseOption{\UseOption,USB_ENABLE_HID}
11 12
12\newcommand{\playerman}{Toshiba} 13\newcommand{\playerman}{Toshiba}
13\newcommand{\playertype}{Gigabeat S Series} 14\newcommand{\playertype}{Gigabeat S Series}
diff --git a/manual/platform/h10.tex b/manual/platform/h10.tex
index 4b99b1ba51..406985deda 100644
--- a/manual/platform/h10.tex
+++ b/manual/platform/h10.tex
@@ -5,6 +5,7 @@
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
8\edef\UseOption{\UseOption,USB_ENABLE_HID}
8\edef\UseOption{\UseOption,iriver} 9\edef\UseOption{\UseOption,iriver}
9 10
10\newcommand{\playerman}{Iriver} 11\newcommand{\playerman}{Iriver}
diff --git a/manual/platform/h10_5gb.tex b/manual/platform/h10_5gb.tex
index d89e1eabcd..e338062538 100644
--- a/manual/platform/h10_5gb.tex
+++ b/manual/platform/h10_5gb.tex
@@ -5,6 +5,7 @@
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
8\edef\UseOption{\UseOption,USB_ENABLE_HID}
8\edef\UseOption{\UseOption,iriver} 9\edef\UseOption{\UseOption,iriver}
9 10
10\newcommand{\playerman}{Iriver} 11\newcommand{\playerman}{Iriver}
diff --git a/manual/platform/ipod1g2g.tex b/manual/platform/ipod1g2g.tex
index 28679a5025..d26ee2658e 100644
--- a/manual/platform/ipod1g2g.tex
+++ b/manual/platform/ipod1g2g.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,IPOD_3G_PAD} 4\edef\UseOption{\UseOption,IPOD_3G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,ipod} 8\edef\UseOption{\UseOption,ipod}
8 9
9\newcommand{\playerman}{Ipod} 10\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipod3g.tex b/manual/platform/ipod3g.tex
index 21ca69adbb..ed2420295c 100644
--- a/manual/platform/ipod3g.tex
+++ b/manual/platform/ipod3g.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,IPOD_3G_PAD} 4\edef\UseOption{\UseOption,IPOD_3G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,ipod} 8\edef\UseOption{\UseOption,ipod}
8 9
9\newcommand{\playerman}{Ipod} 10\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipod4g.tex b/manual/platform/ipod4g.tex
index 06483fa6e2..51f5a1f7bc 100644
--- a/manual/platform/ipod4g.tex
+++ b/manual/platform/ipod4g.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,IPOD_4G_PAD} 4\edef\UseOption{\UseOption,IPOD_4G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,ipod} 8\edef\UseOption{\UseOption,ipod}
8 9
9\newcommand{\playerman}{Ipod} 10\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipodcolor.tex b/manual/platform/ipodcolor.tex
index 04dc457a81..aed90897c8 100644
--- a/manual/platform/ipodcolor.tex
+++ b/manual/platform/ipodcolor.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,IPOD_4G_PAD} 4\edef\UseOption{\UseOption,IPOD_4G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,ipod} 8\edef\UseOption{\UseOption,ipod}
8 9
9\newcommand{\playerman}{Ipod} 10\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipodmini.tex b/manual/platform/ipodmini.tex
index 7671a4fb1a..24dbfb063d 100644
--- a/manual/platform/ipodmini.tex
+++ b/manual/platform/ipodmini.tex
@@ -4,6 +4,7 @@
4\edef\UseOption{\UseOption,IPOD_4G_PAD} 4\edef\UseOption{\UseOption,IPOD_4G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,USB_ENABLE_HID}
7\edef\UseOption{\UseOption,ipod} 8\edef\UseOption{\UseOption,ipod}
8 9
9\newcommand{\playerman}{Ipod} 10\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipodnano.tex b/manual/platform/ipodnano.tex
index 974fe687ec..027ec8d000 100644
--- a/manual/platform/ipodnano.tex
+++ b/manual/platform/ipodnano.tex
@@ -3,6 +3,7 @@
3\edef\UseOption{\UseOption,HAVE_RB_BL_ON_DISK} 3\edef\UseOption{\UseOption,HAVE_RB_BL_ON_DISK}
4\edef\UseOption{\UseOption,IPOD_4G_PAD} 4\edef\UseOption{\UseOption,IPOD_4G_PAD}
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,USB_ENABLE_HID}
6\edef\UseOption{\UseOption,ipod} 7\edef\UseOption{\UseOption,ipod}
7 8
8\newcommand{\playerman}{Ipod} 9\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/ipodvideo.tex b/manual/platform/ipodvideo.tex
index ff18551266..3712a9651e 100644
--- a/manual/platform/ipodvideo.tex
+++ b/manual/platform/ipodvideo.tex
@@ -5,6 +5,7 @@
5\edef\UseOption{\UseOption,HAVE_BACKLIGHT} 5\edef\UseOption{\UseOption,HAVE_BACKLIGHT}
6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE} 6\edef\UseOption{\UseOption,HAVE_DISK_STORAGE}
7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE} 7\edef\UseOption{\UseOption,HAVE_CAR_ADAPTER_MODE}
8\edef\UseOption{\UseOption,USB_ENABLE_HID}
8\edef\UseOption{\UseOption,ipod} 9\edef\UseOption{\UseOption,ipod}
9 10
10\newcommand{\playerman}{Ipod} 11\newcommand{\playerman}{Ipod}
diff --git a/manual/platform/keymap-gigabeats.tex b/manual/platform/keymap-gigabeats.tex
index f0f3f128e2..004f5ad426 100644
--- a/manual/platform/keymap-gigabeats.tex
+++ b/manual/platform/keymap-gigabeats.tex
@@ -7,8 +7,8 @@
7\newcommand{\ButtonRight}{\btnfnt{Right}} 7\newcommand{\ButtonRight}{\btnfnt{Right}}
8\newcommand{\ButtonUp}{\btnfnt{Up}} 8\newcommand{\ButtonUp}{\btnfnt{Up}}
9\newcommand{\ButtonDown}{\btnfnt{Down}} 9\newcommand{\ButtonDown}{\btnfnt{Down}}
10\newcommand{\ButtonVolUp}{\btnfnt{Volume up}} 10\newcommand{\ButtonVolUp}{\btnfnt{Volume Up}}
11\newcommand{\ButtonVolDown}{\btnfnt{Volume down}} 11\newcommand{\ButtonVolDown}{\btnfnt{Volume Down}}
12\newcommand{\ButtonSelect}{\btnfnt{Select}} 12\newcommand{\ButtonSelect}{\btnfnt{Select}}
13\newcommand{\ButtonPrev}{\btnfnt{Previous}} 13\newcommand{\ButtonPrev}{\btnfnt{Previous}}
14\newcommand{\ButtonPlay}{\btnfnt{Play}} 14\newcommand{\ButtonPlay}{\btnfnt{Play}}