Add support for HID Keyboard LEDs
Этот коммит содержится в:
родитель
72270f9052
коммит
0ef86e1534
4 изменённых файлов: 40 добавлений и 2 удалений
|
@ -26,7 +26,7 @@ var interfaceHID = [interfaceTypeLen]byte{
|
||||||
TypeInterface,
|
TypeInterface,
|
||||||
0x02, // InterfaceNumber
|
0x02, // InterfaceNumber
|
||||||
0x00, // AlternateSetting
|
0x00, // AlternateSetting
|
||||||
0x01, // NumEndpoints
|
0x02, // NumEndpoints
|
||||||
0x03, // InterfaceClass
|
0x03, // InterfaceClass
|
||||||
0x00, // InterfaceSubClass
|
0x00, // InterfaceSubClass
|
||||||
0x00, // InterfaceProtocol
|
0x00, // InterfaceProtocol
|
||||||
|
@ -103,7 +103,7 @@ var classHID = [ClassHIDTypeLen]byte{
|
||||||
0x00, // CountryCode
|
0x00, // CountryCode
|
||||||
0x01, // NumDescriptors
|
0x01, // NumDescriptors
|
||||||
0x22, // ClassType
|
0x22, // ClassType
|
||||||
0x7E, // ClassLength L
|
0x90, // ClassLength L
|
||||||
0x00, // ClassLength H
|
0x00, // ClassLength H
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,6 +128,7 @@ var CDCHID = Descriptor{
|
||||||
InterfaceHID.Bytes(),
|
InterfaceHID.Bytes(),
|
||||||
ClassHID.Bytes(),
|
ClassHID.Bytes(),
|
||||||
EndpointEP4IN.Bytes(),
|
EndpointEP4IN.Bytes(),
|
||||||
|
EndpointEP5OUT.Bytes(),
|
||||||
}),
|
}),
|
||||||
HID: map[uint16][]byte{
|
HID: map[uint16][]byte{
|
||||||
2: Append([][]byte{
|
2: Append([][]byte{
|
||||||
|
@ -147,6 +148,15 @@ var CDCHID = Descriptor{
|
||||||
HIDReportCount(1),
|
HIDReportCount(1),
|
||||||
HIDReportSize(8),
|
HIDReportSize(8),
|
||||||
HIDInputConstVarAbs,
|
HIDInputConstVarAbs,
|
||||||
|
HIDReportCount(3),
|
||||||
|
HIDReportSize(1),
|
||||||
|
HIDUsagePageLED,
|
||||||
|
HIDUsageMinimum(1),
|
||||||
|
HIDUsageMaximum(3),
|
||||||
|
HIDOutputDataVarAbs,
|
||||||
|
HIDReportCount(5),
|
||||||
|
HIDReportSize(1),
|
||||||
|
HIDOutputConstVarAbs,
|
||||||
HIDReportCount(6),
|
HIDReportCount(6),
|
||||||
HIDReportSize(8),
|
HIDReportSize(8),
|
||||||
HIDLogicalMinimum(0),
|
HIDLogicalMinimum(0),
|
||||||
|
|
|
@ -13,6 +13,7 @@ const (
|
||||||
hidUnit = 0x65
|
hidUnit = 0x65
|
||||||
hidCollection = 0xa1
|
hidCollection = 0xa1
|
||||||
hidInput = 0x81
|
hidInput = 0x81
|
||||||
|
hidOutput = 0x91
|
||||||
hidReportSize = 0x75
|
hidReportSize = 0x75
|
||||||
hidReportCount = 0x95
|
hidReportCount = 0x95
|
||||||
hidReportID = 0x85
|
hidReportID = 0x85
|
||||||
|
@ -121,6 +122,12 @@ var (
|
||||||
|
|
||||||
// Input (Data, Variable, Relative), 2 position bytes (X & Y)
|
// Input (Data, Variable, Relative), 2 position bytes (X & Y)
|
||||||
HIDInputDataVarRel = []byte{hidInput, 0x06}
|
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 {
|
func HIDReportSize(size int) []byte {
|
||||||
|
|
|
@ -36,6 +36,12 @@ func SetHandler(d hidDevicer) {
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
machine.ConfigureUSBEndpoint(descriptor.CDCHID,
|
machine.ConfigureUSBEndpoint(descriptor.CDCHID,
|
||||||
[]usb.EndpointConfig{
|
[]usb.EndpointConfig{
|
||||||
|
{
|
||||||
|
Index: usb.HID_ENDPOINT_OUT,
|
||||||
|
IsIn: false,
|
||||||
|
Type: usb.ENDPOINT_TYPE_INTERRUPT,
|
||||||
|
RxHandler: rxHandler,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Index: usb.HID_ENDPOINT_IN,
|
Index: usb.HID_ENDPOINT_IN,
|
||||||
IsIn: true,
|
IsIn: true,
|
||||||
|
|
|
@ -92,6 +92,9 @@ func (kb *keyboard) TxHandler() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kb *keyboard) RxHandler(b []byte) bool {
|
func (kb *keyboard) RxHandler(b []byte) bool {
|
||||||
|
if len(b) >= 2 && b[0] == 2 /* ReportID */ {
|
||||||
|
kb.led = b[1]
|
||||||
|
}
|
||||||
return false
|
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 {
|
func (kb *keyboard) ready() bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче