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

Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
deadprogram 2023-04-17 14:38:15 +02:00 коммит произвёл Ron Evans
родитель 2ab7ee6a8a
коммит 25b03414dc
3 изменённых файлов: 23 добавлений и 5 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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{

Просмотреть файл

@ -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