Add support for HID Keyboard LEDs

Этот коммит содержится в:
Unrud 2023-08-05 15:23:20 +02:00 коммит произвёл Ron Evans
родитель 72270f9052
коммит 0ef86e1534
4 изменённых файлов: 40 добавлений и 2 удалений

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

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

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

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

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

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

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

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