aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Tissoires <bentiss@kernel.org>2024-06-27 11:54:17 +0200
committerBenjamin Tissoires <bentiss@kernel.org>2024-07-01 14:48:18 +0200
commit8a89db51873ca574de45b25fce68103f34266459 (patch)
tree950d448761d56272fceb7d76bd76ddcf87d9f6a4
parentc79de517a226b86419a5baa867e65e3f8118829f (diff)
HID: bpf: Add a HID report composition helper macros
These macros make it slightly easier and more modular to create a HID report descriptor from scratch. Since they carry the annotation we don't need to comment it and they cannot get stale. For comparison, before we had this: 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x95, 0x04, // Report Count (4) 0x75, 0x01, // Report Size (1) Now we can write this as: LogicalRange_i8(0, 1) ReportCount(4) ReportSize(1) Because these macros are for creating new report descriptors, some bits aren't directly exposed. e.g in the example above: there is a logical range as one macro that sets both min and max. There is seldom a good use case for skipping either anyway. These macros will need to be expanded over time. For Usage Pages and Usage IDs, we use a tool to parse the HUT JSON (attached to the HUT 1.5 PDF [1]) and generate all #defines for all usage pages and usages in the form: #define UsagePage_Foo_Bar #define Usage_FB_SomeOrOther Where the FB is simply the acronym based on the capital letters in the Usage Page name or the first three letters, whichever makes slightly more sense. [1] https://usb.org/document-library/hid-usage-tables-15 Link: https://gitlab.freedesktop.org/libevdev/udev-hid-bpf/-/merge_requests/92 Link: https://gitlab.freedesktop.org/libevdev/udev-hid-bpf/-/merge_requests/96 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Link: https://patch.msgid.link/20240627-import-bpf-v1-1-0dbcda4a5b1f@kernel.org Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
-rw-r--r--drivers/hid/bpf/progs/hid_report_helpers.h2960
1 files changed, 2960 insertions, 0 deletions
diff --git a/drivers/hid/bpf/progs/hid_report_helpers.h b/drivers/hid/bpf/progs/hid_report_helpers.h
new file mode 100644
index 000000000000..0aa1df438eeb
--- /dev/null
+++ b/drivers/hid/bpf/progs/hid_report_helpers.h
@@ -0,0 +1,2960 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* Copyright (c) 2024 Red Hat, Inc
+ */
+
+// THIS FILE IS GENERATED, DO NOT EDIT
+
+#pragma once
+
+
+/* Macros for composing HID reports.
+ *
+ * HID Fields are added manually to the template, please add to it as needed
+ * for any individual device. The Usage Pages and Usages are generated.
+ *
+ * Some macros have a _i8, _i16, or _i32 suffix. Pick the
+ * right suffix given the passed-in value.
+ */
+
+/*
+ * This macro behaves like static_assert(), failing to
+ * compile if its argument is not true. However, it always
+ * returns 0, which allows using it everywhere an expression
+ * can be used.
+ */
+#define must_be(e, msg_) \
+( \
+ 0 * (int) sizeof( \
+ struct { \
+ _Static_assert(e, msg_); \
+ int ISO_C_forbids_a_struct_with_no_members; \
+ } \
+ ) \
+)
+
+/* Ensure the given value fits within 8/16/32 bits */
+#define i4(v_) (((__u8)(v_) & 0xf) + must_be((v_) >= -0x8 && (v_) <= 0x7, "not a i4"))
+#define i8(v_) ((__u8)(v_) + must_be((v_) >= -0x80 && (v_) <= 0xff, "not a i8/u8"))
+#define i16(v_) ((__u16)(v_) + must_be((v_) >= -0x8000 && (v_) <= 0xffff, "not a i16/u16"))
+#define i32(v_) ((__u32)(v_) + must_be((v_) >= -0x80000000L && (v_) <= 0xffffffffL, \
+ "not a i32/u16"))
+
+/* Split a value across multiple bytes in LE order */
+#define LE16(v_) i16(v_) & 0xff, ((v_) >> 8) & 0xff
+#define LE32(v_) i32(v_) & 0xff, ((v_) >> 8) & 0xff, ((v_) >> 16) & 0xff, ((v_) >> 24) & 0xff
+
+/* Collections require two items in the report descriptor, the start
+ * of the collection (0xa?) and the EndCollection item (0xc?).
+ * This macro provides both, use like this:
+ *
+ * static const __u8 fixed_rdesc[] = {
+ * UsagePage_Generic_Desktop
+ * Usage_GD_Keyboard
+ * CollectionApplication( ← Open the collection
+ * ReportId(3)
+ * LogicalRange_i8(0, 1)
+ * // other fields
+ * ) ← End EndCollection
+ *
+ * Collections may be nested.
+ */
+#define Collection(col_, ...) 0xa1, i8(col_), __VA_ARGS__ 0xc0,
+#define CollectionPhysical(...) Collection(0x00, __VA_ARGS__)
+#define CollectionApplication(...) Collection(0x01, __VA_ARGS__)
+#define CollectionLogical(...) Collection(0x02, __VA_ARGS__)
+
+/* See Collections, this macro provides Push and Pop with
+ * elements in between
+ */
+#define PushPop(...) 0xa4, __VA_ARGS__ 0xb4,
+
+/* Arguments to use in bitwise-or for Input, Output, Feature */
+#define Const 0x1
+#define Var 0x2
+#define Arr 0x0
+#define Abs 0x0
+#define Rel 0x4
+
+/* Use like this: Input(Var|Abs) */
+#define Input(i_) 0x081, i8(i_),
+#define Output(i_) 0x091, i8(i_),
+#define Feature(i_) 0x0b1, i8(i_),
+
+#define ReportId(id_) 0x85, i8(id_),
+#define ReportSize(sz_) 0x75, i8(sz_),
+#define ReportCount(cnt_) 0x95, i8(cnt_),
+
+#define LogicalRange_i8(min_, max_) 0x15, i8(min_), 0x25, i8(max_),
+#define LogicalRange_i16(min_, max_) 0x16, LE16(min_), 0x26, LE16(max_),
+#define LogicalRange_i32(min_, max_) 0x17, LE32(min_), 0x27, LE32(max_),
+
+#define PhysicalRange_i8(min_, max_) 0x35, i8(min_), 0x45, i8(max_),
+#define PhysicalRange_i16(min_, max_) 0x36, LE16(min_), 0x46, LE16(max_),
+#define PhysicalRange_i32(min_, max_) 0x37, LE32(min_), 0x47, LE32(max_),
+
+#define UsageRange_i8(min_, max_) 0x19, i8(min_), 0x29, i8(max_),
+#define UsageRange_i16(min_, max_) 0x1a, LE16(min_), 0x2a, LE16(max_),
+
+#define UsagePage_i8(p_) 0x05, i8(p_),
+#define UsagePage_i16(p_) 0x06, LE16(p_),
+
+#define Usage_i8(u_) 0x09, i8(u_),
+#define Usage_i16(u_) 0x0a, LE16(u_),
+#define Usage_i32(u_) 0x0b, LE32(u_),
+
+#define SILinear 0x1
+#define SIRotation 0x2
+#define EnglishLinear 0x3
+#define EnglishRotation 0x4
+#define cm (SILinear | (0x1 << 4))
+#define rad (SIRotation | (0x1 << 4))
+#define deg (EnglishRotation | (0x1 << 4))
+#define in (EnglishLinear | (0x1 << 4))
+/* Use as Unit(cm) or Unit(rad) or similar.
+ * This macro currently defaults to exponent 1 only, so no
+ * cm^2 or others
+ */
+#define Unit(u_) Unit_i8(u_)
+#define Unit_i8(u_) 0x65, i8(u_),
+#define Unit_i16(u_) 0x66, i16(u_),
+#define Unit_i32(u_) 0x67, i32(u_),
+
+#define UnitExponent(u_) 0x55, i4(u_),
+
+/* A macro to generate a vendor-specific padding-only
+ * report with Report ID 0xac of the given size in bytes.
+ * The size is inclusive of the 1 byte Report ID prefix.
+ *
+ * HID-BPF requires that at least one report has
+ * the same size as the original report from the device.
+ * The easy way to ensure that is to add this
+ * macro as the last element of your CollectionApplication
+ * other reports can be of any size less than this.
+ *
+ * e.g.
+ * static __u8 fixed_rdesc = [
+ * UsagePage_Generic_Desktop
+ * Usage_GD_Keyboard
+ * CollectionApplication(
+ * ... intended rdesc items go here ...
+ * FixedSizeVendorReport(12)
+ * )
+ * ];
+ *
+ * If the FixedSizeVendorReport is placed outside
+ * a CollectionApplication it will result in
+ * an extra useless evdev node being created.
+ */
+#define FixedSizeVendorReport(bytes_) \
+ UsagePage_Vendor(0xffff) \
+ Usage_i8(0x01) \
+ CollectionPhysical( \
+ ReportId(0xac) \
+ ReportSize(8) \
+ ReportCount((bytes_) - 1) \
+ Input(Const) \
+ )
+
+/* ----- Generated Usage Pages and Usages ------ */
+#define UsagePage_GenericDesktop UsagePage_i8(0x1)
+#define UsagePage_SimulationControls UsagePage_i8(0x2)
+#define UsagePage_VRControls UsagePage_i8(0x3)
+#define UsagePage_SportControls UsagePage_i8(0x4)
+#define UsagePage_GameControls UsagePage_i8(0x5)
+#define UsagePage_GenericDeviceControls UsagePage_i8(0x6)
+#define UsagePage_KeyboardKeypad UsagePage_i8(0x7)
+#define UsagePage_LED UsagePage_i8(0x8)
+#define UsagePage_Button UsagePage_i8(0x9)
+#define UsagePage_Ordinal UsagePage_i8(0xa)
+#define UsagePage_TelephonyDevice UsagePage_i8(0xb)
+#define UsagePage_Consumer UsagePage_i8(0xc)
+#define UsagePage_Digitizers UsagePage_i8(0xd)
+#define UsagePage_Haptics UsagePage_i8(0xe)
+#define UsagePage_PhysicalInputDevice UsagePage_i8(0xf)
+#define UsagePage_Unicode UsagePage_i8(0x10)
+#define UsagePage_SoC UsagePage_i8(0x11)
+#define UsagePage_EyeandHeadTrackers UsagePage_i8(0x12)
+#define UsagePage_AuxiliaryDisplay UsagePage_i8(0x14)
+#define UsagePage_Sensors UsagePage_i8(0x20)
+#define UsagePage_MedicalInstrument UsagePage_i8(0x40)
+#define UsagePage_BrailleDisplay UsagePage_i8(0x41)
+#define UsagePage_LightingAndIllumination UsagePage_i8(0x59)
+#define UsagePage_Monitor UsagePage_i8(0x80)
+#define UsagePage_MonitorEnumerated UsagePage_i8(0x81)
+#define UsagePage_VESAVirtualControls UsagePage_i8(0x82)
+#define UsagePage_Power UsagePage_i8(0x84)
+#define UsagePage_BatterySystem UsagePage_i8(0x85)
+#define UsagePage_BarcodeScanner UsagePage_i8(0x8c)
+#define UsagePage_Scales UsagePage_i8(0x8d)
+#define UsagePage_MagneticStripeReader UsagePage_i8(0x8e)
+#define UsagePage_CameraControl UsagePage_i8(0x90)
+#define UsagePage_Arcade UsagePage_i8(0x91)
+#define UsagePage_FIDOAlliance UsagePage_i16(0xf1d0)
+#define UsagePage_Vendor(u_) \
+ UsagePage_i16((u_) + must_be(((u_) & 0xff00) == 0xff00, "not a 0xff00 vendor page"))
+
+#define Usage_GD_Pointer Usage_i8(0x1)
+#define Usage_GD_Mouse Usage_i8(0x2)
+#define Usage_GD_Joystick Usage_i8(0x4)
+#define Usage_GD_Gamepad Usage_i8(0x5)
+#define Usage_GD_Keyboard Usage_i8(0x6)
+#define Usage_GD_Keypad Usage_i8(0x7)
+#define Usage_GD_MultiaxisController Usage_i8(0x8)
+#define Usage_GD_TabletPCSystemControls Usage_i8(0x9)
+#define Usage_GD_WaterCoolingDevice Usage_i8(0xa)
+#define Usage_GD_ComputerChassisDevice Usage_i8(0xb)
+#define Usage_GD_WirelessRadioControls Usage_i8(0xc)
+#define Usage_GD_PortableDeviceControl Usage_i8(0xd)
+#define Usage_GD_SystemMultiAxisController Usage_i8(0xe)
+#define Usage_GD_SpatialController Usage_i8(0xf)
+#define Usage_GD_AssistiveControl Usage_i8(0x10)
+#define Usage_GD_DeviceDock Usage_i8(0x11)
+#define Usage_GD_DockableDevice Usage_i8(0x12)
+#define Usage_GD_CallStateManagementControl Usage_i8(0x13)
+#define Usage_GD_X Usage_i8(0x30)
+#define Usage_GD_Y Usage_i8(0x31)
+#define Usage_GD_Z Usage_i8(0x32)
+#define Usage_GD_Rx Usage_i8(0x33)
+#define Usage_GD_Ry Usage_i8(0x34)
+#define Usage_GD_Rz Usage_i8(0x35)
+#define Usage_GD_Slider Usage_i8(0x36)
+#define Usage_GD_Dial Usage_i8(0x37)
+#define Usage_GD_Wheel Usage_i8(0x38)
+#define Usage_GD_HatSwitch Usage_i8(0x39)
+#define Usage_GD_CountedBuffer Usage_i8(0x3a)
+#define Usage_GD_ByteCount Usage_i8(0x3b)
+#define Usage_GD_MotionWakeup Usage_i8(0x3c)
+#define Usage_GD_Start Usage_i8(0x3d)
+#define Usage_GD_Select Usage_i8(0x3e)
+#define Usage_GD_Vx Usage_i8(0x40)
+#define Usage_GD_Vy Usage_i8(0x41)
+#define Usage_GD_Vz Usage_i8(0x42)
+#define Usage_GD_Vbrx Usage_i8(0x43)
+#define Usage_GD_Vbry Usage_i8(0x44)
+#define Usage_GD_Vbrz Usage_i8(0x45)
+#define Usage_GD_Vno Usage_i8(0x46)
+#define Usage_GD_FeatureNotification Usage_i8(0x47)
+#define Usage_GD_ResolutionMultiplier Usage_i8(0x48)
+#define Usage_GD_Qx Usage_i8(0x49)
+#define Usage_GD_Qy Usage_i8(0x4a)
+#define Usage_GD_Qz Usage_i8(0x4b)
+#define Usage_GD_Qw Usage_i8(0x4c)
+#define Usage_GD_SystemControl Usage_i8(0x80)
+#define Usage_GD_SystemPowerDown Usage_i8(0x81)
+#define Usage_GD_SystemSleep Usage_i8(0x82)
+#define Usage_GD_SystemWakeUp Usage_i8(0x83)
+#define Usage_GD_SystemContextMenu Usage_i8(0x84)
+#define Usage_GD_SystemMainMenu Usage_i8(0x85)
+#define Usage_GD_SystemAppMenu Usage_i8(0x86)
+#define Usage_GD_SystemMenuHelp Usage_i8(0x87)
+#define Usage_GD_SystemMenuExit Usage_i8(0x88)
+#define Usage_GD_SystemMenuSelect Usage_i8(0x89)
+#define Usage_GD_SystemMenuRight Usage_i8(0x8a)
+#define Usage_GD_SystemMenuLeft Usage_i8(0x8b)
+#define Usage_GD_SystemMenuUp Usage_i8(0x8c)
+#define Usage_GD_SystemMenuDown Usage_i8(0x8d)
+#define Usage_GD_SystemColdRestart Usage_i8(0x8e)
+#define Usage_GD_SystemWarmRestart Usage_i8(0x8f)
+#define Usage_GD_DpadUp Usage_i8(0x90)
+#define Usage_GD_DpadDown Usage_i8(0x91)
+#define Usage_GD_DpadRight Usage_i8(0x92)
+#define Usage_GD_DpadLeft Usage_i8(0x93)
+#define Usage_GD_IndexTrigger Usage_i8(0x94)
+#define Usage_GD_PalmTrigger Usage_i8(0x95)
+#define Usage_GD_Thumbstick Usage_i8(0x96)
+#define Usage_GD_SystemFunctionShift Usage_i8(0x97)
+#define Usage_GD_SystemFunctionShiftLock Usage_i8(0x98)
+#define Usage_GD_SystemFunctionShiftLockIndicator Usage_i8(0x99)
+#define Usage_GD_SystemDismissNotification Usage_i8(0x9a)
+#define Usage_GD_SystemDoNotDisturb Usage_i8(0x9b)
+#define Usage_GD_SystemDock Usage_i8(0xa0)
+#define Usage_GD_SystemUndock Usage_i8(0xa1)
+#define Usage_GD_SystemSetup Usage_i8(0xa2)
+#define Usage_GD_SystemBreak Usage_i8(0xa3)
+#define Usage_GD_SystemDebuggerBreak Usage_i8(0xa4)
+#define Usage_GD_ApplicationBreak Usage_i8(0xa5)
+#define Usage_GD_ApplicationDebuggerBreak Usage_i8(0xa6)
+#define Usage_GD_SystemSpeakerMute Usage_i8(0xa7)
+#define Usage_GD_SystemHibernate Usage_i8(0xa8)
+#define Usage_GD_SystemMicrophoneMute Usage_i8(0xa9)
+#define Usage_GD_SystemDisplayInvert Usage_i8(0xb0)
+#define Usage_GD_SystemDisplayInternal Usage_i8(0xb1)
+#define Usage_GD_SystemDisplayExternal Usage_i8(0xb2)
+#define Usage_GD_SystemDisplayBoth Usage_i8(0xb3)
+#define Usage_GD_SystemDisplayDual Usage_i8(0xb4)
+#define Usage_GD_SystemDisplayToggleIntExtMode Usage_i8(0xb5)
+#define Usage_GD_SystemDisplaySwapPrimarySecondary Usage_i8(0xb6)
+#define Usage_GD_SystemDisplayToggleLCDAutoscale Usage_i8(0xb7)
+#define Usage_GD_SensorZone Usage_i8(0xc0)
+#define Usage_GD_RPM Usage_i8(0xc1)
+#define Usage_GD_CoolantLevel Usage_i8(0xc2)
+#define Usage_GD_CoolantCriticalLevel Usage_i8(0xc3)
+#define Usage_GD_CoolantPump Usage_i8(0xc4)
+#define Usage_GD_ChassisEnclosure Usage_i8(0xc5)
+#define Usage_GD_WirelessRadioButton Usage_i8(0xc6)
+#define Usage_GD_WirelessRadioLED Usage_i8(0xc7)
+#define Usage_GD_WirelessRadioSliderSwitch Usage_i8(0xc8)
+#define Usage_GD_SystemDisplayRotationLockButton Usage_i8(0xc9)
+#define Usage_GD_SystemDisplayRotationLockSliderSwitch Usage_i8(0xca)
+#define Usage_GD_ControlEnable Usage_i8(0xcb)
+#define Usage_GD_DockableDeviceUniqueID Usage_i8(0xd0)
+#define Usage_GD_DockableDeviceVendorID Usage_i8(0xd1)
+#define Usage_GD_DockableDevicePrimaryUsagePage Usage_i8(0xd2)
+#define Usage_GD_DockableDevicePrimaryUsageID Usage_i8(0xd3)
+#define Usage_GD_DockableDeviceDockingState Usage_i8(0xd4)
+#define Usage_GD_DockableDeviceDisplayOcclusion Usage_i8(0xd5)
+#define Usage_GD_DockableDeviceObjectType Usage_i8(0xd6)
+#define Usage_GD_CallActiveLED Usage_i8(0xe0)
+#define Usage_GD_CallMuteToggle Usage_i8(0xe1)
+#define Usage_GD_CallMuteLED Usage_i8(0xe2)
+#define Usage_SC_FlightSimulationDevice Usage_i8(0x1)
+#define Usage_SC_AutomobileSimulationDevice Usage_i8(0x2)
+#define Usage_SC_TankSimulationDevice Usage_i8(0x3)
+#define Usage_SC_SpaceshipSimulationDevice Usage_i8(0x4)
+#define Usage_SC_SubmarineSimulationDevice Usage_i8(0x5)
+#define Usage_SC_SailingSimulationDevice Usage_i8(0x6)
+#define Usage_SC_MotorcycleSimulationDevice Usage_i8(0x7)
+#define Usage_SC_SportsSimulationDevice Usage_i8(0x8)
+#define Usage_SC_AirplaneSimulationDevice Usage_i8(0x9)
+#define Usage_SC_HelicopterSimulationDevice Usage_i8(0xa)
+#define Usage_SC_MagicCarpetSimulationDevice Usage_i8(0xb)
+#define Usage_SC_BicycleSimulationDevice Usage_i8(0xc)
+#define Usage_SC_FlightControlStick Usage_i8(0x20)
+#define Usage_SC_FlightStick Usage_i8(0x21)
+#define Usage_SC_CyclicControl Usage_i8(0x22)
+#define Usage_SC_CyclicTrim Usage_i8(0x23)
+#define Usage_SC_FlightYoke Usage_i8(0x24)
+#define Usage_SC_TrackControl Usage_i8(0x25)
+#define Usage_SC_Aileron Usage_i8(0xb0)
+#define Usage_SC_AileronTrim Usage_i8(0xb1)
+#define Usage_SC_AntiTorqueControl Usage_i8(0xb2)
+#define Usage_SC_AutopilotEnable Usage_i8(0xb3)
+#define Usage_SC_ChaffRelease Usage_i8(0xb4)
+#define Usage_SC_CollectiveControl Usage_i8(0xb5)
+#define Usage_SC_DiveBrake Usage_i8(0xb6)
+#define Usage_SC_ElectronicCountermeasures Usage_i8(0xb7)
+#define Usage_SC_Elevator Usage_i8(0xb8)
+#define Usage_SC_ElevatorTrim Usage_i8(0xb9)
+#define Usage_SC_Rudder Usage_i8(0xba)
+#define Usage_SC_Throttle Usage_i8(0xbb)
+#define Usage_SC_FlightCommunications Usage_i8(0xbc)
+#define Usage_SC_FlareRelease Usage_i8(0xbd)
+#define Usage_SC_LandingGear Usage_i8(0xbe)
+#define Usage_SC_ToeBrake Usage_i8(0xbf)
+#define Usage_SC_Trigger Usage_i8(0xc0)
+#define Usage_SC_WeaponsArm Usage_i8(0xc1)
+#define Usage_SC_WeaponsSelect Usage_i8(0xc2)
+#define Usage_SC_WingFlaps Usage_i8(0xc3)
+#define Usage_SC_Accelerator Usage_i8(0xc4)
+#define Usage_SC_Brake Usage_i8(0xc5)
+#define Usage_SC_Clutch Usage_i8(0xc6)
+#define Usage_SC_Shifter Usage_i8(0xc7)
+#define Usage_SC_Steering Usage_i8(0xc8)
+#define Usage_SC_TurretDirection Usage_i8(0xc9)
+#define Usage_SC_BarrelElevation Usage_i8(0xca)
+#define Usage_SC_DivePlane Usage_i8(0xcb)
+#define Usage_SC_Ballast Usage_i8(0xcc)
+#define Usage_SC_BicycleCrank Usage_i8(0xcd)
+#define Usage_SC_HandleBars Usage_i8(0xce)
+#define Usage_SC_FrontBrake Usage_i8(0xcf)
+#define Usage_SC_RearBrake Usage_i8(0xd0)
+#define Usage_VRC_Belt Usage_i8(0x1)
+#define Usage_VRC_BodySuit Usage_i8(0x2)
+#define Usage_VRC_Flexor Usage_i8(0x3)
+#define Usage_VRC_Glove Usage_i8(0x4)
+#define Usage_VRC_HeadTracker Usage_i8(0x5)
+#define Usage_VRC_HeadMountedDisplay Usage_i8(0x6)
+#define Usage_VRC_HandTracker Usage_i8(0x7)
+#define Usage_VRC_Oculometer Usage_i8(0x8)
+#define Usage_VRC_Vest Usage_i8(0x9)
+#define Usage_VRC_AnimatronicDevice Usage_i8(0xa)
+#define Usage_VRC_StereoEnable Usage_i8(0x20)
+#define Usage_VRC_DisplayEnable Usage_i8(0x21)
+#define Usage_SC_BaseballBat Usage_i8(0x1)
+#define Usage_SC_GolfClub Usage_i8(0x2)
+#define Usage_SC_RowingMachine Usage_i8(0x3)
+#define Usage_SC_Treadmill Usage_i8(0x4)
+#define Usage_SC_Oar Usage_i8(0x30)
+#define Usage_SC_Slope Usage_i8(0x31)
+#define Usage_SC_Rate Usage_i8(0x32)
+#define Usage_SC_StickSpeed Usage_i8(0x33)
+#define Usage_SC_StickFaceAngle Usage_i8(0x34)
+#define Usage_SC_StickHeelToe Usage_i8(0x35)
+#define Usage_SC_StickFollowThrough Usage_i8(0x36)
+#define Usage_SC_StickTempo Usage_i8(0x37)
+#define Usage_SC_StickType Usage_i8(0x38)
+#define Usage_SC_StickHeight Usage_i8(0x39)
+#define Usage_SC_Putter Usage_i8(0x50)
+#define Usage_SC_OneIron Usage_i8(0x51)
+#define Usage_SC_TwoIron Usage_i8(0x52)
+#define Usage_SC_ThreeIron Usage_i8(0x53)
+#define Usage_SC_FourIron Usage_i8(0x54)
+#define Usage_SC_FiveIron Usage_i8(0x55)
+#define Usage_SC_SixIron Usage_i8(0x56)
+#define Usage_SC_SevenIron Usage_i8(0x57)
+#define Usage_SC_EightIron Usage_i8(0x58)
+#define Usage_SC_NineIron Usage_i8(0x59)
+#define Usage_SC_One0Iron Usage_i8(0x5a)
+#define Usage_SC_One1Iron Usage_i8(0x5b)
+#define Usage_SC_SandWedge Usage_i8(0x5c)
+#define Usage_SC_LoftWedge Usage_i8(0x5d)
+#define Usage_SC_PowerWedge Usage_i8(0x5e)
+#define Usage_SC_OneWood Usage_i8(0x5f)
+#define Usage_SC_ThreeWood Usage_i8(0x60)
+#define Usage_SC_FiveWood Usage_i8(0x61)
+#define Usage_SC_SevenWood Usage_i8(0x62)
+#define Usage_SC_NineWood Usage_i8(0x63)
+#define Usage_GC_ThreeDGameController Usage_i8(0x1)
+#define Usage_GC_PinballDevice Usage_i8(0x2)
+#define Usage_GC_GunDevice Usage_i8(0x3)
+#define Usage_GC_PointofView Usage_i8(0x20)
+#define Usage_GC_TurnRightLeft Usage_i8(0x21)
+#define Usage_GC_PitchForwardBackward Usage_i8(0x22)
+#define Usage_GC_RollRightLeft Usage_i8(0x23)
+#define Usage_GC_MoveRightLeft Usage_i8(0x24)
+#define Usage_GC_MoveForwardBackward Usage_i8(0x25)
+#define Usage_GC_MoveUpDown Usage_i8(0x26)
+#define Usage_GC_LeanRightLeft Usage_i8(0x27)
+#define Usage_GC_LeanForwardBackward Usage_i8(0x28)
+#define Usage_GC_HeightofPOV Usage_i8(0x29)
+#define Usage_GC_Flipper Usage_i8(0x2a)
+#define Usage_GC_SecondaryFlipper Usage_i8(0x2b)
+#define Usage_GC_Bump Usage_i8(0x2c)
+#define Usage_GC_NewGame Usage_i8(0x2d)
+#define Usage_GC_ShootBall Usage_i8(0x2e)
+#define Usage_GC_Player Usage_i8(0x2f)
+#define Usage_GC_GunBolt Usage_i8(0x30)
+#define Usage_GC_GunClip Usage_i8(0x31)
+#define Usage_GC_GunSelector Usage_i8(0x32)
+#define Usage_GC_GunSingleShot Usage_i8(0x33)
+#define Usage_GC_GunBurst Usage_i8(0x34)
+#define Usage_GC_GunAutomatic Usage_i8(0x35)
+#define Usage_GC_GunSafety Usage_i8(0x36)
+#define Usage_GC_GamepadFireJump Usage_i8(0x37)
+#define Usage_GC_GamepadTrigger Usage_i8(0x39)
+#define Usage_GC_FormfittingGamepad Usage_i8(0x3a)
+#define Usage_GDC_BackgroundNonuserControls Usage_i8(0x1)
+#define Usage_GDC_BatteryStrength Usage_i8(0x20)
+#define Usage_GDC_WirelessChannel Usage_i8(0x21)
+#define Usage_GDC_WirelessID Usage_i8(0x22)
+#define Usage_GDC_DiscoverWirelessControl Usage_i8(0x23)
+#define Usage_GDC_SecurityCodeCharacterEntered Usage_i8(0x24)
+#define Usage_GDC_SecurityCodeCharacterErased Usage_i8(0x25)
+#define Usage_GDC_SecurityCodeCleared Usage_i8(0x26)
+#define Usage_GDC_SequenceID Usage_i8(0x27)
+#define Usage_GDC_SequenceIDReset Usage_i8(0x28)
+#define Usage_GDC_RFSignalStrength Usage_i8(0x29)
+#define Usage_GDC_SoftwareVersion Usage_i8(0x2a)
+#define Usage_GDC_ProtocolVersion Usage_i8(0x2b)
+#define Usage_GDC_HardwareVersion Usage_i8(0x2c)
+#define Usage_GDC_Major Usage_i8(0x2d)
+#define Usage_GDC_Minor Usage_i8(0x2e)
+#define Usage_GDC_Revision Usage_i8(0x2f)
+#define Usage_GDC_Handedness Usage_i8(0x30)
+#define Usage_GDC_EitherHand Usage_i8(0x31)
+#define Usage_GDC_LeftHand Usage_i8(0x32)
+#define Usage_GDC_RightHand Usage_i8(0x33)
+#define Usage_GDC_BothHands Usage_i8(0x34)
+#define Usage_GDC_GripPoseOffset Usage_i8(0x40)
+#define Usage_GDC_PointerPoseOffset Usage_i8(0x41)
+#define Usage_KK_ErrorRollOver Usage_i8(0x1)
+#define Usage_KK_POSTFail Usage_i8(0x2)
+#define Usage_KK_ErrorUndefined Usage_i8(0x3)
+#define Usage_KK_KeyboardA Usage_i8(0x4)
+#define Usage_KK_KeyboardB Usage_i8(0x5)
+#define Usage_KK_KeyboardC Usage_i8(0x6)
+#define Usage_KK_KeyboardD Usage_i8(0x7)
+#define Usage_KK_KeyboardE Usage_i8(0x8)
+#define Usage_KK_KeyboardF Usage_i8(0x9)
+#define Usage_KK_KeyboardG Usage_i8(0xa)
+#define Usage_KK_KeyboardH Usage_i8(0xb)
+#define Usage_KK_KeyboardI Usage_i8(0xc)
+#define Usage_KK_KeyboardJ Usage_i8(0xd)
+#define Usage_KK_KeyboardK Usage_i8(0xe)
+#define Usage_KK_KeyboardL Usage_i8(0xf)
+#define Usage_KK_KeyboardM Usage_i8(0x10)
+#define Usage_KK_KeyboardN Usage_i8(0x11)
+#define Usage_KK_KeyboardO Usage_i8(0x12)
+#define Usage_KK_KeyboardP Usage_i8(0x13)
+#define Usage_KK_KeyboardQ Usage_i8(0x14)
+#define Usage_KK_KeyboardR Usage_i8(0x15)
+#define Usage_KK_KeyboardS Usage_i8(0x16)
+#define Usage_KK_KeyboardT Usage_i8(0x17)
+#define Usage_KK_KeyboardU Usage_i8(0x18)
+#define Usage_KK_KeyboardV Usage_i8(0x19)
+#define Usage_KK_KeyboardW Usage_i8(0x1a)
+#define Usage_KK_KeyboardX Usage_i8(0x1b)
+#define Usage_KK_KeyboardY Usage_i8(0x1c)
+#define Usage_KK_KeyboardZ Usage_i8(0x1d)
+#define Usage_KK_Keyboard1andBang Usage_i8(0x1e)
+#define Usage_KK_Keyboard2andAt Usage_i8(0x1f)
+#define Usage_KK_Keyboard3andHash Usage_i8(0x20)
+#define Usage_KK_Keyboard4andDollar Usage_i8(0x21)
+#define Usage_KK_Keyboard5andPercent Usage_i8(0x22)
+#define Usage_KK_Keyboard6andCaret Usage_i8(0x23)
+#define Usage_KK_Keyboard7andAmpersand Usage_i8(0x24)
+#define Usage_KK_Keyboard8andStar Usage_i8(0x25)
+#define Usage_KK_Keyboard9andLeftBracket Usage_i8(0x26)
+#define Usage_KK_Keyboard0andRightBracket Usage_i8(0x27)
+#define Usage_KK_KeyboardReturnEnter Usage_i8(0x28)
+#define Usage_KK_KeyboardEscape Usage_i8(0x29)
+#define Usage_KK_KeyboardDelete Usage_i8(0x2a)
+#define Usage_KK_KeyboardTab Usage_i8(0x2b)
+#define Usage_KK_KeyboardSpacebar Usage_i8(0x2c)
+#define Usage_KK_KeyboardDashandUnderscore Usage_i8(0x2d)
+#define Usage_KK_KeyboardEqualsandPlus Usage_i8(0x2e)
+#define Usage_KK_KeyboardLeftBrace Usage_i8(0x2f)
+#define Usage_KK_KeyboardRightBrace Usage_i8(0x30)
+#define Usage_KK_KeyboardBackslashandPipe Usage_i8(0x31)
+#define Usage_KK_KeyboardNonUSHashandTilde Usage_i8(0x32)
+#define Usage_KK_KeyboardSemiColonandColon Usage_i8(0x33)
+#define Usage_KK_KeyboardLeftAposandDouble Usage_i8(0x34)
+#define Usage_KK_KeyboardGraveAccentandTilde Usage_i8(0x35)
+#define Usage_KK_KeyboardCommaandLessThan Usage_i8(0x36)
+#define Usage_KK_KeyboardPeriodandGreaterThan Usage_i8(0x37)
+#define Usage_KK_KeyboardForwardSlashandQuestionMark Usage_i8(0x38)
+#define Usage_KK_KeyboardCapsLock Usage_i8(0x39)
+#define Usage_KK_KeyboardF1 Usage_i8(0x3a)
+#define Usage_KK_KeyboardF2 Usage_i8(0x3b)
+#define Usage_KK_KeyboardF3 Usage_i8(0x3c)
+#define Usage_KK_KeyboardF4 Usage_i8(0x3d)
+#define Usage_KK_KeyboardF5 Usage_i8(0x3e)
+#define Usage_KK_KeyboardF6 Usage_i8(0x3f)
+#define Usage_KK_KeyboardF7 Usage_i8(0x40)
+#define Usage_KK_KeyboardF8 Usage_i8(0x41)
+#define Usage_KK_KeyboardF9 Usage_i8(0x42)
+#define Usage_KK_KeyboardF10 Usage_i8(0x43)
+#define Usage_KK_KeyboardF11 Usage_i8(0x44)
+#define Usage_KK_KeyboardF12 Usage_i8(0x45)
+#define Usage_KK_KeyboardPrintScreen Usage_i8(0x46)
+#define Usage_KK_KeyboardScrollLock Usage_i8(0x47)
+#define Usage_KK_KeyboardPause Usage_i8(0x48)
+#define Usage_KK_KeyboardInsert Usage_i8(0x49)
+#define Usage_KK_KeyboardHome Usage_i8(0x4a)
+#define Usage_KK_KeyboardPageUp Usage_i8(0x4b)
+#define Usage_KK_KeyboardDeleteForward Usage_i8(0x4c)
+#define Usage_KK_KeyboardEnd Usage_i8(0x4d)
+#define Usage_KK_KeyboardPageDown Usage_i8(0x4e)
+#define Usage_KK_KeyboardRightArrow Usage_i8(0x4f)
+#define Usage_KK_KeyboardLeftArrow Usage_i8(0x50)
+#define Usage_KK_KeyboardDownArrow Usage_i8(0x51)
+#define Usage_KK_KeyboardUpArrow Usage_i8(0x52)
+#define Usage_KK_KeypadNumLockandClear Usage_i8(0x53)
+#define Usage_KK_KeypadForwardSlash Usage_i8(0x54)
+#define Usage_KK_KeypadStar Usage_i8(0x55)
+#define Usage_KK_KeypadDash Usage_i8(0x56)
+#define Usage_KK_KeypadPlus Usage_i8(0x57)
+#define Usage_KK_KeypadENTER Usage_i8(0x58)
+#define Usage_KK_Keypad1andEnd Usage_i8(0x59)
+#define Usage_KK_Keypad2andDownArrow Usage_i8(0x5a)
+#define Usage_KK_Keypad3andPageDn Usage_i8(0x5b)
+#define Usage_KK_Keypad4andLeftArrow Usage_i8(0x5c)
+#define Usage_KK_Keypad5 Usage_i8(0x5d)
+#define Usage_KK_Keypad6andRightArrow Usage_i8(0x5e)
+#define Usage_KK_Keypad7andHome Usage_i8(0x5f)
+#define Usage_KK_Keypad8andUpArrow Usage_i8(0x60)
+#define Usage_KK_Keypad9andPageUp Usage_i8(0x61)
+#define Usage_KK_Keypad0andInsert Usage_i8(0x62)
+#define Usage_KK_KeypadPeriodandDelete Usage_i8(0x63)
+#define Usage_KK_KeyboardNonUSBackslashandPipe Usage_i8(0x64)
+#define Usage_KK_KeyboardApplication Usage_i8(0x65)
+#define Usage_KK_KeyboardPower Usage_i8(0x66)
+#define Usage_KK_KeypadEquals Usage_i8(0x67)
+#define Usage_KK_KeyboardF13 Usage_i8(0x68)
+#define Usage_KK_KeyboardF14 Usage_i8(0x69)
+#define Usage_KK_KeyboardF15 Usage_i8(0x6a)
+#define Usage_KK_KeyboardF16 Usage_i8(0x6b)
+#define Usage_KK_KeyboardF17 Usage_i8(0x6c)
+#define Usage_KK_KeyboardF18 Usage_i8(0x6d)
+#define Usage_KK_KeyboardF19 Usage_i8(0x6e)
+#define Usage_KK_KeyboardF20 Usage_i8(0x6f)
+#define Usage_KK_KeyboardF21 Usage_i8(0x70)
+#define Usage_KK_KeyboardF22 Usage_i8(0x71)
+#define Usage_KK_KeyboardF23 Usage_i8(0x72)
+#define Usage_KK_KeyboardF24 Usage_i8(0x73)
+#define Usage_KK_KeyboardExecute Usage_i8(0x74)
+#define Usage_KK_KeyboardHelp Usage_i8(0x75)
+#define Usage_KK_KeyboardMenu Usage_i8(0x76)
+#define Usage_KK_KeyboardSelect Usage_i8(0x77)
+#define Usage_KK_KeyboardStop Usage_i8(0x78)
+#define Usage_KK_KeyboardAgain Usage_i8(0x79)
+#define Usage_KK_KeyboardUndo Usage_i8(0x7a)
+#define Usage_KK_KeyboardCut Usage_i8(0x7b)
+#define Usage_KK_KeyboardCopy Usage_i8(0x7c)
+#define Usage_KK_KeyboardPaste Usage_i8(0x7d)
+#define Usage_KK_KeyboardFind Usage_i8(0x7e)
+#define Usage_KK_KeyboardMute Usage_i8(0x7f)
+#define Usage_KK_KeyboardVolumeUp Usage_i8(0x80)
+#define Usage_KK_KeyboardVolumeDown Usage_i8(0x81)
+#define Usage_KK_KeyboardLockingCapsLock Usage_i8(0x82)
+#define Usage_KK_KeyboardLockingNumLock Usage_i8(0x83)
+#define Usage_KK_KeyboardLockingScrollLock Usage_i8(0x84)
+#define Usage_KK_KeypadComma Usage_i8(0x85)
+#define Usage_KK_KeypadEqualSign Usage_i8(0x86)
+#define Usage_KK_KeyboardInternational1 Usage_i8(0x87)
+#define Usage_KK_KeyboardInternational2 Usage_i8(0x88)
+#define Usage_KK_KeyboardInternational3 Usage_i8(0x89)
+#define Usage_KK_KeyboardInternational4 Usage_i8(0x8a)
+#define Usage_KK_KeyboardInternational5 Usage_i8(0x8b)
+#define Usage_KK_KeyboardInternational6 Usage_i8(0x8c)
+#define Usage_KK_KeyboardInternational7 Usage_i8(0x8d)
+#define Usage_KK_KeyboardInternational8 Usage_i8(0x8e)
+#define Usage_KK_KeyboardInternational9 Usage_i8(0x8f)
+#define Usage_KK_KeyboardLANG1 Usage_i8(0x90)
+#define Usage_KK_KeyboardLANG2 Usage_i8(0x91)
+#define Usage_KK_KeyboardLANG3 Usage_i8(0x92)
+#define Usage_KK_KeyboardLANG4 Usage_i8(0x93)
+#define Usage_KK_KeyboardLANG5 Usage_i8(0x94)
+#define Usage_KK_KeyboardLANG6 Usage_i8(0x95)
+#define Usage_KK_KeyboardLANG7 Usage_i8(0x96)
+#define Usage_KK_KeyboardLANG8 Usage_i8(0x97)
+#define Usage_KK_KeyboardLANG9 Usage_i8(0x98)
+#define Usage_KK_KeyboardAlternateErase Usage_i8(0x99)
+#define Usage_KK_KeyboardSysReqAttention Usage_i8(0x9a)
+#define Usage_KK_KeyboardCancel Usage_i8(0x9b)
+#define Usage_KK_KeyboardClear Usage_i8(0x9c)
+#define Usage_KK_KeyboardPrior Usage_i8(0x9d)
+#define Usage_KK_KeyboardReturn Usage_i8(0x9e)
+#define Usage_KK_KeyboardSeparator Usage_i8(0x9f)
+#define Usage_KK_KeyboardOut Usage_i8(0xa0)
+#define Usage_KK_KeyboardOper Usage_i8(0xa1)
+#define Usage_KK_KeyboardClearAgain Usage_i8(0xa2)
+#define Usage_KK_KeyboardCrSelProps Usage_i8(0xa3)
+#define Usage_KK_KeyboardExSel Usage_i8(0xa4)
+#define Usage_KK_KeypadDouble0 Usage_i8(0xb0)
+#define Usage_KK_KeypadTriple0 Usage_i8(0xb1)
+#define Usage_KK_ThousandsSeparator Usage_i8(0xb2)
+#define Usage_KK_DecimalSeparator Usage_i8(0xb3)
+#define Usage_KK_CurrencyUnit Usage_i8(0xb4)
+#define Usage_KK_CurrencySubunit Usage_i8(0xb5)
+#define Usage_KK_KeypadLeftBracket Usage_i8(0xb6)
+#define Usage_KK_KeypadRightBracket Usage_i8(0xb7)
+#define Usage_KK_KeypadLeftBrace Usage_i8(0xb8)
+#define Usage_KK_KeypadRightBrace Usage_i8(0xb9)
+#define Usage_KK_KeypadTab Usage_i8(0xba)
+#define Usage_KK_KeypadBackspace Usage_i8(0xbb)
+#define Usage_KK_KeypadA Usage_i8(0xbc)
+#define Usage_KK_KeypadB Usage_i8(0xbd)
+#define Usage_KK_KeypadC Usage_i8(0xbe)
+#define Usage_KK_KeypadD Usage_i8(0xbf)
+#define Usage_KK_KeypadE Usage_i8(0xc0)
+#define Usage_KK_KeypadF Usage_i8(0xc1)
+#define Usage_KK_KeypadXOR Usage_i8(0xc2)
+#define Usage_KK_KeypadCaret Usage_i8(0xc3)
+#define Usage_KK_KeypadPercentage Usage_i8(0xc4)
+#define Usage_KK_KeypadLess Usage_i8(0xc5)
+#define Usage_KK_KeypadGreater Usage_i8(0xc6)
+#define Usage_KK_KeypadAmpersand Usage_i8(0xc7)
+#define Usage_KK_KeypadDoubleAmpersand Usage_i8(0xc8)
+#define Usage_KK_KeypadBar Usage_i8(0xc9)
+#define Usage_KK_KeypadDoubleBar Usage_i8(0xca)
+#define Usage_KK_KeypadColon Usage_i8(0xcb)
+#define Usage_KK_KeypadHash Usage_i8(0xcc)
+#define Usage_KK_KeypadSpace Usage_i8(0xcd)
+#define Usage_KK_KeypadAt Usage_i8(0xce)
+#define Usage_KK_KeypadBang Usage_i8(0xcf)
+#define Usage_KK_KeypadMemoryStore Usage_i8(0xd0)
+#define Usage_KK_KeypadMemoryRecall Usage_i8(0xd1)
+#define Usage_KK_KeypadMemoryClear Usage_i8(0xd2)
+#define Usage_KK_KeypadMemoryAdd Usage_i8(0xd3)
+#define Usage_KK_KeypadMemorySubtract Usage_i8(0xd4)
+#define Usage_KK_KeypadMemoryMultiply Usage_i8(0xd5)
+#define Usage_KK_KeypadMemoryDivide Usage_i8(0xd6)
+#define Usage_KK_KeypadPlusMinus Usage_i8(0xd7)
+#define Usage_KK_KeypadClear Usage_i8(0xd8)
+#define Usage_KK_KeypadClearEntry Usage_i8(0xd9)
+#define Usage_KK_KeypadBinary Usage_i8(0xda)
+#define Usage_KK_KeypadOctal Usage_i8(0xdb)
+#define Usage_KK_KeypadDecimal Usage_i8(0xdc)
+#define Usage_KK_KeypadHexadecimal Usage_i8(0xdd)
<