Files
tinygo/src/machine/usb/descriptor/joystick.go
T
2023-05-05 07:44:03 +02:00

158 lines
3.6 KiB
Go

package descriptor
var deviceJoystick = [deviceTypeLen]byte{
deviceTypeLen,
TypeDevice,
0x00, 0x02, // USB version
0xef, // device class
0x02, // subclass
0x01, // protocol
0x40, // maxpacketsize
0x41, 0x23, // vendor id
0x36, 0x80, // product id
0x00, 0x01, // device
0x01, // manufacturer
0x02, // product
0x03, // SerialNumber
0x01, // NumConfigurations
}
var DeviceJoystick = DeviceType{
data: deviceJoystick[:],
}
var configurationCDCJoystick = [configurationTypeLen]byte{
configurationTypeLen,
TypeConfiguration,
0x6b, 0x00, // adjust length as needed
0x03, // number of interfaces
0x01, // configuration value
0x00, // index to string description
0xa0, // attributes
0xfa, // maxpower
}
var ConfigurationCDCJoystick = ConfigurationType{
data: configurationCDCJoystick[:],
}
var interfaceHIDJoystick = [interfaceTypeLen]byte{
interfaceTypeLen,
TypeInterface,
0x02, // InterfaceNumber
0x00, // AlternateSetting
0x02, // NumEndpoints
0x03, // InterfaceClass
0x00, // InterfaceSubClass
0x00, // InterfaceProtocol
0x00, // Interface
}
var InterfaceHIDJoystick = InterfaceType{
data: interfaceHIDJoystick[:],
}
var classHIDJoystick = [ClassHIDTypeLen]byte{
ClassHIDTypeLen,
TypeClassHID,
0x11, // HID version L
0x01, // HID version H
0x00, // CountryCode
0x01, // NumDescriptors
0x22, // ClassType
0x00, // ClassLength L
0x00, // ClassLength H
}
var ClassHIDJoystick = ClassHIDType{
data: classHIDJoystick[:],
}
var JoystickDefaultHIDReport = appendSlices([][]byte{
HIDUsagePageGenericDesktop,
HIDUsageDesktopJoystick,
HIDCollectionApplication,
HIDReportID(1),
HIDUsagePageButton,
HIDUsageMinimum(1),
HIDUsageMaximum(16),
HIDLogicalMinimum(0),
HIDLogicalMaximum(1),
HIDReportSize(1),
HIDReportCount(16),
HIDInputDataVarAbs,
HIDReportCount(1),
HIDReportSize(3),
[]byte{
0x55, 0x00, // Unit Exponent (-16)
0x65, 0x00, // Unit (0x00)
},
HIDInputDataVarAbs,
HIDUsagePageGenericDesktop,
HIDUsageDesktopHatSwitch,
HIDLogicalMinimum(0),
HIDLogicalMaximum(7),
[]byte{
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315)
0x65, 0x14, // UNIT (Eng Rot:Angular Pos)
},
HIDReportCount(1),
HIDReportSize(4),
HIDInputDataVarAbs,
HIDUsageDesktopHatSwitch,
HIDLogicalMinimum(0),
HIDLogicalMaximum(7),
[]byte{
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM(315)
0x65, 0x14, // UNIT (Eng Rot:Angular Pos)
},
HIDReportCount(1),
HIDReportSize(4),
HIDInputDataVarAbs,
HIDUsageDesktopPointer,
[]byte{
0x16, 0x01, 0x80, // LOGICAL_MINIMUM (-32767)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
},
HIDReportCount(6),
HIDReportSize(16),
HIDCollectionPhysical,
HIDUsageDesktopX,
HIDUsageDesktopY,
HIDUsageDesktopZ,
HIDUsageDesktopRx,
HIDUsageDesktopRy,
HIDUsageDesktopRz,
HIDInputDataVarAbs,
HIDEndCollection,
HIDEndCollection,
})
// CDCJoystick requires that you append the JoystickDescriptor
// to the Configuration before using. This is in order to support
// custom configurations.
var CDCJoystick = Descriptor{
Device: DeviceJoystick.Bytes(),
Configuration: appendSlices([][]byte{
ConfigurationCDCJoystick.Bytes(),
InterfaceAssociationCDC.Bytes(),
InterfaceCDCControl.Bytes(),
ClassSpecificCDCHeader.Bytes(),
ClassSpecificCDCACM.Bytes(),
ClassSpecificCDCUnion.Bytes(),
ClassSpecificCDCCallManagement.Bytes(),
EndpointEP1IN.Bytes(),
InterfaceCDCData.Bytes(),
EndpointEP2OUT.Bytes(),
EndpointEP3IN.Bytes(),
InterfaceHIDJoystick.Bytes(),
ClassHIDJoystick.Bytes(),
EndpointEP4IN.Bytes(),
EndpointEP5OUT.Bytes(),
}),
HID: map[uint16][]byte{},
}