aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2007-01-25 05:43:31 -0500
committerJiri Kosina <jkosina@suse.cz>2007-02-05 04:00:38 -0500
commitc080d89ad91e98fec0e8fc5f448a1ad899bd85c7 (patch)
tree169a03a0e8d16fe95e7d689dd9fa7775340d5dc4
parent20eb12790670985c8e30821218993bd260387b89 (diff)
HID: hid debug from hid-debug.h to hid layer
hid-debug.h contains a lot of code, and should not therefore be a header. This patch moves the code to generic hid layer as .c source, and introduces CONFIG_HID_DEBUG to conditionally compile it, instead of playing with #define DEBUG and including hid-debug.h. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/Kconfig14
-rw-r--r--drivers/hid/Makefile8
-rw-r--r--drivers/hid/hid-core.c2
-rw-r--r--drivers/hid/hid-debug.c765
-rw-r--r--drivers/hid/hid-input.c7
-rw-r--r--drivers/usb/input/hid-core.c1
-rw-r--r--include/linux/hid-debug.h749
-rw-r--r--include/linux/hid.h10
8 files changed, 809 insertions, 747 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index ec796ad087df..850788f4dd2e 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -22,5 +22,19 @@ config HID
22 22
23 If unsure, say Y 23 If unsure, say Y
24 24
25config HID_DEBUG
26 bool "HID debugging support"
27 depends on HID
28 ---help---
29 This option lets the HID layer output diagnostics about its internal
30 state, resolve HID usages, dump HID fields, etc. Individual HID drivers
31 use this debugging facility to output information about individual HID
32 devices, etc.
33
34 This feature is useful for those who are either debugging the HID parser
35 or any HID hardware device.
36
37 If unsure, say N
38
25endmenu 39endmenu
26 40
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 6432392110bf..84c823eb5ad5 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -6,10 +6,14 @@
6hid-objs := hid-core.o hid-input.o 6hid-objs := hid-core.o hid-input.o
7 7
8# Optional parts of multipart objects. 8# Optional parts of multipart objects.
9 9ifeq ($(CONFIG_HID_DEBUG),y)
10obj-$(CONFIG_HID) += hid.o 10hid-objs += hid-debug.o
11endif
11 12
12ifeq ($(CONFIG_INPUT_DEBUG),y) 13ifeq ($(CONFIG_INPUT_DEBUG),y)
13EXTRA_CFLAGS += -DDEBUG 14EXTRA_CFLAGS += -DDEBUG
14endif 15endif
15 16
17
18obj-$(CONFIG_HID) += hid.o
19
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 49f18f5b2514..0796f64b3c54 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -28,11 +28,11 @@
28#include <linux/input.h> 28#include <linux/input.h>
29#include <linux/wait.h> 29#include <linux/wait.h>
30 30
31#undef DEBUG
32#undef DEBUG_DATA 31#undef DEBUG_DATA
33 32
34#include <linux/hid.h> 33#include <linux/hid.h>
35#include <linux/hiddev.h> 34#include <linux/hiddev.h>
35#include <linux/hid-debug.h>
36 36
37/* 37/*
38 * Version Information 38 * Version Information
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
new file mode 100644
index 000000000000..d6abe3494c04
--- /dev/null
+++ b/drivers/hid/hid-debug.c
@@ -0,0 +1,765 @@
1/*
2 * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $
3 *
4 * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de>
5 * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz>
6 * (c) 2007 Jiri Kosina
7 *
8 * Some debug stuff for the HID parser.
9 */
10
11/*
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * Should you need to contact me, the author, you can do so either by
27 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
28 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
29 */
30
31//#include <linux/input.h>
32#include <linux/hid.h>
33
34struct hid_usage_entry {
35 unsigned page;
36 unsigned usage;
37 char *description;
38};
39
40static const struct hid_usage_entry hid_usage_table[] = {
41 { 0, 0, "Undefined" },
42 { 1, 0, "GenericDesktop" },
43 {0, 0x01, "Pointer"},
44 {0, 0x02, "Mouse"},
45 {0, 0x04, "Joystick"},
46 {0, 0x05, "GamePad"},
47 {0, 0x06, "Keyboard"},
48 {0, 0x07, "Keypad"},
49 {0, 0x08, "MultiAxis"},
50 {0, 0x30, "X"},
51 {0, 0x31, "Y"},
52 {0, 0x32, "Z"},
53 {0, 0x33, "Rx"},
54 {0, 0x34, "Ry"},
55 {0, 0x35, "Rz"},
56 {0, 0x36, "Slider"},
57 {0, 0x37, "Dial"},
58 {0, 0x38, "Wheel"},
59 {0, 0x39, "HatSwitch"},
60 {0, 0x3a, "CountedBuffer"},
61 {0, 0x3b, "ByteCount"},
62 {0, 0x3c, "MotionWakeup"},
63 {0, 0x3d, "Start"},
64 {0, 0x3e, "Select"},
65 {0, 0x40, "Vx"},
66 {0, 0x41, "Vy"},
67 {0, 0x42, "Vz"},
68 {0, 0x43, "Vbrx"},
69 {0, 0x44, "Vbry"},
70 {0, 0x45, "Vbrz"},
71 {0, 0x46, "Vno"},
72 {0, 0x80, "SystemControl"},
73 {0, 0x81, "SystemPowerDown"},
74 {0, 0x82, "SystemSleep"},
75 {0, 0x83, "SystemWakeUp"},
76 {0, 0x84, "SystemContextMenu"},
77 {0, 0x85, "SystemMainMenu"},
78 {0, 0x86, "SystemAppMenu"},
79 {0, 0x87, "SystemMenuHelp"},
80 {0, 0x88, "SystemMenuExit"},
81 {0, 0x89, "SystemMenuSelect"},
82 {0, 0x8a, "SystemMenuRight"},
83 {0, 0x8b, "SystemMenuLeft"},
84 {0, 0x8c, "SystemMenuUp"},
85 {0, 0x8d, "SystemMenuDown"},
86 {0, 0x90, "D-PadUp"},
87 {0, 0x91, "D-PadDown"},
88 {0, 0x92, "D-PadRight"},
89 {0, 0x93, "D-PadLeft"},
90 { 2, 0, "Simulation" },
91 {0, 0xb0, "Aileron"},
92 {0, 0xb1, "AileronTrim"},
93 {0, 0xb2, "Anti-Torque"},
94 {0, 0xb3, "Autopilot"},
95 {0, 0xb4, "Chaff"},
96 {0, 0xb5, "Collective"},
97 {0, 0xb6, "DiveBrake"},
98 {0, 0xb7, "ElectronicCountermeasures"},
99 {0, 0xb8, "Elevator"},
100 {0, 0xb9, "ElevatorTrim"},
101 {0, 0xba, "Rudder"},
102 {0, 0xbb, "Throttle"},
103 {0, 0xbc, "FlightCommunications"},
104 {0, 0xbd, "FlareRelease"},
105 {0, 0xbe, "LandingGear"},
106 {0, 0xbf, "ToeBrake"},
107 { 7, 0, "Keyboard" },
108 { 8, 0, "LED" },
109 {0, 0x01, "NumLock"},
110 {0, 0x02, "CapsLock"},
111 {0, 0x03, "ScrollLock"},
112 {0, 0x04, "Compose"},
113 {0, 0x05, "Kana"},
114 {0, 0x4b, "GenericIndicator"},
115 { 9, 0, "Button" },
116 { 10, 0, "Ordinal" },
117 { 12, 0, "Consumer" },
118 {0, 0x238, "HorizontalWheel"},
119 { 13, 0, "Digitizers" },
120 {0, 0x01, "Digitizer"},
121 {0, 0x02, "Pen"},
122 {0, 0x03, "LightPen"},
123 {0, 0x04, "TouchScreen"},
124 {0, 0x05, "TouchPad"},
125 {0, 0x20, "Stylus"},
126 {0, 0x21, "Puck"},
127 {0, 0x22, "Finger"},
128 {0, 0x30, "TipPressure"},
129 {0, 0x31, "BarrelPressure"},
130 {0, 0x32, "InRange"},
131 {0, 0x33, "Touch"},
132 {0, 0x34, "UnTouch"},
133 {0, 0x35, "Tap"},
134 {0, 0x39, "TabletFunctionKey"},
135 {0, 0x3a, "ProgramChangeKey"},
136 {0, 0x3c, "Invert"},
137 {0, 0x42, "TipSwitch"},
138 {0, 0x43, "SecondaryTipSwitch"},
139 {0, 0x44, "BarrelSwitch"},
140 {0, 0x45, "Eraser"},
141 {0, 0x46, "TabletPick"},
142 { 15, 0, "PhysicalInterfaceDevice" },
143 {0, 0x00, "Undefined"},
144 {0, 0x01, "Physical_Interface_Device"},
145 {0, 0x20, "Normal"},
146 {0, 0x21, "Set_Effect_Report"},
147 {0, 0x22, "Effect_Block_Index"},
148 {0, 0x23, "Parameter_Block_Offset"},
149 {0, 0x24, "ROM_Flag"},
150 {0, 0x25, "Effect_Type"},
151 {0, 0x26, "ET_Constant_Force"},
152 {0, 0x27, "ET_Ramp"},
153 {0, 0x28, "ET_Custom_Force_Data"},
154 {0, 0x30, "ET_Square"},
155 {0, 0x31, "ET_Sine"},
156 {0, 0x32, "ET_Triangle"},
157 {0, 0x33, "ET_Sawtooth_Up"},
158 {0, 0x34, "ET_Sawtooth_Down"},
159 {0, 0x40, "ET_Spring"},
160 {0, 0x41, "ET_Damper"},
161 {0, 0x42, "ET_Inertia"},
162 {0, 0x43, "ET_Friction"},
163 {0, 0x50, "Duration"},
164 {0, 0x51, "Sample_Period"},
165 {0, 0x52, "Gain"},
166 {0, 0x53, "Trigger_Button"},
167 {0, 0x54, "Trigger_Repeat_Interval"},
168 {0, 0x55, "Axes_Enable"},
169 {0, 0x56, "Direction_Enable"},
170 {0, 0x57, "Direction"},
171 {0, 0x58, "Type_Specific_Block_Offset"},
172 {0, 0x59, "Block_Type"},
173 {0, 0x5A, "Set_Envelope_Report"},
174 {0, 0x5B, "Attack_Level"},
175 {0, 0x5C, "Attack_Time"},
176 {0, 0x5D, "Fade_Level"},
177 {0, 0x5E, "Fade_Time"},
178 {0, 0x5F, "Set_Condition_Report"},
179 {0, 0x60, "CP_Offset"},
180 {0, 0x61, "Positive_Coefficient"},
181 {0, 0x62, "Negative_Coefficient"},
182 {0, 0x63, "Positive_Saturation"},
183 {0, 0x64, "Negative_Saturation"},
184 {0, 0x65, "Dead_Band"},
185 {0, 0x66, "Download_Force_Sample"},
186 {0, 0x67, "Isoch_Custom_Force_Enable"},
187 {0, 0x68, "Custom_Force_Data_Report"},
188 {0, 0x69, "Custom_Force_Data"},
189 {0, 0x6A, "Custom_Force_Vendor_Defined_Data"},
190 {0, 0x6B, "Set_Custom_Force_Report"},
191 {0, 0x6C, "Custom_Force_Data_Offset"},
192 {0, 0x6D, "Sample_Count"},
193 {0, 0x6E, "Set_Periodic_Report"},
194 {0, 0x6F, "Offset"},
195 {0, 0x70, "Magnitude"},
196 {0, 0x71, "Phase"},
197 {0, 0x72, "Period"},
198 {0, 0x73, "Set_Constant_Force_Report"},
199 {0, 0x74, "Set_Ramp_Force_Report"},
200 {0, 0x75, "Ramp_Start"},
201 {0, 0x76, "Ramp_End"},
202 {0, 0x77, "Effect_Operation_Report"},
203 {0, 0x78, "Effect_Operation"},
204 {0, 0x79, "Op_Effect_Start"},
205 {0, 0x7A, "Op_Effect_Start_Solo"},
206 {0, 0x7B, "Op_Effect_Stop"},
207 {0, 0x7C, "Loop_Count"},
208 {0, 0x7D, "Device_Gain_Report"},
209 {0, 0x7E, "Device_Gain"},
210 {0, 0x7F, "PID_Pool_Report"},
211 {0, 0x80, "RAM_Pool_Size"},
212 {0, 0x81, "ROM_Pool_Size"},
213 {0, 0x82, "ROM_Effect_Block_Count"},
214 {0, 0x83, "Simultaneous_Effects_Max"},
215 {0, 0x84, "Pool_Alignment"},
216 {0, 0x85, "PID_Pool_Move_Report"},
217 {0, 0x86, "Move_Source"},
218 {0, 0x87, "Move_Destination"},
219 {0, 0x88, "Move_Length"},
220 {0, 0x89, "PID_Block_Load_Report"},
221 {0, 0x8B, "Block_Load_Status"},
222 {0, 0x8C, "Block_Load_Success"},
223 {0, 0x8D, "Block_Load_Full"},
224 {0, 0x8E, "Block_Load_Error"},
225 {0, 0x8F, "Block_Handle"},
226 {0, 0x90, "PID_Block_Free_Report"},
227 {0, 0x91, "Type_Specific_Block_Handle"},
228 {0, 0x92, "PID_State_Report"},
229 {0, 0x94, "Effect_Playing"},
230 {0, 0x95, "PID_Device_Control_Report"},
231 {0, 0x96, "PID_Device_Control"},
232 {0, 0x97, "DC_Enable_Actuators"},
233 {0, 0x98, "DC_Disable_Actuators"},
234 {0, 0x99, "DC_Stop_All_Effects"},
235 {0, 0x9A, "DC_Device_Reset"},
236 {0, 0x9B, "DC_Device_Pause"},
237 {0, 0x9C, "DC_Device_Continue"},
238 {0, 0x9F, "Device_Paused"},
239 {0, 0xA0, "Actuators_Enabled"},
240 {0, 0xA4, "Safety_Switch"},
241 {0, 0xA5, "Actuator_Override_Switch"},
242 {0, 0xA6, "Actuator_Power"},
243 {0, 0xA7, "Start_Delay"},
244 {0, 0xA8, "Parameter_Block_Size"},
245 {0, 0xA9, "Device_Managed_Pool"},
246 {0, 0xAA, "Shared_Parameter_Blocks"},
247 {0, 0xAB, "Create_New_Effect_Report"},
248 {0, 0xAC, "RAM_Pool_Available"},
249 { 0x84, 0, "Power Device" },
250 { 0x84, 0x02, "PresentStatus" },
251 { 0x84, 0x03, "ChangeStatus" },
252 { 0x84, 0x04, "UPS" },
253 { 0x84, 0x05, "PowerSupply" },
254 { 0x84, 0x10, "BatterySystem" },
255 { 0x84, 0x11, "BatterySystemID" },
256 { 0x84, 0x12, "Battery" },
257 { 0x84, 0x13, "BatteryID" },
258 { 0x84, 0x14, "Charger" },
259 { 0x84, 0x15, "ChargerID" },
260 { 0x84, 0x16, "PowerConverter" },
261 { 0x84, 0x17, "PowerConverterID" },
262 { 0x84, 0x18, "OutletSystem" },
263 { 0x84, 0x19, "OutletSystemID" },
264 { 0x84, 0x1a, "Input" },
265 { 0x84, 0x1b, "InputID" },
266 { 0x84, 0x1c, "Output" },
267 { 0x84, 0x1d, "OutputID" },
268 { 0x84, 0x1e, "Flow" },
269 { 0x84, 0x1f, "FlowID" },
270 { 0x84, 0x20, "Outlet" },
271 { 0x84, 0x21, "OutletID" },
272 { 0x84, 0x22, "Gang" },
273 { 0x84, 0x24, "PowerSummary" },
274 { 0x84, 0x25, "PowerSummaryID" },
275 { 0x84, 0x30, "Voltage" },
276 { 0x84, 0x31, "Current" },
277 { 0x84, 0x32, "Frequency" },
278 { 0x84, 0x33, "ApparentPower" },
279 { 0x84, 0x35, "PercentLoad" },
280 { 0x84, 0x40, "ConfigVoltage" },
281 { 0x84, 0x41, "ConfigCurrent" },
282 { 0x84, 0x43, "ConfigApparentPower" },
283 { 0x84, 0x53, "LowVoltageTransfer" },
284 { 0x84, 0x54, "HighVoltageTransfer" },
285 { 0x84, 0x56, "DelayBeforeStartup" },
286 { 0x84, 0x57, "DelayBeforeShutdown" },
287 { 0x84, 0x58, "Test" },
288 { 0x84, 0x5a, "AudibleAlarmControl" },
289 { 0x84, 0x60, "Present" },
290 { 0x84, 0x61, "Good" },
291 { 0x84, 0x62, "InternalFailure" },
292 { 0x84, 0x65, "Overload" },
293 { 0x84, 0x66, "OverCharged" },
294 { 0x84, 0x67, "OverTemperature" },
295 { 0x84, 0x68, "ShutdownRequested" },
296 { 0x84, 0x69, "ShutdownImminent" },
297 { 0x84, 0x6b, "SwitchOn/Off" },
298 { 0x84, 0x6c, "Switchable" },
299 { 0x84, 0x6d, "Used" },
300 { 0x84, 0x6e, "Boost" },
301 { 0x84, 0x73, "CommunicationLost" },
302 { 0x84, 0xfd, "iManufacturer" },
303 { 0x84, 0xfe, "iProduct" },
304 { 0x84, 0xff, "iSerialNumber" },
305 { 0x85, 0, "Battery System" },
306 { 0x85, 0x01, "SMBBatteryMode" },
307 { 0x85, 0x02, "SMBBatteryStatus" },
308 { 0x85, 0x03, "SMBAlarmWarning" },
309 { 0x85, 0x04, "SMBChargerMode" },
310 { 0x85, 0x05, "SMBChargerStatus" },
311 { 0x85, 0x06, "SMBChargerSpecInfo" },
312 { 0x85, 0x07, "SMBSelectorState" },
313 { 0x85, 0x08, "SMBSelectorPresets" },
314 { 0x85, 0x09, "SMBSelectorInfo" },
315 { 0x85, 0x29, "RemainingCapacityLimit" },
316 { 0x85, 0x2c, "CapacityMode" },
317 { 0x85, 0x42, "BelowRemainingCapacityLimit" },
318 { 0x85, 0x44, "Charging" },
319 { 0x85, 0x45, "Discharging" },
320 { 0x85, 0x4b, "NeedReplacement" },
321 { 0x85, 0x66, "RemainingCapacity" },
322 { 0x85, 0x68, "RunTimeToEmpty" },
323 { 0x85, 0x6a, "AverageTimeToFull" },
324 { 0x85, 0x83, "DesignCapacity" },
325 { 0x85, 0x85, "ManufacturerDate" },
326 { 0x85, 0x89, "iDeviceChemistry" },
327 { 0x85, 0x8b, "Rechargable" },
328 { 0x85, 0x8f, "iOEMInformation" },
329 { 0x85, 0x8d, "CapacityGranularity1" },
330 { 0x85, 0xd0, "ACPresent" },
331 /* pages 0xff00 to 0xffff are vendor-specific */
332 { 0xffff, 0, "Vendor-specific-FF" },
333 { 0, 0, NULL }
334};
335
336static void resolv_usage_page(unsigned page) {
337 const struct hid_usage_entry *p;
338
339 for (p = hid_usage_table; p->description; p++)
340 if (p->page == page) {
341 printk("%s", p->description);
342 return;
343 }
344 printk("%04x", page);
345}
346
347void hid_resolv_usage(unsigned usage) {
348 const struct hid_usage_entry *p;
349
350 resolv_usage_page(usage >> 16);
351 printk(".");
352 for (p = hid_usage_table; p->description; p++)
353 if (p->page == (usage >> 16)) {
354 for(++p; p->description && p->usage != 0; p++)
355 if (p->usage == (usage & 0xffff)) {
356 printk("%s", p->description);
357 return;
358 }
359 break;
360 }
361 printk("%04x", usage & 0xffff);
362}
363EXPORT_SYMBOL_GPL(hid_resolv_usage);
364
365__inline__ static void tab(int n) {
366 while (n--) printk(" ");
367}
368
369void hid_dump_field(struct hid_field *field, int n) {
370 int j;
371
372 if (field->physical) {
373 tab(n);
374 printk("Physical(");
375 hid_resolv_usage(field->physical); printk(")\n");
376 }
377 if (field->logical) {
378 tab(n);
379 printk("Logical(");
380 hid_resolv_usage(field->logical); printk(")\n");
381 }
382 tab(n); printk("Usage(%d)\n", field->maxusage);
383 for (j = 0; j < field->maxusage; j++) {
384 tab(n+2); hid_resolv_usage(field->usage[j].hid); printk("\n");
385 }
386 if (field->logical_minimum != field->logical_maximum) {
387 tab(n); printk("Logical Minimum(%d)\n", field->logical_minimum);
388 tab(n); printk("Logical Maximum(%d)\n", field->logical_maximum);
389 }
390 if (field->physical_minimum != field->physical_maximum) {
391 tab(n); printk("Physical Minimum(%d)\n", field->physical_minimum);
392 tab(n); printk("Physical Maximum(%d)\n", field->physical_maximum);
393 }
394 if (field->unit_exponent) {
395 tab(n); printk("Unit Exponent(%d)\n", field->unit_exponent);
396 }
397 if (field->unit) {
398 char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" };
399 char *units[5][8] = {
400 { "None", "None", "None", "None", "None", "None", "None", "None" },
401 { "None", "Centimeter", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
402 { "None", "Radians", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
403 { "None", "Inch", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" },
404 { "None", "Degrees", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" }
405 };
406
407 int i;
408 int sys;
409 __u32 data = field->unit;
410
411 /* First nibble tells us which system we're in. */
412 sys = data & 0xf;
413 data >>= 4;
414
415 if(sys > 4) {
416 tab(n); printk("Unit(Invalid)\n");
417 }
418 else {
419 int earlier_unit = 0;
420
421 tab(n); printk("Unit(%s : ", systems[sys]);
422
423 for (i=1 ; i<sizeof(__u32)*2 ; i++) {
424 char nibble = data & 0xf;
425 data >>= 4;
426 if (nibble != 0) {
427 if(earlier_unit++ > 0)
428 printk("*");
429 printk("%s", units[sys][i]);
430 if(nibble != 1) {
431 /* This is a _signed_ nibble(!) */
432
433 int val = nibble & 0x7;
434 if(nibble & 0x08)
435 val = -((0x7 & ~val) +1);
436 printk("^%d", val);
437 }
438 }
439 }
440 printk(")\n");
441 }
442 }
443 tab(n); printk("Report Size(%u)\n", field->report_size);
444 tab(n); printk("Report Count(%u)\n", field->report_count);
445 tab(n); printk("Report Offset(%u)\n", field->report_offset);
446
447 tab(n); printk("Flags( ");
448 j = field->flags;
449 printk("%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : "");
450 printk("%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array ");
451 printk("%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute ");
452 printk("%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : "");
453 printk("%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : "");
454 printk("%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPrefferedState " : "");
455 printk("%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : "");
456 printk("%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : "");
457 printk("%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : "");
458 printk(")\n");
459}
460EXPORT_SYMBOL_GPL(hid_dump_field);
461
462void hid_dump_device(struct hid_device *device) {
463 struct hid_report_enum *report_enum;
464 struct hid_report *report;
465 struct list_head *list;
466 unsigned i,k;
467 static char *table[] = {"INPUT", "OUTPUT", "FEATURE"};
468
469 for (i = 0; i < HID_REPORT_TYPES; i++) {
470 report_enum = device->report_enum + i;
471 list = report_enum->report_list.next;
472 while (list != &report_enum->report_list) {
473 report = (struct hid_report *) list;
474 tab(2);
475 printk("%s", table[i]);
476 if (report->id)
477 printk("(%d)", report->id);
478 printk("[%s]", table[report->type]);
479 printk("\n");
480 for (k = 0; k < report->maxfield; k++) {
481 tab(4);
482 printk("Field(%d)\n", k);
483 hid_dump_field(report->field[k], 6);
484 }
485 list = list->next;
486 }
487 }
488}
489EXPORT_SYMBOL_GPL(hid_dump_device);
490
491void hid_dump_input(struct hid_usage *usage, __s32 value) {
492 printk("hid-debug: input ");
493 hid_resolv_usage(usage->hid);
494 printk(" = %d\n", value);
495}
496EXPORT_SYMBOL_GPL(hid_dump_input);
497
498static char *events[EV_MAX + 1] = {
499 [EV_SYN] = "Sync", [EV_KEY] = "Key",
500 [EV_REL] = "Relative", [EV_ABS] = "Absolute",
501 [EV_MSC] = "Misc", [EV_LED] = "LED",
502 [EV_SND] = "Sound", [EV_REP] = "Repeat",
503 [EV_FF] = "ForceFeedback", [EV_PWR] = "Power",
504 [EV_FF_STATUS] = "ForceFeedbackStatus",
505};
506
507static char *syncs[2] = {
508 [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config",
509};
510static char *keys[KEY_MAX + 1] = {
511 [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc",
512 [KEY_1] = "1", [KEY_2] = "2",
513 [KEY_3] = "3", [KEY_4] = "4",
514 [KEY_5] = "5", [KEY_6] = "6",
515 [KEY_7] = "7", [KEY_8] = "8",
516 [KEY_9] = "9", [KEY_0] = "0",
517 [KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal",
518 [KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab",
519 [KEY_Q] = "Q", [KEY_W] = "W",
520 [KEY_E] = "E", [KEY_R] = "R",
521 [KEY_T] = "T", [KEY_Y] = "Y",
522 [KEY_U] = "U", [KEY_I] = "I",
523 [KEY_O] = "O", [KEY_P] = "P",
524 [KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace",
525 [KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl",
526 [KEY_A] = "A", [KEY_S] = "S",
527 [KEY_D] = "D", [KEY_F] = "F",
528 [KEY_G] = "G", [KEY_H] = "H",
529 [KEY_J] = "J", [KEY_K] = "K",
530 [KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon",
531 [KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave",
532 [KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash",
533 [KEY_Z] = "Z", [KEY_X] = "X",
534 [KEY_C] = "C", [KEY_V] = "V",
535 [KEY_B] = "B", [KEY_N] = "N",
536 [KEY_M] = "M", [KEY_COMMA] = "Comma",
537 [KEY_DOT] = "Dot", [KEY_SLASH] = "Slash",
538 [KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk",
539 [KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space",
540 [KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1",
541 [KEY_F2] = "F2", [KEY_F3] = "F3",
542 [KEY_F4] = "F4", [KEY_F5] = "F5",
543 [KEY_F6] = "F6", [KEY_F7] = "F7",
544 [KEY_F8] = "F8", [KEY_F9] = "F9",
545 [KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock",
546 [KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7",
547 [KEY_KP8] = "KP8", [KEY_KP9] = "KP9",
548 [KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4",
549 [KEY_KP5] = "KP5", [KEY_KP6] = "KP6",
550 [KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1",
551 [KEY_KP2] = "KP2", [KEY_KP3] = "KP3",
552 [KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot",
553 [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd",
554 [KEY_F11] = "F11", [KEY_F12] = "F12",
555 [KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana",
556 [KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan",
557 [KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan",
558 [KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter",
559 [KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash",
560 [KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt",
561 [KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home",
562 [KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp",
563 [KEY_LEFT] = "Left", [KEY_RIGHT] = "Right",
564 [KEY_END] = "End", [KEY_DOWN] = "Down",
565 [KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert",
566 [KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro",
567 [KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown",
568 [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power",
569 [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus",
570 [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma",
571 [KEY_HANGUEL] = "Hangeul", [KEY_HANJA] = "Hanja",
572 [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta",
573 [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose",
574 [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again",
575 [KEY_PROPS] = "Props", [KEY_UNDO] = "Undo",
576 [KEY_FRONT] = "Front", [KEY_COPY] = "Copy",
577 [KEY_OPEN] = "Open", [KEY_PASTE] = "Paste",
578 [KEY_FIND] = "Find", [KEY_CUT] = "Cut",
579 [KEY_HELP] = "Help", [KEY_MENU] = "Menu",
580 [KEY_CALC] = "Calc", [KEY_SETUP] = "Setup",
581 [KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp",
582 [KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile",
583 [KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer",
584 [KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2",
585 [KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS",
586 [KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction",
587 [KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail",
588 [KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer",
589 [KEY_BACK] = "Back", [KEY_FORWARD] = "Forward",
590 [KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD",
591 [KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong",
592 [KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong",
593 [KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record",
594 [KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone",
595 [KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config",
596 [KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh",
597 [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move",
598 [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp",
599 [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis",
600 [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_NEW] = "New",
601 [KEY_REDO] = "Redo", [KEY_F13] = "F13",
602 [KEY_F14] = "F14", [KEY_F15] = "F15",
603 [KEY_F16] = "F16", [KEY_F17] = "F17",
604 [KEY_F18] = "F18", [KEY_F19] = "F19",
605 [KEY_F20] = "F20", [KEY_F21] = "F21",
606 [KEY_F22] = "F22", [KEY_F23] = "F23",
607 [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD",
608 [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",
609 [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",
610 [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",
611 [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost",
612 [KEY_PRINT] = "Print", [KEY_HP] = "HP",
613 [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound",
614 [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email",
615 [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search",
616 [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance",
617 [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop",
618 [KEY_ALTERASE] = "AlternateErase", [KEY_CANCEL] = "Cancel",
619 [KEY_BRIGHTNESSDOWN] = "BrightnessDown", [KEY_BRIGHTNESSUP] = "BrightnessUp",
620 [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown",
621 [BTN_0] = "Btn0", [BTN_1] = "Btn1",
622 [BTN_2] = "Btn2", [BTN_3] = "Btn3",
623 [BTN_4] = "Btn4", [BTN_5] = "Btn5",
624 [BTN_6] = "Btn6", [BTN_7] = "Btn7",
625 [BTN_8] = "Btn8", [BTN_9] = "Btn9",
626 [BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn",
627 [BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn",
628 [BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn",
629 [BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn",
630 [BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn",
631 [BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn",
632 [BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn",
633 [BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2",
634 [BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4",
635 [BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6",
636 [BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA",
637 [BTN_B] = "BtnB", [BTN_C] = "BtnC",
638 [BTN_X] = "BtnX", [BTN_Y] = "BtnY",
639 [BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL",
640 [BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2",
641 [BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect",
642 [BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode",
643 [BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR",
644 [BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber",
645 [BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil",
646 [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger",
647 [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens",
648 [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus",
649 [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap",
650 [BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_GEAR_DOWN] = "WheelBtn",
651 [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok",
652 [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",
653 [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",
654 [KEY_OPTION] = "Option", [KEY_INFO] = "Info",
655 [KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor",
656 [KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program",
657 [KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites",
658 [KEY_EPG] = "EPG", [KEY_PVR] = "PVR",
659 [KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language",
660 [KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle",
661 [KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom",
662 [KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard",
663 [KEY_SCREEN] = "Screen", [KEY_PC] = "PC",
664 [KEY_TV] = "TV", [KEY_TV2] = "TV2",
665 [KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2",
666 [KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2",
667 [KEY_CD] = "CD", [KEY_TAPE] = "Tape",
668 [KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner",
669 [KEY_PLAYER] = "Player", [KEY_TEXT] = "Text",
670 [KEY_DVD] = "DVD", [KEY_AUX] = "Aux",
671 [KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio",
672 [KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory",
673 [KEY_LIST] = "List", [KEY_MEMO] = "Memo",
674 [KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red",
675 [KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow",
676 [KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp",
677 [KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First",
678 [KEY_LAST] = "Last", [KEY_AB] = "AB",
679 [KEY_NEXT] = "Next", [KEY_RESTART] = "Restart",
680 [KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle",
681 [KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous",
682 [KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN",
683 [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL",
684 [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine",
685 [KEY_DEL_LINE] = "DeleteLine",
686 [KEY_SEND] = "Send", [KEY_REPLY] = "Reply",
687 [KEY_FORWARDMAIL] = "ForwardMail", [KEY_SAVE] = "Save",
688 [KEY_DOCUMENTS] = "Documents",
689 [KEY_FN] = "Fn", [KEY_FN_ESC] = "Fn+ESC",
690 [KEY_FN_1] = "Fn+1", [KEY_FN_2] = "Fn+2",
691 [KEY_FN_B] = "Fn+B", [KEY_FN_D] = "Fn+D",
692 [KEY_FN_E] = "Fn+E", [KEY_FN_F] = "Fn+F",
693 [KEY_FN_S] = "Fn+S",
694 [KEY_FN_F1] = "Fn+F1", [KEY_FN_F2] = "Fn+F2",
695 [KEY_FN_F3] = "Fn+F3", [KEY_FN_F4] = "Fn+F4",
696 [KEY_FN_F5] = "Fn+F5", [KEY_FN_F6] = "Fn+F6",
697 [KEY_FN_F7] = "Fn+F7", [KEY_FN_F8] = "Fn+F8",
698 [KEY_FN_F9] = "Fn+F9", [KEY_FN_F10] = "Fn+F10",
699 [KEY_FN_F11] = "Fn+F11", [KEY_FN_F12] = "Fn+F12",
700 [KEY_KBDILLUMTOGGLE] = "KbdIlluminationToggle",
701 [KEY_KBDILLUMDOWN] = "KbdIlluminationDown",
702 [KEY_KBDILLUMUP] = "KbdIlluminationUp",
703 [KEY_SWITCHVIDEOMODE] = "SwitchVideoMode",
704};
705
706static char *relatives[REL_MAX + 1] = {
707 [REL_X] = "X", [REL_Y] = "Y",
708 [REL_Z] = "Z", [REL_RX] = "Rx",
709 [REL_RY] = "Ry", [REL_RZ] = "Rz",
710 [REL_HWHEEL] = "HWheel", [REL_DIAL] = "Dial",
711 [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc",
712};
713
714static char *absolutes[ABS_MAX + 1] = {
715 [ABS_X] = "X", [ABS_Y] = "Y",
716 [ABS_Z] = "Z", [ABS_RX] = "Rx",
717 [ABS_RY] = "Ry", [ABS_RZ] = "Rz",
718 [ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder",
719 [ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas",
720 [ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X",
721 [ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X",
722 [ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X",
723 [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X",
724 [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure",
725 [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt",
726 [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width",
727 [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc",
728};
729
730static char *misc[MSC_MAX + 1] = {
731 [MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled",
732 [MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData"
733};
734
735static char *leds[LED_MAX + 1] = {
736 [LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock",
737 [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose",
738 [LED_KANA] = "Kana", [LED_SLEEP] = "Sleep",
739 [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute",
740 [LED_MISC] = "Misc",
741};
742
743static char *repeats[REP_MAX + 1] = {
744 [REP_DELAY] = "Delay", [REP_PERIOD] = "Period"
745};
746
747static char *sounds[SND_MAX + 1] = {
748 [SND_CLICK] = "Click", [SND_BELL] = "Bell",
749 [SND_TONE] = "Tone"
750};
751
752static char **names[EV_MAX + 1] = {
753 [EV_SYN] = syncs, [EV_KEY] = keys,
754 [EV_REL] = relatives, [EV_ABS] = absolutes,
755 [EV_MSC] = misc, [EV_LED] = leds,
756 [EV_SND] = sounds, [EV_REP] = repeats,
757};
758
759void hid_resolv_event(__u8 type, __u16 code) {
760
761 printk("%s.%s", events[type] ? events[type] : "?",
762 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
763}
764EXPORT_SYMBOL_GPL(hid_resolv_event);
765
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 33b1126f5e5d..ae298c4bfcbd 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -34,6 +34,7 @@
34#undef DEBUG 34#undef DEBUG
35 35
36#include <linux/hid.h> 36#include <linux/hid.h>
37#include <linux/hid-debug.h>
37 38
38static int hid_pb_fnmode = 1; 39static int hid_pb_fnmode = 1;
39module_param_named(pb_fnmode, hid_pb_fnmode, int, 0644); 40module_param_named(pb_fnmode, hid_pb_fnmode, int, 0644);
@@ -254,7 +255,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
254 255
255#ifdef DEBUG 256#ifdef DEBUG
256 printk(KERN_DEBUG "Mapping: "); 257 printk(KERN_DEBUG "Mapping: ");
257 resolv_usage(usage->hid); 258 hid_resolv_usage(usage->hid);
258 printk(" ---> "); 259 printk(" ---> ");
259#endif 260#endif
260 261
@@ -682,8 +683,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
682 field->dpad = usage->code; 683 field->dpad = usage->code;
683 } 684 }
684 685
685#ifdef DEBUG 686 hid_resolv_event(usage->type, usage->code);
686 resolv_event(usage->type, usage->code); 687#ifdef CONFIG_HID_DEBUG
687 printk("\n"); 688 printk("\n");
688#endif 689#endif
689 return; 690 return;
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 1fa42f400176..6938c4e0e5e2 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -35,6 +35,7 @@
35 35
36#include <linux/hid.h> 36#include <linux/hid.h>
37#include <linux/hiddev.h> 37#include <linux/hiddev.h>
38#include <linux/hid-debug.h>
38#include "usbhid.h" 39#include "usbhid.h"
39 40
40/* 41/*
diff --git a/include/linux/hid-debug.h b/include/linux/hid-debug.h
index 8e4dbb51fc70..50d568ec178a 100644
--- a/include/linux/hid-debug.h
+++ b/include/linux/hid-debug.h
@@ -1,10 +1,8 @@
1#ifndef __HID_DEBUG_H
2#define __HID_DEBUG_H
3
1/* 4/*
2 * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $ 5 * Copyright (c) 2007 Jiri Kosina
3 *
4 * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de>
5 * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz>
6 *
7 * Some debug stuff for the HID parser.
8 */ 6 */
9 7
10/* 8/*
@@ -22,737 +20,26 @@
22 * along with this program; if not, write to the Free Software 20 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * 22 *
25 * Should you need to contact me, the author, you can do so either by
26 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
27 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
28 */ 23 */
29 24
30#include <linux/input.h> 25#ifdef CONFIG_HID_DEBUG
31
32struct hid_usage_entry {
33 unsigned page;
34 unsigned usage;
35 char *description;
36};
37
38static const struct hid_usage_entry hid_usage_table[] = {
39 { 0, 0, "Undefined" },
40 { 1, 0, "GenericDesktop" },
41 {0, 0x01, "Pointer"},
42 {0, 0x02, "Mouse"},
43 {0, 0x04, "Joystick"},
44 {0, 0x05, "GamePad"},
45 {0, 0x06, "Keyboard"},
46 {0, 0x07, "Keypad"},
47 {0, 0x08, "MultiAxis"},
48 {0, 0x30, "X"},
49 {0, 0x31, "Y"},
50 {0, 0x32, "Z"},
51 {0, 0x33, "Rx"},
52 {0, 0x34, "Ry"},
53 {0, 0x35, "Rz"},
54 {0, 0x36, "Slider"},
55 {0, 0x37, "Dial"},
56 {0, 0x38, "Wheel"},
57 {0, 0x39, "HatSwitch"},
58 {0, 0x3a, "CountedBuffer"},
59 {0, 0x3b, "ByteCount"},
60 {0, 0x3c, "MotionWakeup"},
61 {0, 0x3d, "Start"},
62 {0, 0x3e, "Select"},
63 {0, 0x40, "Vx"},
64 {0, 0x41, "Vy"},
65 {0, 0x42, "Vz"},
66 {0, 0x43, "Vbrx"},
67 {0, 0x44, "Vbry"},
68 {0, 0x45, "Vbrz"},
69 {0, 0x46, "Vno"},
70 {0, 0x80, "SystemControl"},
71 {0, 0x81, "SystemPowerDown"},
72 {0, 0x82, "SystemSleep"},
73 {0, 0x83, "SystemWakeUp"},
74 {0, 0x84, "SystemContextMenu"},
75 {0, 0x85, "SystemMainMenu"},
76 {0, 0x86, "SystemAppMenu"},
77 {0, 0x87, "SystemMenuHelp"},
78 {0, 0x88, "SystemMenuExit"},
79 {0, 0x89, "SystemMenuSelect"},
80 {0, 0x8a, "SystemMenuRight"},
81 {0, 0x8b, "SystemMenuLeft"},
82 {0, 0x8c, "SystemMenuUp"},
83 {0, 0x8d, "SystemMenuDown"},
84 {0, 0x90, "D-PadUp"},
85 {0, 0x91, "D-PadDown"},
86 {0, 0x92, "D-PadRight"},
87 {0, 0x93, "D-PadLeft"},
88 { 2, 0, "Simulation" },
89 {0, 0xb0, "Aileron"},
90 {0, 0xb1, "AileronTrim"},
91 {0, 0xb2, "Anti-Torque"},
92 {0, 0xb3, "Autopilot"},
93 {0, 0xb4, "Chaff"},
94 {0, 0xb5, "Collective"},
95 {0, 0xb6, "DiveBrake"},
96 {0, 0xb7, "ElectronicCountermeasures"},
97 {0, 0xb8, "Elevator"},
98 {0, 0xb9, "ElevatorTrim"},
99 {0, 0xba, "Rudder"},
100 {0, 0xbb, "Throttle"},
101 {0, 0xbc, "FlightCommunications"},
102 {0, 0xbd, "FlareRelease"},
103 {0, 0xbe, "LandingGear"},
104 {0, 0xbf, "ToeBrake"},
105 { 7, 0, "Keyboard" },
106 { 8, 0, "LED" },
107 {0, 0x01, "NumLock"},
108 {0, 0x02, "CapsLock"},
109 {0, 0x03, "ScrollLock"},
110 {0, 0x04, "Compose"},
111 {0, 0x05, "Kana"},
112 {0, 0x4b, "GenericIndicator"},
113 { 9, 0, "Button" },
114 { 10, 0, "Ordinal" },
115 { 12, 0, "Consumer" },
116 {0, 0x238, "HorizontalWheel"},
117 { 13, 0, "Digitizers" },
118 {0, 0x01, "Digitizer"},
119 {0, 0x02, "Pen"},
120 {0, 0x03, "LightPen"},
121 {0, 0x04, "TouchScreen"},
122 {0, 0x05, "TouchPad"},
123 {0, 0x20, "Stylus"},
124 {0, 0x21, "Puck"},
125 {0, 0x22, "Finger"},
126 {0, 0x30, "TipPressure"},
127 {0, 0x31, "BarrelPressure"},
128 {0, 0x32, "InRange"},
129 {0, 0x33, "Touch"},
130 {0, 0x34, "UnTouch"},
131 {0, 0x35, "Tap"},
132 {0, 0x39, "TabletFunctionKey"},
133 {0, 0x3a, "ProgramChangeKey"},
134 {0, 0x3c, "Invert"},
135 {0, 0x42, "TipSwitch"},
136 {0, 0x43, "SecondaryTipSwitch"},
137 {0, 0x44, "BarrelSwitch"},
138 {0, 0x45, "Eraser"},
139 {0, 0x46, "TabletPick"},
140 { 15, 0, "PhysicalInterfaceDevice" },
141 {0, 0x00, "Undefined"},
142 {0, 0x01, "Physical_Interface_Device"},
143 {0, 0x20, "Normal"},
144 {0, 0x21, "Set_Effect_Report"},
145 {0, 0x22, "Effect_Block_Index"},
146 {0, 0x23, "Parameter_Block_Offset"},
147 {0, 0x24, "ROM_Flag"},
148 {0, 0x25, "Effect_Type"},
149 {0, 0x26, "ET_Constant_Force"},
150 {0, 0x27, "ET_Ramp"},
151 {0, 0x28, "ET_Custom_Force_Data"},
152 {0, 0x30, "ET_Square"},
153 {0, 0x31, "ET_Sine"},
154 {0, 0x32, "ET_Triangle"},
155 {0, 0x33, "ET_Sawtooth_Up"},
156 {0, 0x34, "ET_Sawtooth_Down"},
157 {0, 0x40, "ET_Spring"},
158 {0, 0x41, "ET_Damper"},
159 {0, 0x42, "ET_Inertia"},
160 {0, 0x43, "ET_Friction"},
161 {0, 0x50, "Duration"},
162 {0, 0x51, "Sample_Period"},
163 {0, 0x52, "Gain"},
164 {0, 0x53, "Trigger_Button"},
165 {0, 0x54, "Trigger_Repeat_Interval"},
166 {0, 0x55, "Axes_Enable"},
167 {0, 0x56, "Direction_Enable"},
168 {0, 0x57, "Direction"},
169 {0, 0x58, "Type_Specific_Block_Offset"},
170 {0, 0x59, "Block_Type"},
171 {0, 0x5A, "Set_Envelope_Report"},
172 {0, 0x5B, "Attack_Level"},
173 {0, 0x5C, "Attack_Time"},
174 {0, 0x5D, "Fade_Level"},
175 {0, 0x5E, "Fade_Time"},
176 {0, 0x5F, "Set_Condition_Report"},
177 {0, 0x60, "CP_Offset"},
178 {0, 0x61, "Positive_Coefficient"},
179 {0, 0x62, "Negative_Coefficient"},
180 {0, 0x63, "Positive_Saturation"},
181 {0, 0x64, "Negative_Saturation"},
182 {0, 0x65, "Dead_Band"},
183 {0, 0x66, "Download_Force_Sample"},
184 {0, 0x67, "Isoch_Custom_Force_Enable"},
185 {0, 0x68, "Custom_Force_Data_Report"},
186 {0, 0x69, "Custom_Force_Data"},
187 {0, 0x6A, "Custom_Force_Vendor_Defined_Data"},
188 {0, 0x6B, "Set_Custom_Force_Report"},
189 {0, 0x6C, "Custom_Force_Data_Offset"},
190 {0, 0x6D, "Sample_Count"},
191 {0, 0x6E, "Set_Periodic_Report"},
192 {0, 0x6F, "Offset"},
193 {0, 0x70, "Magnitude"},
194 {0, 0x71, "Phase"},
195 {0, 0x72, "Period"},
196 {0, 0x73, "Set_Constant_Force_Report"},
197 {0, 0x74, "Set_Ramp_Force_Report"},
198 {0, 0x75, "Ramp_Start"},
199 {0, 0x76, "Ramp_End"},
200 {0, 0x77, "Effect_Operation_Report"},
201 {0, 0x78, "Effect_Operation"},
202 {0, 0x79, "Op_Effect_Start"},
203 {0, 0x7A, "Op_Effect_Start_Solo"},
204 {0, 0x7B, "Op_Effect_Stop"},
205 {0, 0x7C, "Loop_Count"},
206 {0, 0x7D, "Device_Gain_Report"},
207 {0, 0x7E, "Device_Gain"},
208 {0, 0x7F, "PID_Pool_Report"},
209 {0, 0x80, "RAM_Pool_Size"},
210 {0, 0x81, "ROM_Pool_Size"},
211 {0, 0x82, "ROM_Effect_Block_Count"},
212 {0, 0x83, "Simultaneous_Effects_Max"},
213 {0, 0x84, "Pool_Alignment"},
214 {0, 0x85, "PID_Pool_Move_Report"},
215 {0, 0x86, "Move_Source"},
216 {0, 0x87, "Move_Destination"},
217 {0, 0x88, "Move_Length"},
218 {0, 0x89, "PID_Block_Load_Report"},
219 {0, 0x8B, "Block_Load_Status"},
220 {0, 0x8C, "Block_Load_Success"},
221 {0, 0x8D, "Block_Load_Full"},
222 {0, 0x8E, "Block_Load_Error"},
223 {0, 0x8F, "Block_Handle"},
224 {0, 0x90, "PID_Block_Free_Report"},
225 {0, 0x91, "Type_Specific_Block_Handle"},
226 {0, 0x92, "PID_State_Report"},
227 {0, 0x94, "Effect_Playing"},
228 {0, 0x95, "PID_Device_Control_Report"},
229 {0, 0x96, "PID_Device_Control"},
230 {0, 0x97, "DC_Enable_Actuators"},
231 {0, 0x98, "DC_Disable_Actuators"},
232 {0, 0x99, "DC_Stop_All_Effects"},
233 {0, 0x9A, "DC_Device_Reset"},
234 {0, 0x9B, "DC_Device_Pause"},
235 {0, 0x9C, "DC_Device_Continue"},
236 {0, 0x9F, "Device_Paused"},
237 {0, 0xA0, "Actuators_Enabled"},
238 {0, 0xA4, "Safety_Switch"},
239 {0, 0xA5, "Actuator_Override_Switch"},
240 {0, 0xA6, "Actuator_Power"},
241 {0, 0xA7, "Start_Delay"},
242 {0, 0xA8, "Parameter_Block_Size"},
243 {0, 0xA9, "Device_Managed_Pool"},
244 {0, 0xAA, "Shared_Parameter_Blocks"},
245 {0, 0xAB, "Create_New_Effect_Report"},
246 {0, 0xAC, "RAM_Pool_Available"},
247 { 0x84, 0, "Power Device" },
248 { 0x84, 0x02, "PresentStatus" },
249 { 0x84, 0x03, "ChangeStatus" },
250 { 0x84, 0x04, "UPS" },
251 { 0x84, 0x05, "PowerSupply" },
252 { 0x84, 0x10, "BatterySystem" },
253 { 0x84, 0x11, "BatterySystemID" },
254 { 0x84, 0x12, "Battery" },
255 { 0x84, 0x13, "BatteryID" },
256 { 0x84, 0x14, "Charger" },
257 { 0x84, 0x15, "ChargerID" },
258 { 0x84, 0x16, "PowerConverter" },
259 { 0x84, 0x17, "PowerConverterID" },
260 { 0x84, 0x18, "OutletSystem" },
261 { 0x84, 0x19, "OutletSystemID" },
262 { 0x84, 0x1a, "Input" },
263 { 0x84, 0x1b, "InputID" },
264 { 0x84, 0x1c, "Output" },
265 { 0x84, 0x1d, "OutputID" },
266 { 0x84, 0x1e, "Flow" },
267 { 0x84, 0x1f, "FlowID" },
268 { 0x84, 0x20, "Outlet" },
269 { 0x84, 0x21, "OutletID" },
270 { 0x84, 0x22, "Gang" },
271 { 0x84, 0x24, "PowerSummary" },
272 { 0x84, 0x25, "PowerSummaryID" },
273 { 0x84, 0x30, "Voltage" },
274 { 0x84, 0x31, "Current" },
275 { 0x84, 0x32, "Frequency" },
276 { 0x84, 0x33, "ApparentPower" },
277 { 0x84, 0x35, "PercentLoad" },
278 { 0x84, 0x40, "ConfigVoltage" },
279 { 0x84, 0x41, "ConfigCurrent" },
280 { 0x84, 0x43, "ConfigApparentPower" },
281 { 0x84, 0x53, "LowVoltageTransfer" },
282 { 0x84, 0x54, "HighVoltageTransfer" },
283 { 0x84, 0x56, "DelayBeforeStartup" },
284 { 0x84, 0x57, "DelayBeforeShutdown" },
285 { 0x84, 0x58, "Test" },
286 { 0x84, 0x5a, "AudibleAlarmControl" },
287 { 0x84, 0x60, "Present" },
288 { 0x84, 0x61, "Good" },
289 { 0x84, 0x62, "InternalFailure" },
290 { 0x84, 0x65, "Overload" },
291 { 0x84, 0x66, "OverCharged" },
292 { 0x84, 0x67, "OverTemperature" },
293 { 0x84, 0x68, "ShutdownRequested" },
294 { 0x84, 0x69, "ShutdownImminent" },
295 { 0x84, 0x6b, "SwitchOn/Off" },
296 { 0x84, 0x6c, "Switchable" },
297 { 0x84, 0x6d, "Used" },
298 { 0x84, 0x6e, "Boost" },
299 { 0x84, 0x73, "CommunicationLost" },
300 { 0x84, 0xfd, "iManufacturer" },
301 { 0x84, 0xfe, "iProduct" },
302 { 0x84, 0xff, "iSerialNumber" },
303 { 0x85, 0, "Battery System" },
304 { 0x85, 0x01, "SMBBatteryMode" },
305 { 0x85, 0x02, "SMBBatteryStatus" },
306 { 0x85, 0x03, "SMBAlarmWarning" },
307 { 0x85, 0x04, "SMBChargerMode" },
308 { 0x85, 0x05, "SMBChargerStatus" },
309 { 0x85, 0x06, "SMBChargerSpecInfo" },
310 { 0x85, 0x07, "SMBSelectorState" },
311 { 0x85, 0x08, "SMBSelectorPresets" },
312 { 0x85, 0x09, "SMBSelectorInfo" },
313 { 0x85, 0x29, "RemainingCapacityLimit" },
314 { 0x85, 0x2c, "CapacityMode" },
315 { 0x85, 0x42, "BelowRemainingCapacityLimit" },
316 { 0x85, 0x44, "Charging" },
317 { 0x85, 0x45, "Discharging" },
318 { 0x85, 0x4b, "NeedReplacement" },
319 { 0x85, 0x66, "RemainingCapacity" },
320 { 0x85, 0x68, "RunTimeToEmpty" },
321 { 0x85, 0x6a, "AverageTimeToFull" },
322 { 0x85, 0x83, "DesignCapacity" },
323 { 0x85, 0x85, "ManufacturerDate" },
324 { 0x85, 0x89, "iDeviceChemistry" },
325 { 0x85, 0x8b, "Rechargable" },
326 { 0x85, 0x8f, "iOEMInformation" },
327 { 0x85, 0x8d, "CapacityGranularity1" },
328 { 0x85, 0xd0, "ACPresent" },
329 /* pages 0xff00 to 0xffff are vendor-specific */
330 { 0xffff, 0, "Vendor-specific-FF" },
331 { 0, 0, NULL }
332};
333
334static void resolv_usage_page(unsigned page) {
335 const struct hid_usage_entry *p;
336
337 for (p = hid_usage_table; p->description; p++)
338 if (p->page == page) {
339 printk("%s", p->description);
340 return;
341 }
342 printk("%04x", page);
343}
344
345static void resolv_usage(unsigned usage) {
346 const struct hid_usage_entry *p;
347
348 resolv_usage_page(usage >> 16);
349 printk(".");
350 for (p = hid_usage_table; p->description; p++)
351 if (p->page == (usage >> 16)) {
352 for(++p; p->description && p->usage != 0; p++)
353 if (p->usage == (usage & 0xffff)) {
354 printk("%s", p->description);
355 return;
356 }
357 break;
358 }
359 printk("%04x", usage & 0xffff);
360}
361
362__inline__ static void tab(int n) {
363 while (n--) printk(" ");
364}
365
366static void hid_dump_field(struct hid_field *field, int n) {
367 int j;
368
369 if (field->physical) {
370 tab(n);
371 printk("Physical(");
372 resolv_usage(field->physical); printk(")\n");
373 }
374 if (field->logical) {
375 tab(n);
376 printk("Logical(");
377 resolv_usage(field->logical); printk(")\n");
378 }
379 tab(n); printk("Usage(%d)\n", field->maxusage);
380 for (j = 0; j < field->maxusage; j++) {
381 tab(n+2);resolv_usage(field->usage[j].hid); printk("\n");
382 }
383 if (field->logical_minimum != field->logical_maximum) {
384 tab(n); printk("Logical Minimum(%d)\n", field->logical_minimum);
385 tab(n); printk("Logical Maximum(%d)\n", field->logical_maximum);
386 }
387 if (field->physical_minimum != field->physical_maximum) {
388 tab(n); printk("Physical Minimum(%d)\n", field->physical_minimum);
389 tab(n); printk("Physical Maximum(%d)\n", field->physical_maximum);
390 }
391 if (field->unit_exponent) {
392 tab(n); printk("Unit Exponent(%d)\n", field->unit_exponent);
393 }
394 if (field->unit) {
395 char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" };
396 char *units[5][8] = {
397 { "None", "None", "None", "None", "None", "None", "None", "None" },
398 { "None", "Centimeter", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
399 { "None", "Radians", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" },
400 { "None", "Inch", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" },
401 { "None", "Degrees", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" }
402 };
403
404 int i;
405 int sys;
406 __u32 data = field->unit;
407
408 /* First nibble tells us which system we're in. */
409 sys = data & 0xf;
410 data >>= 4;
411
412 if(sys > 4) {
413 tab(n); printk("Unit(Invalid)\n");
414 }
415 else {
416 int earlier_unit = 0;
417
418 tab(n); printk("Unit(%s : ", systems[sys]);
419
420 for (i=1 ; i<sizeof(__u32)*2 ; i++) {
421 char nibble = data & 0xf;
422 data >>= 4;
423 if (nibble != 0) {
424 if(earlier_unit++ > 0)
425 printk("*");
426 printk("%s", units[sys][i]);
427 if(nibble != 1) {
428 /* This is a _signed_ nibble(!) */
429
430 int val = nibble & 0x7;
431 if(nibble & 0x08)
432 val = -((0x7 & ~val) +1);
433 printk("^%d", val);
434 }
435 }
436 }
437 printk(")\n");
438 }
439 }
440 tab(n); printk("Report Size(%u)\n", field->report_size);
441 tab(n); printk("Report Count(%u)\n", field->report_count);
442 tab(n); printk("Report Offset(%u)\n", field->report_offset);
443
444 tab(n); printk("Flags( ");
445 j = field->flags;
446 printk("%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : "");
447 printk("%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array ");
448 printk("%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute ");
449 printk("%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : "");
450 printk("%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : "");
451 printk("%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPrefferedState " : "");
452 printk("%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : "");
453 printk("%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : "");
454 printk("%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : "");
455 printk(")\n");
456}
457
458static void __attribute__((unused)) hid_dump_device(struct hid_device *device) {
459 struct hid_report_enum *report_enum;
460 struct hid_report *report;
461 struct list_head *list;
462 unsigned i,k;
463 static char *table[] = {"INPUT", "OUTPUT", "FEATURE"};
464
465 for (i = 0; i < HID_REPORT_TYPES; i++) {
466 report_enum = device->report_enum + i;
467 list = report_enum->report_list.next;
468 while (list != &report_enum->report_list) {
469 report = (struct hid_report *) list;
470 tab(2);
471 printk("%s", table[i]);
472 if (report->id)
473 printk("(%d)", report->id);
474 printk("[%s]", table[report->type]);
475 printk("\n");
476 for (k = 0; k < report->maxfield; k++) {
477 tab(4);
478 printk("Field(%d)\n", k);
479 hid_dump_field(report->field[k], 6);
480 }
481 list = list->next;
482 }
483 }
484}
485
486static void __attribute__((unused)) hid_dump_input(struct hid_usage *usage, __s32 value) {
487 printk("hid-debug: input ");
488 resolv_usage(usage->hid);
489 printk(" = %d\n", value);
490}
491
492
493static char *events[EV_MAX + 1] = {
494 [EV_SYN] = "Sync", [EV_KEY] = "Key",
495 [EV_REL] = "Relative", [EV_ABS] = "Absolute",
496 [EV_MSC] = "Misc", [EV_LED] = "LED",
497 [EV_SND] = "Sound", [EV_REP] = "Repeat",
498 [EV_FF] = "ForceFeedback", [EV_PWR] = "Power",
499 [EV_FF_STATUS] = "ForceFeedbackStatus",
500};
501
502static char *syncs[2] = {
503 [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config",
504};
505static char *keys[KEY_MAX + 1] = {
506 [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc",
507 [KEY_1] = "1", [KEY_2] = "2",
508 [KEY_3] = "3", [KEY_4] = "4",
509 [KEY_5] = "5", [KEY_6] = "6",
510 [KEY_7] = "7", [KEY_8] = "8",
511 [KEY_9] = "9", [KEY_0] = "0",
512 [KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal",
513 [KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab",
514 [KEY_Q] = "Q", [KEY_W] = "W",
515 [KEY_E] = "E", [KEY_R] = "R",
516 [KEY_T] = "T", [KEY_Y] = "Y",
517 [KEY_U] = "U", [KEY_I] = "I",
518 [KEY_O] = "O", [KEY_P] = "P",
519 [KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace",
520 [KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl",
521 [KEY_A] = "A", [KEY_S] = "S",
522 [KEY_D] = "D", [KEY_F] = "F",
523 [KEY_G] = "G", [KEY_H] = "H",
524 [KEY_J] = "J", [KEY_K] = "K",
525 [KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon",
526 [KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave",
527 [KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash",
528 [KEY_Z] = "Z", [KEY_X] = "X",
529 [KEY_C] = "C", [KEY_V] = "V",
530 [KEY_B] = "B", [KEY_N] = "N",
531 [KEY_M] = "M", [KEY_COMMA] = "Comma",
532 [KEY_DOT] = "Dot", [KEY_SLASH] = "Slash",
533 [KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk",
534 [KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space",
535 [KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1",
536 [KEY_F2] = "F2", [KEY_F3] = "F3",
537 [KEY_F4] = "F4", [KEY_F5] = "F5",
538 [KEY_F6] = "F6", [KEY_F7] = "F7",
539 [KEY_F8] = "F8", [KEY_F9] = "F9",
540 [KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock",
541 [KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7",
542 [KEY_KP8] = "KP8", [KEY_KP9] = "KP9",
543 [KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4",
544 [KEY_KP5] = "KP5", [KEY_KP6] = "KP6",
545 [KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1",
546 [KEY_KP2] = "KP2", [KEY_KP3] = "KP3",
547 [KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot",
548 [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd",
549 [KEY_F11] = "F11", [KEY_F12] = "F12",
550 [KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana",
551 [KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan",
552 [KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan",
553 [KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter",
554 [KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash",
555 [KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt",
556 [KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home",
557 [KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp",
558 [KEY_LEFT] = "Left", [KEY_RIGHT] = "Right",
559 [KEY_END] = "End", [KEY_DOWN] = "Down",
560 [KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert",
561 [KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro",
562 [KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown",
563 [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power",
564 [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus",
565 [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma",
566 [KEY_HANGUEL] = "Hangeul", [KEY_HANJA] = "Hanja",
567 [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta",
568 [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose",
569 [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again",
570 [KEY_PROPS] = "Props", [KEY_UNDO] = "Undo",
571 [KEY_FRONT] = "Front", [KEY_COPY] = "Copy",
572 [KEY_OPEN] = "Open", [KEY_PASTE] = "Paste",
573 [KEY_FIND] = "Find", [KEY_CUT] = "Cut",
574 [KEY_HELP] = "Help", [KEY_MENU] = "Menu",
575 [KEY_CALC] = "Calc", [KEY_SETUP] = "Setup",
576 [KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp",
577 [KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile",
578 [KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer",
579 [KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2",
580 [KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS",
581 [KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction",
582 [KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail",
583 [KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer",
584 [KEY_BACK] = "Back", [KEY_FORWARD] = "Forward",
585 [KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD",
586 [KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong",
587 [KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong",
588 [KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record",
589 [KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone",
590 [KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config",
591 [KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh",
592 [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move",
593 [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp",
594 [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis",
595 [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_NEW] = "New",
596 [KEY_REDO] = "Redo", [KEY_F13] = "F13",
597 [KEY_F14] = "F14", [KEY_F15] = "F15",
598 [KEY_F16] = "F16", [KEY_F17] = "F17",
599 [KEY_F18] = "F18", [KEY_F19] = "F19",
600 [KEY_F20] = "F20", [KEY_F21] = "F21",
601 [KEY_F22] = "F22", [KEY_F23] = "F23",
602 [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD",
603 [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",
604 [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",
605 [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",
606 [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost",
607 [KEY_PRINT] = "Print", [KEY_HP] = "HP",
608 [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound",
609 [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email",
610 [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search",
611 [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance",
612 [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop",
613 [KEY_ALTERASE] = "AlternateErase", [KEY_CANCEL] = "Cancel",
614 [KEY_BRIGHTNESSDOWN] = "BrightnessDown", [KEY_BRIGHTNESSUP] = "BrightnessUp",
615 [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown",
616 [BTN_0] = "Btn0", [BTN_1] = "Btn1",
617 [BTN_2] = "Btn2", [BTN_3] = "Btn3",
618 [BTN_4] = "Btn4", [BTN_5] = "Btn5",
619 [BTN_6] = "Btn6", [BTN_7] = "Btn7",
620 [BTN_8] = "Btn8", [BTN_9] = "Btn9",
621 [BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn",
622 [BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn",
623 [BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn",
624 [BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn",
625 [BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn",
626 [BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn",
627 [BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn",
628 [BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2",
629 [BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4",
630 [BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6",
631 [BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA",
632 [BTN_B] = "BtnB", [BTN_C] = "BtnC",
633 [BTN_X] = "BtnX", [BTN_Y] = "BtnY",
634 [BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL",
635 [BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2",
636 [BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect",
637 [BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode",
638 [BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR",
639 [BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber",
640 [BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil",
641 [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger",
642 [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens",
643 [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus",
644 [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap",
645 [BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_GEAR_DOWN] = "WheelBtn",
646 [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok",
647 [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",
648 [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",
649 [KEY_OPTION] = "Option", [KEY_INFO] = "Info",
650 [KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor",
651 [KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program",
652 [KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites",
653 [KEY_EPG] = "EPG", [KEY_PVR] = "PVR",
654 [KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language",
655 [KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle",
656 [KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom",
657 [KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard",
658 [KEY_SCREEN] = "Screen", [KEY_PC] = "PC",
659 [KEY_TV] = "TV", [KEY_TV2] = "TV2",
660 [KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2",
661 [KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2",
662 [KEY_CD] = "CD", [KEY_TAPE] = "Tape",
663 [KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner",
664 [KEY_PLAYER] = "Player", [KEY_TEXT] = "Text",
665 [KEY_DVD] = "DVD", [KEY_AUX] = "Aux",
666 [KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio",
667 [KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory",
668 [KEY_LIST] = "List", [KEY_MEMO] = "Memo",
669 [KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red",
670 [KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow",
671 [KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp",
672 [KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First",
673 [KEY_LAST] = "Last", [KEY_AB] = "AB",
674 [KEY_NEXT] = "Next", [KEY_RESTART] = "Restart",
675 [KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle",
676 [KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous",
677 [KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN",
678 [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL",
679 [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine",
680 [KEY_DEL_LINE] = "DeleteLine",
681 [KEY_SEND] = "Send", [KEY_REPLY] = "Reply",
682 [KEY_FORWARDMAIL] = "ForwardMail", [KEY_SAVE] = "Save",
683 [KEY_DOCUMENTS] = "Documents",
684 [KEY_FN] = "Fn", [KEY_FN_ESC] = "Fn+ESC",
685 [KEY_FN_1] = "Fn+1", [KEY_FN_2] = "Fn+2",
686 [KEY_FN_B] = "Fn+B", [KEY_FN_D] = "Fn+D",
687 [KEY_FN_E] = "Fn+E", [KEY_FN_F] = "Fn+F",
688 [KEY_FN_S] = "Fn+S",
689 [KEY_FN_F1] = "Fn+F1", [KEY_FN_F2] = "Fn+F2",
690 [KEY_FN_F3] = "Fn+F3", [KEY_FN_F4] = "Fn+F4",
691 [KEY_FN_F5] = "Fn+F5", [KEY_FN_F6] = "Fn+F6",
692 [KEY_FN_F7] = "Fn+F7", [KEY_FN_F8] = "Fn+F8",
693 [KEY_FN_F9] = "Fn+F9", [KEY_FN_F10] = "Fn+F10",
694 [KEY_FN_F11] = "Fn+F11", [KEY_FN_F12] = "Fn+F12",
695 [KEY_KBDILLUMTOGGLE] = "KbdIlluminationToggle",
696 [KEY_KBDILLUMDOWN] = "KbdIlluminationDown",
697 [KEY_KBDILLUMUP] = "KbdIlluminationUp",
698 [KEY_SWITCHVIDEOMODE] = "SwitchVideoMode",
699};
700
701static char *relatives[REL_MAX + 1] = {
702 [REL_X] = "X", [REL_Y] = "Y",
703 [REL_Z] = "Z", [REL_RX] = "Rx",
704 [REL_RY] = "Ry", [REL_RZ] = "Rz",
705 [REL_HWHEEL] = "HWheel", [REL_DIAL] = "Dial",
706 [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc",
707};
708
709static char *absolutes[ABS_MAX + 1] = {
710 [ABS_X] = "X", [ABS_Y] = "Y",
711 [ABS_Z] = "Z", [ABS_RX] = "Rx",
712 [ABS_RY] = "Ry", [ABS_RZ] = "Rz",
713 [ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder",
714 [ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas",
715 [ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X",
716 [ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X",
717 [ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X",
718 [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X",
719 [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure",
720 [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt",
721 [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width",
722 [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc",
723};
724 26
725static char *misc[MSC_MAX + 1] = { 27void hid_dump_input(struct hid_usage *, __s32);
726 [MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled", 28void hid_dump_device(struct hid_device *);
727 [MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData" 29void hid_dump_field(struct hid_field *, int);
728}; 30void hid_resolv_usage(unsigned);
31void hid_resolv_event(__u8, __u16);
729 32
730static char *leds[LED_MAX + 1] = { 33#else
731 [LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock",
732 [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose",
733 [LED_KANA] = "Kana", [LED_SLEEP] = "Sleep",
734 [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute",
735 [LED_MISC] = "Misc",
736};
737 34
738static char *repeats[REP_MAX + 1] = { 35#define hid_dump_input(a,b) do { } while (0)
739 [REP_DELAY] = "Delay", [REP_PERIOD] = "Period" 36#define hid_dump_device(c) do { } while (0)
740}; 37#define hid_dump_field(a,b) do { } while (0)
38#define hid_resolv_usage(a) do { } while (0)
39#define hid_resolv_event(a,b) do { } while (0)
741 40
742static char *sounds[SND_MAX + 1] = { 41#endif /* CONFIG_HID_DEBUG */
743 [SND_CLICK] = "Click", [SND_BELL] = "Bell",
744 [SND_TONE] = "Tone"
745};
746 42
747static char **names[EV_MAX + 1] = {
748 [EV_SYN] = syncs, [EV_KEY] = keys,
749 [EV_REL] = relatives, [EV_ABS] = absolutes,
750 [EV_MSC] = misc, [EV_LED] = leds,
751 [EV_SND] = sounds, [EV_REP] = repeats,
752};
753 43
754static void __attribute__((unused)) resolv_event(__u8 type, __u16 code) { 44#endif
755 45
756 printk("%s.%s", events[type] ? events[type] : "?",
757 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
758}
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 18d0f2ce817f..189460e7b03f 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -472,16 +472,6 @@ struct hid_descriptor {
472 struct hid_class_descriptor desc[1]; 472 struct hid_class_descriptor desc[1];
473} __attribute__ ((packed)); 473} __attribute__ ((packed));
474 474
475#ifdef DEBUG
476#include "hid-debug.h"
477#else
478#define hid_dump_input(a,b) do { } while (0)
479#define hid_dump_device(c) do { } while (0)
480#define hid_dump_field(a,b) do { } while (0)
481#define resolv_usage(a) do { } while (0)
482#define resolv_event(a,b) do { } while (0)
483#endif
484
485/* Applications from HID Usage Tables 4/8/99 Version 1.1 */ 475/* Applications from HID Usage Tables 4/8/99 Version 1.1 */
486/* We ignore a few input applications that are not widely used */ 476/* We ignore a few input applications that are not widely used */
487#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001)) 477#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001))