diff --git a/src/machine/usb/descriptor/hid.go b/src/machine/usb/descriptor/hid.go index 8135c2a608..cdd4fc7e57 100644 --- a/src/machine/usb/descriptor/hid.go +++ b/src/machine/usb/descriptor/hid.go @@ -26,7 +26,7 @@ var interfaceHID = [interfaceTypeLen]byte{ TypeInterface, 0x02, // InterfaceNumber 0x00, // AlternateSetting - 0x01, // NumEndpoints + 0x02, // NumEndpoints 0x03, // InterfaceClass 0x00, // InterfaceSubClass 0x00, // InterfaceProtocol @@ -103,7 +103,7 @@ var classHID = [ClassHIDTypeLen]byte{ 0x00, // CountryCode 0x01, // NumDescriptors 0x22, // ClassType - 0x7E, // ClassLength L + 0x90, // ClassLength L 0x00, // ClassLength H } @@ -128,6 +128,7 @@ var CDCHID = Descriptor{ InterfaceHID.Bytes(), ClassHID.Bytes(), EndpointEP4IN.Bytes(), + EndpointEP5OUT.Bytes(), }), HID: map[uint16][]byte{ 2: Append([][]byte{ @@ -147,6 +148,15 @@ var CDCHID = Descriptor{ HIDReportCount(1), HIDReportSize(8), HIDInputConstVarAbs, + HIDReportCount(3), + HIDReportSize(1), + HIDUsagePageLED, + HIDUsageMinimum(1), + HIDUsageMaximum(3), + HIDOutputDataVarAbs, + HIDReportCount(5), + HIDReportSize(1), + HIDOutputConstVarAbs, HIDReportCount(6), HIDReportSize(8), HIDLogicalMinimum(0), diff --git a/src/machine/usb/descriptor/hidreport.go b/src/machine/usb/descriptor/hidreport.go index 0d90d47c0a..5819f6ad69 100644 --- a/src/machine/usb/descriptor/hidreport.go +++ b/src/machine/usb/descriptor/hidreport.go @@ -13,6 +13,7 @@ const ( hidUnit = 0x65 hidCollection = 0xa1 hidInput = 0x81 + hidOutput = 0x91 hidReportSize = 0x75 hidReportCount = 0x95 hidReportID = 0x85 @@ -121,6 +122,12 @@ var ( // Input (Data, Variable, Relative), 2 position bytes (X & Y) HIDInputDataVarRel = []byte{hidInput, 0x06} + + // Output (Data, Variable, Absolute), Modifier byte + HIDOutputDataVarAbs = []byte{hidOutput, 0x02} + + // Output (Const, Variable, Absolute), Modifier byte + HIDOutputConstVarAbs = []byte{hidOutput, 0x03} ) func HIDReportSize(size int) []byte { diff --git a/src/machine/usb/hid/hid.go b/src/machine/usb/hid/hid.go index f7f1ff66bf..791fd06a66 100644 --- a/src/machine/usb/hid/hid.go +++ b/src/machine/usb/hid/hid.go @@ -36,6 +36,12 @@ 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, diff --git a/src/machine/usb/hid/keyboard/keyboard.go b/src/machine/usb/hid/keyboard/keyboard.go index 237d79419e..9f5f420ed0 100644 --- a/src/machine/usb/hid/keyboard/keyboard.go +++ b/src/machine/usb/hid/keyboard/keyboard.go @@ -92,6 +92,9 @@ func (kb *keyboard) TxHandler() bool { } func (kb *keyboard) RxHandler(b []byte) bool { + if len(b) >= 2 && b[0] == 2 /* ReportID */ { + kb.led = b[1] + } return false } @@ -106,6 +109,18 @@ func (kb *keyboard) tx(b []byte) { } } +func (kb *keyboard) NumLockLed() bool { + return kb.led&1 != 0 +} + +func (kb *keyboard) CapsLockLed() bool { + return kb.led&2 != 0 +} + +func (kb *keyboard) ScrollLockLed() bool { + return kb.led&4 != 0 +} + func (kb *keyboard) ready() bool { return true }