Browse Source

machine/usb/descriptor: refactor HID report creation

Signed-off-by: deadprogram <ron@hybridgroup.com>
fix-flash-eraseblock
deadprogram 2 years ago
committed by Ron Evans
parent
commit
d8ee520bdc
  1. 141
      src/machine/usb/descriptor/hid.go
  2. 130
      src/machine/usb/descriptor/hidreport.go
  3. 112
      src/machine/usb/descriptor/joystick.go

141
src/machine/usb/descriptor/hid.go

@ -130,73 +130,78 @@ var CDCHID = Descriptor{
EndpointEP4IN.Bytes(), EndpointEP4IN.Bytes(),
}), }),
HID: map[uint16][]byte{ HID: map[uint16][]byte{
2: []byte{ 2: appendSlices([][]byte{
0x05, 0x01, // Usage Page (Generic Desktop) HIDUsagePageGenericDesktop,
0x09, 0x06, // Usage (Keyboard) HIDUsageDesktopKeyboard,
0xa1, 0x01, // Collection (Application) HIDCollectionApplication,
0x85, 0x02, // Report ID (2) HIDReportID(2),
0x05, 0x07, // Usage Page (KeyCodes)
0x19, 0xe0, // Usage Minimum (224) HIDUsagePageKeyboard,
0x29, 0xe7, // Usage Maximum (231) HIDUsageMinimum(224),
0x15, 0x00, // Logical Minimum (0) HIDUsageMaximum(231),
0x25, 0x01, // Logical Maximum (1) HIDLogicalMinimum(0),
0x75, 0x01, // Report Size (1) HIDLogicalMaximum(1),
0x95, 0x08, // Report Count (8) HIDReportSize(1),
0x81, 0x02, // Input (Data, Variable, Absolute), Modifier byte HIDReportCount(8),
0x95, 0x01, // Report Count (1) HIDInputDataVarAbs,
0x75, 0x08, // Report Size (8) HIDReportCount(1),
0x81, 0x03, // HIDReportSize(8),
0x95, 0x06, // Report Count (6) HIDInputConstVarAbs,
0x75, 0x08, // Report Size (8) HIDReportCount(6),
0x15, 0x00, // Logical Minimum (0), HIDReportSize(8),
0x25, 0xFF, // HIDLogicalMinimum(0),
0x05, 0x07, // Usage Page (KeyCodes) HIDLogicalMaximum(255),
0x19, 0x00, // Usage Minimum (0)
0x29, 0xFF, // Usage Maximum (255) HIDUsagePageKeyboard,
0x81, 0x00, // Input (Data, Array), Key arrays (6 bytes) HIDUsageMinimum(0),
0xc0, // End Collection HIDUsageMaximum(255),
HIDInputDataAryAbs,
0x05, 0x01, // Usage Page (Generic Desktop) HIDEndCollection,
0x09, 0x02, // Usage (Mouse)
0xa1, 0x01, // Collection (Application) HIDUsagePageGenericDesktop,
0x09, 0x01, // Usage (Pointer) HIDUsageDesktopMouse,
0xa1, 0x00, // Collection (Physical) HIDCollectionApplication,
0x85, 0x01, // Report ID (1) HIDUsageDesktopPointer,
0x05, 0x09, // Usage Page (Buttons) HIDCollectionPhysical,
0x19, 0x01, // Usage Minimum (01) HIDReportID(1),
0x29, 0x05, // Usage Maximun (05)
0x15, 0x00, // Logical Minimum (0) HIDUsagePageButton,
0x25, 0x01, // Logical Maximum (1) HIDUsageMinimum(1),
0x95, 0x05, // Report Count (5) HIDUsageMaximum(5),
0x75, 0x01, // Report Size (1) HIDLogicalMinimum(0),
0x81, 0x02, // Input (Data, Variable, Absolute), ;3 button bits HIDLogicalMaximum(1),
0x95, 0x01, // Report Count (1) HIDReportCount(5),
0x75, 0x03, // Report Size (3) HIDReportSize(1),
0x81, 0x03, // HIDInputDataVarAbs,
0x05, 0x01, // Usage Page (Generic Desktop) HIDReportCount(1),
0x09, 0x30, // Usage (X) HIDReportSize(3),
0x09, 0x31, // Usage (Y) HIDInputConstVarAbs,
0x09, 0x38, //
0x15, 0x81, // Logical Minimum (-127) HIDUsagePageGenericDesktop,
0x25, 0x7f, // Logical Maximum (127) HIDUsageDesktopX,
0x75, 0x08, // Report Size (8) HIDUsageDesktopY,
0x95, 0x03, // Report Count (3) HIDUsageDesktopWheel,
0x81, 0x06, // Input (Data, Variable, Relative), 2 position bytes (X & Y) HIDLogicalMinimum(-127),
0xc0, // End Collection HIDLogicalMaximum(127),
0xc0, // End Collection HIDReportSize(8),
HIDReportCount(3),
0x05, 0x0C, // Usage Page (Consumer) HIDInputDataVarRel,
0x09, 0x01, // Usage (Consumer Control) HIDEndCollection,
0xA1, 0x01, // Collection (Application) HIDEndCollection,
0x85, 0x03, // Report ID (3)
0x15, 0x00, // Logical Minimum (0) HIDUsagePageConsumer,
0x26, 0xFF, 0x1F, // Logical Maximum (8191) HIDUsageConsumerControl,
0x19, 0x00, // Usage Minimum (Unassigned) HIDCollectionApplication,
0x2A, 0xFF, 0x1F, // Usage Maximum (0x1FFF) HIDReportID(3),
0x75, 0x10, // Report Size (16) HIDLogicalMinimum(0),
0x95, 0x01, // Report Count (1) []byte{
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x26, 0xFF, 0x1F, // Logical Maximum (8191)
0xC0, // End Collection 0x19, 0x00, // Usage Minimum (Unassigned)
}, 0x2A, 0xFF, 0x1F, // Usage Maximum (0x1FFF)
},
HIDReportSize(16),
HIDReportCount(1),
HIDInputDataAryAbs,
HIDEndCollection}),
}, },
} }

130
src/machine/usb/descriptor/hidreport.go

@ -0,0 +1,130 @@
package descriptor
var (
HIDUsagePageGenericDesktop = []byte{0x05, 0x01}
HIDUsagePageSimulationControls = []byte{0x05, 0x02}
HIDUsagePageVRControls = []byte{0x05, 0x03}
HIDUsagePageSportControls = []byte{0x05, 0x04}
HIDUsagePageGameControls = []byte{0x05, 0x05}
HIDUsagePageGenericControls = []byte{0x05, 0x06}
HIDUsagePageKeyboard = []byte{0x05, 0x07}
HIDUsagePageLED = []byte{0x05, 0x08}
HIDUsagePageButton = []byte{0x05, 0x09}
HIDUsagePageOrdinal = []byte{0x05, 0x0A}
HIDUsagePageTelephony = []byte{0x05, 0x0B}
HIDUsagePageConsumer = []byte{0x05, 0x0C}
HIDUsagePageDigitizers = []byte{0x05, 0x0D}
HIDUsagePageHaptics = []byte{0x05, 0x0E}
HIDUsagePagePhysicalInput = []byte{0x05, 0x0F}
HIDUsagePageUnicode = []byte{0x05, 0x10}
HIDUsagePageSoC = []byte{0x05, 0x11}
HIDUsagePageEyeHeadTrackers = []byte{0x05, 0x12}
HIDUsagePageAuxDisplay = []byte{0x05, 0x14}
HIDUsagePageSensors = []byte{0x05, 0x20}
HIDUsagePageMedicalInstrument = []byte{0x05, 0x40}
HIDUsagePageBrailleDisplay = []byte{0x05, 0x41}
HIDUsagePageLighting = []byte{0x05, 0x59}
HIDUsagePageMonitor = []byte{0x05, 0x80}
HIDUsagePageMonitorEnum = []byte{0x05, 0x81}
HIDUsagePageVESA = []byte{0x05, 0x82}
HIDUsagePagePower = []byte{0x05, 0x84}
HIDUsagePageBatterySystem = []byte{0x05, 0x85}
HIDUsagePageBarcodeScanner = []byte{0x05, 0x8C}
HIDUsagePageScales = []byte{0x05, 0x8D}
HIDUsagePageMagneticStripe = []byte{0x05, 0x8E}
HIDUsagePageCameraControl = []byte{0x05, 0x90}
HIDUsagePageArcade = []byte{0x05, 0x91}
HIDUsagePageGaming = []byte{0x05, 0x92}
)
var (
HIDUsageDesktopPointer = []byte{0x09, 0x01}
HIDUsageDesktopMouse = []byte{0x09, 0x02}
HIDUsageDesktopJoystick = []byte{0x09, 0x04}
HIDUsageDesktopGamepad = []byte{0x09, 0x05}
HIDUsageDesktopKeyboard = []byte{0x09, 0x06}
HIDUsageDesktopKeypad = []byte{0x09, 0x07}
HIDUsageDesktopMultiaxis = []byte{0x09, 0x08}
HIDUsageDesktopTablet = []byte{0x09, 0x09}
HIDUsageDesktopWaterCooling = []byte{0x09, 0x0A}
HIDUsageDesktopChassis = []byte{0x09, 0x0B}
HIDUsageDesktopWireless = []byte{0x09, 0x0C}
HIDUsageDesktopPortable = []byte{0x09, 0x0D}
HIDUsageDesktopSystemMultiaxis = []byte{0x09, 0x0E}
HIDUsageDesktopSpatial = []byte{0x09, 0x0F}
HIDUsageDesktopAssistive = []byte{0x09, 0x10}
HIDUsageDesktopDock = []byte{0x09, 0x11}
HIDUsageDesktopDockable = []byte{0x09, 0x12}
HIDUsageDesktopCallState = []byte{0x09, 0x13}
HIDUsageDesktopX = []byte{0x09, 0x30}
HIDUsageDesktopY = []byte{0x09, 0x31}
HIDUsageDesktopZ = []byte{0x09, 0x32}
HIDUsageDesktopRx = []byte{0x09, 0x33}
HIDUsageDesktopRy = []byte{0x09, 0x34}
HIDUsageDesktopRz = []byte{0x09, 0x35}
HIDUsageDesktopSlider = []byte{0x09, 0x36}
HIDUsageDesktopDial = []byte{0x09, 0x37}
HIDUsageDesktopWheel = []byte{0x09, 0x38}
HIDUsageDesktopHatSwitch = []byte{0x09, 0x39}
HIDUsageDesktopCountedBuffer = []byte{0x09, 0x3A}
)
var (
HIDUsageConsumerControl = []byte{0x09, 0x01}
HIDUsageConsumerNumericKeypad = []byte{0x09, 0x02}
HIDUsageConsumerProgrammableButtons = []byte{0x09, 0x03}
HIDUsageConsumerMicrophone = []byte{0x09, 0x04}
HIDUsageConsumerHeadphone = []byte{0x09, 0x05}
HIDUsageConsumerGraphicEqualizer = []byte{0x09, 0x06}
)
var (
HIDCollectionPhysical = []byte{0xa1, 0x00}
HIDCollectionApplication = []byte{0xa1, 0x01}
)
var (
HIDEndCollection = []byte{0xc0}
)
var (
// Input (Data,Ary,Abs), Key arrays (6 bytes)
HIDInputDataAryAbs = []byte{0x81, 0x00}
// Input (Data, Variable, Absolute), Modifier byte
HIDInputDataVarAbs = []byte{0x81, 0x02}
// Input (Const,Var,Abs), Modifier byte
HIDInputConstVarAbs = []byte{0x81, 0x03}
// Input (Data, Variable, Relative), 2 position bytes (X & Y)
HIDInputDataVarRel = []byte{0x81, 0x06}
)
func HIDReportSize(size int) []byte {
return []byte{0x75, byte(size)}
}
func HIDReportCount(count int) []byte {
return []byte{0x95, byte(count)}
}
func HIDReportID(id int) []byte {
return []byte{0x85, byte(id)}
}
func HIDLogicalMinimum(min int) []byte {
return []byte{0x15, byte(min)}
}
func HIDLogicalMaximum(max int) []byte {
return []byte{0x25, byte(max)}
}
func HIDUsageMinimum(min int) []byte {
return []byte{0x19, byte(min)}
}
func HIDUsageMaximum(max int) []byte {
return []byte{0x29, byte(max)}
}

112
src/machine/usb/descriptor/joystick.go

@ -68,56 +68,68 @@ var ClassHIDJoystick = ClassHIDType{
data: classHIDJoystick[:], data: classHIDJoystick[:],
} }
var JoystickDefaultHIDReport = []byte{ var JoystickDefaultHIDReport = appendSlices([][]byte{
0x05, 0x01, // Usage page HIDUsagePageGenericDesktop,
0x09, 0x04, // Joystick HIDUsageDesktopJoystick,
0xa1, 0x01, // COLLECTION (Application) HIDCollectionApplication,
0x85, 0x01, // REPORT_ID (1) HIDReportID(1),
0x05, 0x09, // USAGE_PAGE (Button) HIDUsagePageButton,
0x19, 0x01, // USAGE_MINIMUM (Button 1) HIDUsageMinimum(1),
0x29, 0x10, // USAGE_MAXIMUM (Button 16) HIDUsageMaximum(16),
0x15, 0x00, // LOGICAL_MINIMUM (0) HIDLogicalMinimum(0),
0x25, 0x01, // LOGICAL_MAXIMUM (1) HIDLogicalMaximum(1),
0x75, 0x01, // REPORT_SIZE (1) HIDReportSize(1),
0x95, 0x10, // REPORT_COUNT (16) HIDReportCount(16),
0x55, 0x00, // Unit Exponent (-16) HIDInputDataVarAbs,
0x65, 0x00, // Unit (0x00) HIDReportCount(1),
0x81, 0x02, // INPUT (Data/Var/Abs) HIDReportSize(3),
0x05, 0x01, // USAGE_PAGE (Generic Desktop Controls) []byte{
0x09, 0x39, // USAGE(Hat Switch) 0x55, 0x00, // Unit Exponent (-16)
0x15, 0x00, // LOGICAL_MINIMUM (0) 0x65, 0x00, // Unit (0x00)
0x25, 0x07, // LOGICAL_MAXIMUM (7) },
0x35, 0x00, // PHYSICAL_MINIMUM (0) HIDInputDataVarAbs,
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315)
0x65, 0x14, // UNIT (Eng Rot:Angular Pos) HIDUsagePageGenericDesktop,
0x75, 0x04, // REPORT_SIZE (4) HIDUsageDesktopHatSwitch,
0x95, 0x01, // REPORT_COUNT (1) HIDLogicalMinimum(0),
0x81, 0x02, // INPUT (Data/Var/Abs) HIDLogicalMaximum(7),
0x09, 0x39, // USAGE(Hat Switch) []byte{
0x15, 0x00, // LOGICAL_MINIMUM (0) 0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x25, 0x07, // LOGICAL_MAXIMUM (7) 0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315)
0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos)
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315) },
0x65, 0x14, // UNIT (Eng Rot:Angular Pos) HIDReportCount(1),
0x75, 0x04, // REPORT_SIZE (4) HIDReportSize(4),
0x95, 0x01, // REPORT_COUNT (1) HIDInputDataVarAbs,
0x81, 0x02, // INPUT (Data/Var/Abs) HIDUsageDesktopHatSwitch,
0x09, 0x01, // USAGE (Pointer) HIDLogicalMinimum(0),
0x16, 0x01, 0x80, // LOGICAL_MINIMUM (-32767) HIDLogicalMaximum(7),
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) []byte{
0x75, 0x10, // REPORT_SIZE (16bits) 0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x95, 0x06, // REPORT_COUNT (6) 0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315)
0xa1, 0x00, // COLLECTION (Physical) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos)
0x09, 0x30, // USAGE(X) },
0x09, 0x31, // USAGE(Y) HIDReportCount(1),
0x09, 0x32, // USAGE(Z) HIDReportSize(4),
0x09, 0x33, // USAGE(RX) HIDInputDataVarAbs,
0x09, 0x34, // USAGE(RY) HIDUsageDesktopPointer,
0x09, 0x35, // USAGE(RZ) []byte{
0x81, 0x02, // INPUT (Data/Var/Abs) 0x16, 0x01, 0x80, // LOGICAL_MINIMUM (-32767)
0xc0, // END_COLLECTION 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
0xc0, // END_COLLECTION },
} HIDReportCount(6),
HIDReportSize(16),
HIDCollectionPhysical,
HIDUsageDesktopX,
HIDUsageDesktopY,
HIDUsageDesktopZ,
HIDUsageDesktopRx,
HIDUsageDesktopRy,
HIDUsageDesktopRz,
HIDInputDataVarAbs,
HIDEndCollection,
HIDEndCollection,
})
// CDCJoystick requires that you append the JoystickDescriptor // CDCJoystick requires that you append the JoystickDescriptor
// to the Configuration before using. This is in order to support // to the Configuration before using. This is in order to support

Loading…
Cancel
Save