Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

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