From ab5f64388156a4027235c2b2a316e3cd378447d6 Mon Sep 17 00:00:00 2001 From: sago35 Date: Tue, 20 Jun 2023 21:18:14 +0900 Subject: [PATCH 1/3] machine/usb/hid,joystick: fix hidrepot (3) --- src/machine/usb/descriptor/hidreport.go | 42 ++++++++++++++++++------- src/machine/usb/descriptor/joystick.go | 5 +-- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/machine/usb/descriptor/hidreport.go b/src/machine/usb/descriptor/hidreport.go index 914279a51f..1a5e9899ef 100644 --- a/src/machine/usb/descriptor/hidreport.go +++ b/src/machine/usb/descriptor/hidreport.go @@ -129,48 +129,66 @@ func HIDReportID(id int) []byte { } func HIDLogicalMinimum(min int) []byte { - if min > 255 { - return []byte{hidLogicalMinimum + 1, uint8(min), uint8(min >> 8)} + m := uint32(min) + if 65535 < m { + return []byte{hidLogicalMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 32)} + } else if 255 < m { + return []byte{hidLogicalMinimum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidLogicalMinimum, byte(min)} } func HIDLogicalMaximum(max int) []byte { - if max > 255 { - return []byte{hidLogicalMaximum + 1, uint8(max), uint8(max >> 8)} + m := uint32(max) + if 65535 < m { + return []byte{hidLogicalMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} + } else if 255 < m { + return []byte{hidLogicalMaximum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidLogicalMaximum, byte(max)} } func HIDUsageMinimum(min int) []byte { - if min > 255 { - return []byte{hidUsageMinimum + 1, uint8(min), uint8(min >> 8)} + m := uint32(min) + if 65535 < m { + return []byte{hidUsageMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} + } else if 255 < m { + return []byte{hidUsageMinimum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidUsageMinimum, byte(min)} } func HIDUsageMaximum(max int) []byte { - if max > 255 { - return []byte{hidUsageMaximum + 1, uint8(max), uint8(max >> 8)} + m := uint32(max) + if 65535 < m { + return []byte{hidUsageMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} + } else if 255 < m { + return []byte{hidUsageMaximum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidUsageMaximum, byte(max)} } func HIDPhysicalMinimum(min int) []byte { - if min > 255 { - return []byte{hidPhysicalMinimum + 1, uint8(min), uint8(min >> 8)} + m := uint32(min) + if 65535 < m { + return []byte{hidPhysicalMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} + } else if 255 < m { + return []byte{hidPhysicalMinimum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidPhysicalMinimum, byte(min)} } func HIDPhysicalMaximum(max int) []byte { - if max > 255 { - return []byte{hidPhysicalMaximum + 1, uint8(max), uint8(max >> 8)} + m := uint32(max) + if 65535 < m { + return []byte{hidPhysicalMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} + } else if 255 < m { + return []byte{hidPhysicalMaximum + 1, uint8(m), uint8(m >> 8)} } return []byte{hidPhysicalMaximum, byte(max)} diff --git a/src/machine/usb/descriptor/joystick.go b/src/machine/usb/descriptor/joystick.go index ebf2f7c314..03bde25904 100644 --- a/src/machine/usb/descriptor/joystick.go +++ b/src/machine/usb/descriptor/joystick.go @@ -80,10 +80,7 @@ var JoystickDefaultHIDReport = Append([][]byte{ HIDLogicalMaximum(1), HIDReportSize(1), HIDReportCount(16), - HIDInputDataVarAbs, - HIDReportCount(1), - HIDReportSize(3), - HIDUnitExponent(-16), + HIDUnitExponent(0), HIDUnit(0), HIDInputDataVarAbs, From a33b18259cb2403338a16c00a1c08a65ed0e287d Mon Sep 17 00:00:00 2001 From: sago35 Date: Thu, 22 Jun 2023 21:03:15 +0900 Subject: [PATCH 2/3] machine/usb/hid,joystick: fix handling of logical, usage, and physical minimum/maximum values --- src/machine/usb/descriptor/hidreport.go | 85 +++++++++++++------------ 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/src/machine/usb/descriptor/hidreport.go b/src/machine/usb/descriptor/hidreport.go index 1a5e9899ef..a2ad9a140b 100644 --- a/src/machine/usb/descriptor/hidreport.go +++ b/src/machine/usb/descriptor/hidreport.go @@ -3,12 +3,12 @@ package descriptor const ( hidUsagePage = 0x05 hidUsage = 0x09 - hidLogicalMinimum = 0x15 - hidLogicalMaximum = 0x25 - hidUsageMinimum = 0x19 - hidUsageMaximum = 0x29 - hidPhysicalMinimum = 0x35 - hidPhysicalMaximum = 0x46 + hidLogicalMinimum = 0x14 + hidLogicalMaximum = 0x24 + hidUsageMinimum = 0x18 + hidUsageMaximum = 0x28 + hidPhysicalMinimum = 0x34 + hidPhysicalMaximum = 0x44 hidUnitExponent = 0x55 hidUnit = 0x65 hidCollection = 0xa1 @@ -18,6 +18,13 @@ const ( hidReportID = 0x85 ) +const ( + hidSizeValue0 = 0x00 + hidSizeValue1 = 0x01 + hidSizeValue2 = 0x02 + hidSizeValue4 = 0x03 +) + var ( HIDUsagePageGenericDesktop = []byte{hidUsagePage, 0x01} HIDUsagePageSimulationControls = []byte{hidUsagePage, 0x02} @@ -129,69 +136,63 @@ func HIDReportID(id int) []byte { } func HIDLogicalMinimum(min int) []byte { - m := uint32(min) - if 65535 < m { - return []byte{hidLogicalMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 32)} - } else if 255 < m { - return []byte{hidLogicalMinimum + 1, uint8(m), uint8(m >> 8)} + if min < -32767 || 65535 < min { + return []byte{hidLogicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} + } else if min < -127 || 255 < min { + return []byte{hidLogicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} } - return []byte{hidLogicalMinimum, byte(min)} + return []byte{hidLogicalMinimum + hidSizeValue1, byte(min)} } func HIDLogicalMaximum(max int) []byte { - m := uint32(max) - if 65535 < m { - return []byte{hidLogicalMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} - } else if 255 < m { - return []byte{hidLogicalMaximum + 1, uint8(m), uint8(m >> 8)} + if max < -32767 || 65535 < max { + return []byte{hidLogicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} + } else if max < -127 || 255 < max { + return []byte{hidLogicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} } - return []byte{hidLogicalMaximum, byte(max)} + return []byte{hidLogicalMaximum + hidSizeValue1, byte(max)} } func HIDUsageMinimum(min int) []byte { - m := uint32(min) - if 65535 < m { - return []byte{hidUsageMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} - } else if 255 < m { - return []byte{hidUsageMinimum + 1, uint8(m), uint8(m >> 8)} + if min < -32767 || 65535 < min { + return []byte{hidUsageMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} + } else if min < -127 || 255 < min { + return []byte{hidUsageMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} } - return []byte{hidUsageMinimum, byte(min)} + return []byte{hidUsageMinimum + hidSizeValue1, byte(min)} } func HIDUsageMaximum(max int) []byte { - m := uint32(max) - if 65535 < m { - return []byte{hidUsageMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} - } else if 255 < m { - return []byte{hidUsageMaximum + 1, uint8(m), uint8(m >> 8)} + if max < -32767 || 65535 < max { + return []byte{hidUsageMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} + } else if max < -127 || 255 < max { + return []byte{hidUsageMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} } - return []byte{hidUsageMaximum, byte(max)} + return []byte{hidUsageMaximum + hidSizeValue1, byte(max)} } func HIDPhysicalMinimum(min int) []byte { - m := uint32(min) - if 65535 < m { - return []byte{hidPhysicalMinimum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} - } else if 255 < m { - return []byte{hidPhysicalMinimum + 1, uint8(m), uint8(m >> 8)} + if min < -32767 || 65535 < min { + return []byte{hidPhysicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} + } else if min < -127 || 255 < min { + return []byte{hidPhysicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} } - return []byte{hidPhysicalMinimum, byte(min)} + return []byte{hidPhysicalMinimum + hidSizeValue1, byte(min)} } func HIDPhysicalMaximum(max int) []byte { - m := uint32(max) - if 65535 < m { - return []byte{hidPhysicalMaximum + 2, uint8(m), uint8(m >> 8), uint8(m >> 16), uint8(m >> 24)} - } else if 255 < m { - return []byte{hidPhysicalMaximum + 1, uint8(m), uint8(m >> 8)} + if max < -32767 || 65535 < max { + return []byte{hidPhysicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} + } else if max < -127 || 255 < max { + return []byte{hidPhysicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} } - return []byte{hidPhysicalMaximum, byte(max)} + return []byte{hidPhysicalMaximum + hidSizeValue1, byte(max)} } func HIDUnitExponent(exp int) []byte { From 655956a44239e295b4bc8f183f4ff4a1597fb139 Mon Sep 17 00:00:00 2001 From: sago35 Date: Mon, 26 Jun 2023 08:34:10 +0900 Subject: [PATCH 3/3] machine/usb/hid: change if statements to switch --- src/machine/usb/descriptor/hidreport.go | 54 ++++++++++++++----------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/machine/usb/descriptor/hidreport.go b/src/machine/usb/descriptor/hidreport.go index a2ad9a140b..0d90d47c0a 100644 --- a/src/machine/usb/descriptor/hidreport.go +++ b/src/machine/usb/descriptor/hidreport.go @@ -136,63 +136,69 @@ func HIDReportID(id int) []byte { } func HIDLogicalMinimum(min int) []byte { - if min < -32767 || 65535 < min { + switch { + case min < -32767 || 65535 < min: return []byte{hidLogicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} - } else if min < -127 || 255 < min { + case min < -127 || 255 < min: return []byte{hidLogicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} + default: + return []byte{hidLogicalMinimum + hidSizeValue1, byte(min)} } - - return []byte{hidLogicalMinimum + hidSizeValue1, byte(min)} } func HIDLogicalMaximum(max int) []byte { - if max < -32767 || 65535 < max { + switch { + case max < -32767 || 65535 < max: return []byte{hidLogicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} - } else if max < -127 || 255 < max { + case max < -127 || 255 < max: return []byte{hidLogicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} + default: + return []byte{hidLogicalMaximum + hidSizeValue1, byte(max)} } - - return []byte{hidLogicalMaximum + hidSizeValue1, byte(max)} } func HIDUsageMinimum(min int) []byte { - if min < -32767 || 65535 < min { + switch { + case min < -32767 || 65535 < min: return []byte{hidUsageMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} - } else if min < -127 || 255 < min { + case min < -127 || 255 < min: return []byte{hidUsageMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} + default: + return []byte{hidUsageMinimum + hidSizeValue1, byte(min)} } - - return []byte{hidUsageMinimum + hidSizeValue1, byte(min)} } func HIDUsageMaximum(max int) []byte { - if max < -32767 || 65535 < max { + switch { + case max < -32767 || 65535 < max: return []byte{hidUsageMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} - } else if max < -127 || 255 < max { + case max < -127 || 255 < max: return []byte{hidUsageMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} + default: + return []byte{hidUsageMaximum + hidSizeValue1, byte(max)} } - - return []byte{hidUsageMaximum + hidSizeValue1, byte(max)} } func HIDPhysicalMinimum(min int) []byte { - if min < -32767 || 65535 < min { + switch { + case min < -32767 || 65535 < min: return []byte{hidPhysicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)} - } else if min < -127 || 255 < min { + case min < -127 || 255 < min: return []byte{hidPhysicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)} + default: + return []byte{hidPhysicalMinimum + hidSizeValue1, byte(min)} } - - return []byte{hidPhysicalMinimum + hidSizeValue1, byte(min)} } func HIDPhysicalMaximum(max int) []byte { - if max < -32767 || 65535 < max { + switch { + case max < -32767 || 65535 < max: return []byte{hidPhysicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)} - } else if max < -127 || 255 < max { + case max < -127 || 255 < max: return []byte{hidPhysicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)} + default: + return []byte{hidPhysicalMaximum + hidSizeValue1, byte(max)} } - - return []byte{hidPhysicalMaximum + hidSizeValue1, byte(max)} } func HIDUnitExponent(exp int) []byte {