Skip to content

Commit

Permalink
Add support for HID Keyboard LEDs
Browse files Browse the repository at this point in the history
  • Loading branch information
Unrud authored and deadprogram committed Aug 7, 2023
1 parent 72270f9 commit 0ef86e1
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 2 deletions.
14 changes: 12 additions & 2 deletions src/machine/usb/descriptor/hid.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ var interfaceHID = [interfaceTypeLen]byte{
TypeInterface,
0x02, // InterfaceNumber
0x00, // AlternateSetting
0x01, // NumEndpoints
0x02, // NumEndpoints
0x03, // InterfaceClass
0x00, // InterfaceSubClass
0x00, // InterfaceProtocol
Expand Down Expand Up @@ -103,7 +103,7 @@ var classHID = [ClassHIDTypeLen]byte{
0x00, // CountryCode
0x01, // NumDescriptors
0x22, // ClassType
0x7E, // ClassLength L
0x90, // ClassLength L
0x00, // ClassLength H
}

Expand All @@ -128,6 +128,7 @@ var CDCHID = Descriptor{
InterfaceHID.Bytes(),
ClassHID.Bytes(),
EndpointEP4IN.Bytes(),
EndpointEP5OUT.Bytes(),
}),
HID: map[uint16][]byte{
2: Append([][]byte{
Expand All @@ -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),
Expand Down
7 changes: 7 additions & 0 deletions src/machine/usb/descriptor/hidreport.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const (
hidUnit = 0x65
hidCollection = 0xa1
hidInput = 0x81
hidOutput = 0x91
hidReportSize = 0x75
hidReportCount = 0x95
hidReportID = 0x85
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 6 additions & 0 deletions src/machine/usb/hid/hid.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
15 changes: 15 additions & 0 deletions src/machine/usb/hid/keyboard/keyboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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
}
Expand Down

0 comments on commit 0ef86e1

Please sign in to comment.