diff options
Diffstat (limited to 'apps/usb_keymaps.c')
-rw-r--r-- | apps/usb_keymaps.c | 249 |
1 files changed, 249 insertions, 0 deletions
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 | |||
39 | typedef struct | ||
40 | { | ||
41 | int action; | ||
42 | int id; | ||
43 | } mapping_t; | ||
44 | |||
45 | typedef struct | ||
46 | { | ||
47 | int lang_name; | ||
48 | usage_page_t usage_page; | ||
49 | mapping_t mapping[]; | ||
50 | } hid_key_mapping_t; | ||
51 | |||
52 | static 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 | |||
74 | static 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 | |||
106 | static 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 | ||
141 | static 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 | |||
189 | static 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 | |||
199 | extern int usb_keypad_mode; | ||
200 | |||
201 | int 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 | |||
244 | int keypad_mode_name_get(void) | ||
245 | { | ||
246 | return hid_key_mappings[usb_keypad_mode]->lang_name; | ||
247 | } | ||
248 | |||
249 | #endif | ||