machine/usb/hid/joystick: handle case where we cannot find the correct HID descriptor

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2023-04-17 14:38:15 +02:00
committed by Ron Evans
parent 2ab7ee6a8a
commit 25b03414dc
3 changed files with 23 additions and 5 deletions
+6 -1
View File
@@ -302,7 +302,12 @@ func EnableMIDI(txHandler func(), rxHandler func([]byte), setupHandler func(usb.
// EnableJoystick enables HID. This function must be executed from the init(). // EnableJoystick enables HID. This function must be executed from the init().
func EnableJoystick(txHandler func(), rxHandler func([]byte), setupHandler func(usb.Setup) bool, hidDesc []byte) { func EnableJoystick(txHandler func(), rxHandler func([]byte), setupHandler func(usb.Setup) bool, hidDesc []byte) {
class := descriptor.FindClassHIDType(descriptor.CDCJoystick.Configuration, descriptor.ClassHIDJoystick.Bytes()) class, err := descriptor.FindClassHIDType(descriptor.CDCJoystick.Configuration, descriptor.ClassHIDJoystick.Bytes())
if err != nil {
// TODO: some way to notify about error
return
}
class.ClassLength(uint16(len(hidDesc))) class.ClassLength(uint16(len(hidDesc)))
descriptor.CDCJoystick.HID[2] = hidDesc descriptor.CDCJoystick.HID[2] = hidDesc
+16 -3
View File
@@ -3,6 +3,7 @@ package descriptor
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"errors"
) )
var configurationCDCHID = [configurationTypeLen]byte{ var configurationCDCHID = [configurationTypeLen]byte{
@@ -76,10 +77,22 @@ func (d ClassHIDType) ClassLength(v uint16) {
binary.LittleEndian.PutUint16(d.data[7:9], v) binary.LittleEndian.PutUint16(d.data[7:9], v)
} }
func FindClassHIDType(data, section []byte) ClassHIDType { var errNoClassHIDFound = errors.New("no classHID found")
idx := bytes.Index(data, section)
return ClassHIDType{data: data[idx : idx+ClassHIDTypeLen]} // FindClassHIDType tries to find the ClassHID class in the descriptor.
func FindClassHIDType(des, class []byte) (ClassHIDType, error) {
if len(des) < ClassHIDTypeLen || len(class) == 0 {
return ClassHIDType{}, errNoClassHIDFound
}
// search only for ClassHIDType without the ClassLength,
// in case it has already been set.
idx := bytes.Index(des, class[:ClassHIDTypeLen-2])
if idx == -1 {
return ClassHIDType{}, errNoClassHIDFound
}
return ClassHIDType{data: des[idx : idx+ClassHIDTypeLen]}, nil
} }
var classHID = [ClassHIDTypeLen]byte{ var classHID = [ClassHIDTypeLen]byte{
+1 -1
View File
@@ -30,7 +30,7 @@ func UseSettings(def Definitions, rxHandlerFunc func(b []byte), setupFunc func(s
State: def.NewState(), State: def.NewState(),
} }
if setupFunc == nil { if setupFunc == nil {
setupFunc = js.setupFunc setupFunc = hid.DefaultSetupHandler
} }
machine.EnableJoystick(js.handler, rxHandlerFunc, setupFunc, hidDesc) machine.EnableJoystick(js.handler, rxHandlerFunc, setupFunc, hidDesc)
Joystick = js Joystick = js