Files
tinygo/src/machine/usb/hid/hid.go
T
2023-08-07 14:00:32 +02:00

101 lines
1.8 KiB
Go

package hid
import (
"errors"
"machine"
"machine/usb"
"machine/usb/descriptor"
)
// from usb-hid.go
var (
ErrHIDInvalidPort = errors.New("invalid USB port")
ErrHIDInvalidCore = errors.New("invalid USB core")
ErrHIDReportTransfer = errors.New("failed to transfer HID report")
)
const (
hidEndpoint = usb.HID_ENDPOINT_IN
REPORT_TYPE_INPUT = 1
REPORT_TYPE_OUTPUT = 2
REPORT_TYPE_FEATURE = 3
)
type hidDevicer interface {
TxHandler() bool
RxHandler([]byte) bool
}
var devices [5]hidDevicer
var size int
// SetHandler sets the handler. Only the first time it is called, it
// calls machine.EnableHID for USB configuration
func SetHandler(d hidDevicer) {
if size == 0 {
machine.ConfigureUSBEndpoint(descriptor.CDCHID,
[]usb.EndpointConfig{
{
Index: usb.HID_ENDPOINT_OUT,
IsIn: false,
Type: usb.ENDPOINT_TYPE_INTERRUPT,
RxHandler: rxHandler,
},
{
Index: usb.HID_ENDPOINT_IN,
IsIn: true,
Type: usb.ENDPOINT_TYPE_INTERRUPT,
TxHandler: txHandler,
},
},
[]usb.SetupConfig{
{
Index: usb.HID_INTERFACE,
Handler: setupHandler,
},
})
}
devices[size] = d
size++
}
func txHandler() {
for _, d := range devices {
if d == nil {
continue
}
if done := d.TxHandler(); done {
return
}
}
}
func rxHandler(b []byte) {
for _, d := range devices {
if d == nil {
continue
}
if done := d.RxHandler(b); done {
return
}
}
}
var DefaultSetupHandler = setupHandler
func setupHandler(setup usb.Setup) bool {
ok := false
if setup.BmRequestType == usb.SET_REPORT_TYPE && setup.BRequest == usb.SET_IDLE {
machine.SendZlp()
ok = true
}
return ok
}
// SendUSBPacket sends a HIDPacket.
func SendUSBPacket(b []byte) {
machine.SendUSBInPacket(hidEndpoint, b)
}