Primax 無線鍵盤的 Linux HID 驅動程序
我買了一個與舊鍵盤類似的新鍵盤。舊的有效,新的無效。新鍵盤有一個不尋常的 HID 描述符並發送一個額外的數據字節。是否有支持這種鍵盤(描述符)的 Linux 驅動程序?
通過 的通信日誌
cat /sys/kernel/debug/usb/usbmon/3u
,僅字節序列(按 A,釋放 A;按 Shift,按 A,釋放 A,釋放 Shift 序列):非工作 9 字節鍵盤通信:
00000400 00000000 71 00000000 00000000 71 02000000 00000000 71 02000400 00000000 71 02000000 00000000 71 00000000 00000000 71
工作舊鍵盤通信:
00000400 00000000 00000000 00000000 02000000 00000000 02000400 00000000 02000000 00000000 00000000 00000000
獎勵:額外的字節是多少?(我總是在
0x71
那裡看到。)新鍵盤的 HID 描述符通過
cat /sys/kernel/debug/hid/<interface>/rdesc
:介面
0003:17EF:609B.0089
:05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 75 08 95 01 81 01 05 08 19 01 29 03 75 01 95 03 91 02 95 01 75 05 91 01 15 00 26 ff 00 19 00 2a ff 00 05 07 75 08 95 06 81 00 05 01 0a 68 01 15 80 25 7f 95 01 75 08 81 02 c0 INPUT[INPUT] Field(0) Application(GenericDesktop.Keyboard) Usage(8) Keyboard.00e0 Keyboard.00e1 Keyboard.00e2 Keyboard.00e3 Keyboard.00e4 Keyboard.00e5 Keyboard.00e6 Keyboard.00e7 Logical Minimum(0) Logical Maximum(1) Report Size(1) Report Count(8) Report Offset(0) Flags( Variable Absolute ) Field(1) Application(GenericDesktop.Keyboard) Usage(256) LED.0000 LED.NumLock LED.CapsLock LED.ScrollLock LED.Compose LED.Kana LED.0006 LED.0007 LED.0008 LED.0009 ... LED sequence left out LED.0049 LED.004a LED.GenericIndicator LED.004c LED.004d LED.004e LED.004f ... LED sequence left out LED.00fd LED.00fe LED.00ff Logical Minimum(0) Logical Maximum(255) Report Size(8) Report Count(6) Report Offset(16) Flags( Array Absolute ) Field(2) Application(GenericDesktop.Keyboard) Usage(1) GenericDesktop.0168 Logical Minimum(-128) Logical Maximum(127) Report Size(8) Report Count(1) Report Offset(64) Flags( Variable Absolute ) OUTPUT[OUTPUT] Field(0) Application(GenericDesktop.Keyboard) Usage(3) LED.NumLock LED.CapsLock LED.ScrollLock Logical Minimum(0) Logical Maximum(1) Report Size(1) Report Count(3) Report Offset(0) Flags( Variable Absolute ) Keyboard.00e0 ---> Key.LeftControl Keyboard.00e1 ---> Key.LeftShift Keyboard.00e2 ---> Key.LeftAlt Keyboard.00e3 ---> Key.LeftMeta Keyboard.00e4 ---> Key.RightCtrl Keyboard.00e5 ---> Key.RightShift Keyboard.00e6 ---> Key.RightAlt Keyboard.00e7 ---> Key.RightMeta LED.0000 ---> Sync.Report LED.NumLock ---> LED.NumLock LED.CapsLock ---> LED.CapsLock LED.ScrollLock ---> LED.ScrollLock LED.Compose ---> LED.Compose LED.Kana ---> LED.Kana LED.0006 ---> Sync.Report LED.0007 ---> Sync.Report LED.0008 ---> Sync.Report LED.0009 ---> LED.Mute LED.000a ---> Sync.Report LED.000b ---> Sync.Report ... Sync.Report lines left out LED.0017 ---> Sync.Report LED.0018 ---> Sync.Report LED.0019 ---> LED.? LED.001a ---> Sync.Report LED.001b ---> Sync.Report ... Sync.Report lines left out LED.0025 ---> Sync.Report LED.0026 ---> Sync.Report LED.0027 ---> LED.Sleep LED.0028 ---> Sync.Report LED.0029 ---> Sync.Report ... Sync.Report lines left out LED.0049 ---> Sync.Report LED.004a ---> Sync.Report LED.GenericIndicator ---> LED.Misc LED.004c ---> LED.Suspend LED.004d ---> LED.? LED.004e ---> Sync.Report LED.004f ---> Sync.Report ... Sync.Report lines left out LED.00fe ---> Sync.Report LED.00ff ---> Sync.Report GenericDesktop.0168 ---> Absolute.Misc LED.NumLock ---> LED.? LED.CapsLock ---> LED.? LED.ScrollLock ---> LED.?
介面
0003:17EF:609B.008B
:05 0c 09 01 a1 01 85 01 19 00 2a 3c 02 15 00 26 3c 02 95 01 75 10 81 00 05 01 0a 68 01 15 80 25 7f 95 01 75 08 81 02 c0 05 01 09 80 a1 01 85 02 19 81 29 83 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 0a 68 01 15 80 25 7f 95 01 75 08 81 02 c0 06 01 ff 09 01 a1 01 85 05 95 07 75 08 15 00 26 ff 00 09 20 b1 03 c0 INPUT(1)[INPUT] Field(0) Application(Consumer.0001) Usage(573) Consumer.0000 Consumer.0001 Consumer.0002 Consumer.0003 Consumer.0004 ... Consumer sequence left out Consumer.0235 Consumer.0236 Consumer.0237 Consumer.HorizontalWheel Consumer.0239 Consumer.023a Consumer.023b Consumer.023c Logical Minimum(0) Logical Maximum(572) Report Size(16) Report Count(1) Report Offset(0) Flags( Array Absolute ) Field(1) Application(Consumer.0001) Usage(1) GenericDesktop.0168 Logical Minimum(-128) Logical Maximum(127) Report Size(8) Report Count(1) Report Offset(16) Flags( Variable Absolute ) INPUT(2)[INPUT] Field(0) Application(GenericDesktop.SystemControl) Usage(3) GenericDesktop.SystemPowerDown GenericDesktop.SystemSleep GenericDesktop.SystemWakeUp Logical Minimum(0) Logical Maximum(1) Report Size(1) Report Count(3) Report Offset(0) Flags( Variable Absolute ) Field(1) Application(GenericDesktop.SystemControl) Usage(1) GenericDesktop.0168 Logical Minimum(-128) Logical Maximum(127) Report Size(8) Report Count(1) Report Offset(8) Flags( Variable Absolute ) FEATURE(5)[FEATURE] Field(0) Application(ff01.0001) Usage(7) ff01.0020 ff01.0020 ff01.0020 ff01.0020 ff01.0020 ff01.0020 ff01.0020 Logical Minimum(0) Logical Maximum(255) Report Size(8) Report Count(7) Report Offset(0) Flags( Constant Variable Absolute ) Consumer.0000 ---> Sync.Report Consumer.0001 ---> Key.Unknown Consumer.0002 ---> Key.Unknown ... Key.Unknown lines left out Consumer.002e ---> Key.Unknown Consumer.002f ---> Key.Unknown Consumer.0030 ---> Key.Power Consumer.0031 ---> Key.Restart Consumer.0032 ---> Key.Sleep Consumer.0033 ---> Key.Unknown Consumer.0034 ---> Key.Sleep Consumer.0035 ---> Key.KbdIlluminationToggle Consumer.0036 ---> Key.Btn0 Consumer.0037 ---> Key.Unknown Consumer.0038 ---> Key.Unknown ... Key.Unknown lines left out Consumer.003e ---> Key.Unknown Consumer.003f ---> Key.Unknown Consumer.0040 ---> Key.Menu Consumer.0041 ---> Key.Select Consumer.0042 ---> Key.Up Consumer.0043 ---> Key.Down Consumer.0044 ---> Key.Left Consumer.0045 ---> Key.Right Consumer.0046 ---> Key.Esc Consumer.0047 ---> Key.KPPlus Consumer.0048 ---> Key.KPMinus Consumer.0049 ---> Key.Unknown Consumer.004a ---> Key.Unknown ... Key.Unknown lines left out Consumer.005e ---> Key.Unknown Consumer.005f ---> Key.Unknown Consumer.0060 ---> Key.Info Consumer.0061 ---> Key.Subtitle Consumer.0062 ---> Key.Unknown Consumer.0063 ---> Key.VCR Consumer.0064 ---> Key.Unknown Consumer.0065 ---> Key.Camera Consumer.0066 ---> Key.Unknown Consumer.0067 ---> Key.Unknown Consumer.0068 ---> Key.Unknown Consumer.0069 ---> Key.Red Consumer.006a ---> Key.Green Consumer.006b ---> Key.Blue Consumer.006c ---> Key.Yellow Consumer.006d ---> Key.Zoom Consumer.006e ---> Key.Unknown Consumer.006f ---> Key.BrightnessUp Consumer.0070 ---> Key.BrightnessDown Consumer.0071 ---> Key.Unknown Consumer.0072 ---> Key.? Consumer.0073 ---> Key.BrightnessMin Consumer.0074 ---> Key.BrightnessMax Consumer.0075 ---> Key.BrightnessAuto Consumer.0076 ---> Key.Unknown Consumer.0077 ---> Key.Unknown ... Key.Unknown lines left out Consumer.0080 ---> Key.Unknown Consumer.0081 ---> Key.Unknown Consumer.0082 ---> Key.? Consumer.0083 ---> Key.Last Consumer.0084 ---> Key.Enter Consumer.0085 ---> Key.Unknown Consumer.0086 ---> Key.Unknown Consumer.0087 ---> Key.Unknown Consumer.0088 ---> Key.PC Consumer.0089 ---> Key.TV Consumer.008a ---> Key.WWW Consumer.008b ---> Key.DVD Consumer.008c ---> Key.Phone Consumer.008d ---> Key.Program Consumer.008e ---> Key.? Consumer.008f ---> Key.? Consumer.0090 ---> Key.Memo Consumer.0091 ---> Key.CD Consumer.0092 ---> Key.VCR Consumer.0093 ---> Key.Tuner Consumer.0094 ---> Key.Exit Consumer.0095 ---> Key.Help Consumer.0096 ---> Key.Tape Consumer.0097 ---> Key.TV2 Consumer.0098 ---> Key.Sat Consumer.0099 ---> Key.Unknown Consumer.009a ---> Key.PVR Consumer.009b ---> Key.Unknown Consumer.009c ---> Key.ChannelUp Consumer.009d ---> Key.ChannelDown Consumer.009e ---> Key.Unknown Consumer.009f ---> Key.Unknown Consumer.00a0 ---> Key.VCR2 Consumer.00a1 ---> Key.Unknown Consumer.00a2 ---> Key.Unknown ... Key.Unknown lines left out Consumer.00ae ---> Key.Unknown Consumer.00af ---> Key.Unknown Consumer.00b0 ---> Key.Play Consumer.00b1 ---> Key.Pause Consumer.00b2 ---> Key.Record Consumer.00b3 ---> Key.FastForward Consumer.00b4 ---> Key.Rewind Consumer.00b5 ---> Key.NextSong Consumer.00b6 ---> Key.PreviousSong Consumer.00b7 ---> Key.StopCD Consumer.00b8 ---> Key.EjectCD Consumer.00b9 ---> Key.Shuffle Consumer.00ba ---> Key.Unknown Consumer.00bb ---> Key.Unknown Consumer.00bc ---> Key.? Consumer.00bd ---> Key.Unknown Consumer.00be ---> Key.Unknown Consumer.00bf ---> Key.Slow Consumer.00c0 ---> Key.Unknown Consumer.00c1 ---> Key.Unknown ... Key.Unknown lines left out Consumer.00cb ---> Key.Unknown Consumer.00cc ---> Key.Unknown Consumer.00cd ---> Key.PlayPause Consumer.00ce ---> Key.Unknown Consumer.00cf ---> Key.VoiceCommand Consumer.00d0 ---> Key.Unknown Consumer.00d1 ---> Key.Unknown ... Key.Unknown lines left out Consumer.00de ---> Key.Unknown Consumer.00df ---> Key.Unknown Consumer.00e0 ---> Absolute.Volume Consumer.00e1 ---> Key.Unknown Consumer.00e2 ---> Key.Mute Consumer.00e3 ---> Key.Unknown Consumer.00e4 ---> Key.Unknown Consumer.00e5 ---> Key.BassBoost Consumer.00e6 ---> Key.Unknown Consumer.00e7 ---> Key.Unknown Consumer.00e8 ---> Key.Unknown Consumer.00e9 ---> Key.VolumeUp Consumer.00ea ---> Key.VolumeDown Consumer.00eb ---> Key.Unknown Consumer.00ec ---> Key.Unknown ... Key.Unknown lines left out Consumer.00f3 ---> Key.Unknown Consumer.00f4 ---> Key.Unknown Consumer.00f5 ---> Key.Slow Consumer.00f6 ---> Key.Unknown Consumer.00f7 ---> Key.Unknown ... Key.Unknown lines left out Consumer.017f ---> Key.Unknown Consumer.0180 ---> Key.Unknown Consumer.0181 ---> Key.ButtonConfig Consumer.0182 ---> Key.Bookmarks Consumer.0183 ---> Key.Config Consumer.0184 ---> Key.? Consumer.0185 ---> Key.? Consumer.0186 ---> Key.? Consumer.0187 ---> Key.? Consumer.0188 ---> Key.? Consumer.0189 ---> Key.? Consumer.018a ---> Key.Mail Consumer.018b ---> Key.? Consumer.018c ---> Key.? Consumer.018d ---> Key.? Consumer.018e ---> Key.Calendar Consumer.018f ---> Key.TaskManager Consumer.0190 ---> Key.Journal Consumer.0191 ---> Key.Finance Consumer.0192 ---> Key.Calc Consumer.0193 ---> Key.Player Consumer.0194 ---> Key.File Consumer.0195 ---> Key.Unknown Consumer.0196 ---> Key.WWW Consumer.0197 ---> Key.Unknown Consumer.0198 ---> Key.Unknown Consumer.0199 ---> Key.Chat Consumer.019a ---> Key.Unknown Consumer.019b ---> Key.Unknown Consumer.019c ---> Key.Logoff Consumer.019d ---> Key.Unknown Consumer.019e ---> Key.Coffee Consumer.019f ---> Key.ControlPanel Consumer.01a0 ---> Key.Unknown Consumer.01a1 ---> Key.Unknown Consumer.01a2 ---> Key.AppSelect Consumer.01a3 ---> Key.Next Consumer.01a4 ---> Key.Previous Consumer.01a5 ---> Key.Unknown Consumer.01a6 ---> Key.Help Consumer.01a7 ---> Key.Documents Consumer.01a8 ---> Key.Unknown Consumer.01a9 ---> Key.Unknown Consumer.01aa ---> Key.Unknown Consumer.01ab ---> Key.SpellCheck Consumer.01ac ---> Key.Unknown Consumer.01ad ---> Key.Unknown Consumer.01ae ---> Key.Keyboard Consumer.01af ---> Key.Unknown Consumer.01b0 ---> Key.Unknown Consumer.01b1 ---> Key.ScreenSaver Consumer.01b2 ---> Key.Unknown Consumer.01b3 ---> Key.Unknown Consumer.01b4 ---> Key.File Consumer.01b5 ---> Key.Unknown Consumer.01b6 ---> Key.? Consumer.01b7 ---> Key.Audio Consumer.01b8 ---> Key.Video Consumer.01b9 ---> Key.Unknown Consumer.01ba ---> Key.Unknown Consumer.01bb ---> Key.Unknown Consumer.01bc ---> Key.? Consumer.01bd ---> Key.Info Consumer.01be ---> Key.Unknown Consumer.01bf ---> Key.Unknown ... Key.Unknown lines left out Consumer.01ff ---> Key.Unknown Consumer.0200 ---> Key.Unknown Consumer.0201 ---> Key.New Consumer.0202 ---> Key.Open Consumer.0203 ---> Key.Close Consumer.0204 ---> Key.Exit Consumer.0205 ---> Key.Unknown Consumer.0206 ---> Key.Unknown Consumer.0207 ---> Key.Save Consumer.0208 ---> Key.Print Consumer.0209 ---> Key.Props Consumer.020a ---> Key.Unknown Consumer.020b ---> Key.Unknown ... Key.Unknown lines left out Consumer.0218 ---> Key.Unknown Consumer.0219 ---> Key.Unknown Consumer.021a ---> Key.Undo Consumer.021b ---> Key.Copy Consumer.021c ---> Key.Cut Consumer.021d ---> Key.Paste Consumer.021e ---> Key.Unknown Consumer.021f ---> Key.Find Consumer.0220 ---> Key.Unknown Consumer.0221 ---> Key.Search Consumer.0222 ---> Key.Goto Consumer.0223 ---> Key.HomePage Consumer.0224 ---> Key.Back Consumer.0225 ---> Key.Forward Consumer.0226 ---> Key.Stop Consumer.0227 ---> Key.Refresh Consumer.0228 ---> Key.Unknown Consumer.0229 ---> Key.Unknown Consumer.022a ---> Key.Bookmarks Consumer.022b ---> Key.Unknown Consumer.022c ---> Key.Unknown Consumer.022d ---> Key.? Consumer.022e ---> Key.? Consumer.022f ---> Key.? Consumer.0230 ---> Key.Unknown Consumer.0231 ---> Key.Unknown Consumer.0232 ---> Key.Unknown Consumer.0233 ---> Key.ScrollUp Consumer.0234 ---> Key.ScrollDown Consumer.0235 ---> Key.Unknown Consumer.0236 ---> Key.Unknown Consumer.0237 ---> Key.Unknown Consumer.HorizontalWheel ---> Relative.HWheel Consumer.0239 ---> Key.Unknown Consumer.023a ---> Key.Unknown Consumer.023b ---> Key.Unknown Consumer.023c ---> Key.Unknown GenericDesktop.0168 ---> Absolute.Misc GenericDesktop.SystemPowerDown ---> Key.Power GenericDesktop.SystemSleep ---> Key.Sleep GenericDesktop.SystemWakeUp ---> Key.WakeUp GenericDesktop.0168 ---> Sync.Report
老鍵盤的HID描述符,介面
0003:17EF:6022.0087
(只有一個鍵盤介面):05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 15 00 26 a4 00 19 00 2a a4 00 05 07 75 08 95 06 81 00 c0 INPUT[INPUT] Field(0) Application(GenericDesktop.Keyboard) Usage(8) Keyboard.00e0 Keyboard.00e1 Keyboard.00e2 Keyboard.00e3 Keyboard.00e4 Keyboard.00e5 Keyboard.00e6 Keyboard.00e7 Logical Minimum(0) Logical Maximum(1) Report Size(1) Report Count(8) Report Offset(0) Flags( Variable Absolute ) Field(1) Application(GenericDesktop.Keyboard) Usage(165) Keyboard.0000 Keyboard.0001 Keyboard.0002 Keyboard.0003 Keyboard.0004 ... Keyboard sequence left out Keyboard.009f Keyboard.00a0 Keyboard.00a1 Keyboard.00a2 Keyboard.00a3 Keyboard.00a4 Logical Minimum(0) Logical Maximum(164) Report Size(8) Report Count(6) Report Offset(16) Flags( Array Absolute ) Keyboard.00e0 ---> Key.LeftControl Keyboard.00e1 ---> Key.LeftShift Keyboard.00e2 ---> Key.LeftAlt Keyboard.00e3 ---> Key.LeftMeta Keyboard.00e4 ---> Key.RightCtrl Keyboard.00e5 ---> Key.RightShift Keyboard.00e6 ---> Key.RightAlt Keyboard.00e7 ---> Key.RightMeta Keyboard.0000 ---> Sync.Report Keyboard.0001 ---> Sync.Report Keyboard.0002 ---> Sync.Report Keyboard.0003 ---> Sync.Report Keyboard.0004 ---> Key.A Keyboard.0005 ---> Key.B Keyboard.0006 ---> Key.C Keyboard.0007 ---> Key.D Keyboard.0008 ---> Key.E Keyboard.0009 ---> Key.F Keyboard.000a ---> Key.G Keyboard.000b ---> Key.H Keyboard.000c ---> Key.I Keyboard.000d ---> Key.J Keyboard.000e ---> Key.K Keyboard.000f ---> Key.L Keyboard.0010 ---> Key.M Keyboard.0011 ---> Key.N Keyboard.0012 ---> Key.O Keyboard.0013 ---> Key.P Keyboard.0014 ---> Key.Q Keyboard.0015 ---> Key.R Keyboard.0016 ---> Key.S Keyboard.0017 ---> Key.T Keyboard.0018 ---> Key.U Keyboard.0019 ---> Key.V Keyboard.001a ---> Key.W Keyboard.001b ---> Key.X Keyboard.001c ---> Key.Y Keyboard.001d ---> Key.Z Keyboard.001e ---> Key.1 Keyboard.001f ---> Key.2 Keyboard.0020 ---> Key.3 Keyboard.0021 ---> Key.4 Keyboard.0022 ---> Key.5 Keyboard.0023 ---> Key.6 Keyboard.0024 ---> Key.7 Keyboard.0025 ---> Key.8 Keyboard.0026 ---> Key.9 Keyboard.0027 ---> Key.0 Keyboard.0028 ---> Key.Enter Keyboard.0029 ---> Key.Esc Keyboard.002a ---> Key.Backspace Keyboard.002b ---> Key.Tab Keyboard.002c ---> Key.Space Keyboard.002d ---> Key.Minus Keyboard.002e ---> Key.Equal Keyboard.002f ---> Key.LeftBrace Keyboard.0030 ---> Key.RightBrace Keyboard.0031 ---> Key.BackSlash Keyboard.0032 ---> Key.BackSlash Keyboard.0033 ---> Key.Semicolon Keyboard.0034 ---> Key.Apostrophe Keyboard.0035 ---> Key.Grave Keyboard.0036 ---> Key.Comma Keyboard.0037 ---> Key.Dot Keyboard.0038 ---> Key.Slash Keyboard.0039 ---> Key.CapsLock Keyboard.003a ---> Key.F1 Keyboard.003b ---> Key.F2 Keyboard.003c ---> Key.F3 Keyboard.003d ---> Key.F4 Keyboard.003e ---> Key.F5 Keyboard.003f ---> Key.F6 Keyboard.0040 ---> Key.F7 Keyboard.0041 ---> Key.F8 Keyboard.0042 ---> Key.F9 Keyboard.0043 ---> Key.F10 Keyboard.0044 ---> Key.F11 Keyboard.0045 ---> Key.F12 Keyboard.0046 ---> Key.SysRq Keyboard.0047 ---> Key.ScrollLock Keyboard.0048 ---> Key.Pause Keyboard.0049 ---> Key.Insert Keyboard.004a ---> Key.Home Keyboard.004b ---> Key.PageUp Keyboard.004c ---> Key.Delete Keyboard.004d ---> Key.End Keyboard.004e ---> Key.PageDown Keyboard.004f ---> Key.Right Keyboard.0050 ---> Key.Left Keyboard.0051 ---> Key.Down Keyboard.0052 ---> Key.Up Keyboard.0053 ---> Key.NumLock Keyboard.0054 ---> Key.KPSlash Keyboard.0055 ---> Key.KPAsterisk Keyboard.0056 ---> Key.KPMinus Keyboard.0057 ---> Key.KPPlus Keyboard.0058 ---> Key.KPEnter Keyboard.0059 ---> Key.KP1 Keyboard.005a ---> Key.KP2 Keyboard.005b ---> Key.KP3 Keyboard.005c ---> Key.KP4 Keyboard.005d ---> Key.KP5 Keyboard.005e ---> Key.KP6 Keyboard.005f ---> Key.KP7 Keyboard.0060 ---> Key.KP8 Keyboard.0061 ---> Key.KP9 Keyboard.0062 ---> Key.KP0 Keyboard.0063 ---> Key.KPDot Keyboard.0064 ---> Key.102nd Keyboard.0065 ---> Key.Compose Keyboard.0066 ---> Key.Power Keyboard.0067 ---> Key.KPEqual Keyboard.0068 ---> Key.F13 Keyboard.0069 ---> Key.F14 Keyboard.006a ---> Key.F15 Keyboard.006b ---> Key.F16 Keyboard.006c ---> Key.F17 Keyboard.006d ---> Key.F18 Keyboard.006e ---> Key.F19 Keyboard.006f ---> Key.F20 Keyboard.0070 ---> Key.F21 Keyboard.0071 ---> Key.F22 Keyboard.0072 ---> Key.F23 Keyboard.0073 ---> Key.F24 Keyboard.0074 ---> Key.Open Keyboard.0075 ---> Key.Help Keyboard.0076 ---> Key.Props Keyboard.0077 ---> Key.Front Keyboard.0078 ---> Key.Stop Keyboard.0079 ---> Key.Again Keyboard.007a ---> Key.Undo Keyboard.007b ---> Key.Cut Keyboard.007c ---> Key.Copy Keyboard.007d ---> Key.Paste Keyboard.007e ---> Key.Find Keyboard.007f ---> Key.Mute Keyboard.0080 ---> Key.VolumeUp Keyboard.0081 ---> Key.VolumeDown Keyboard.0082 ---> Key.Unknown Keyboard.0083 ---> Key.Unknown Keyboard.0084 ---> Key.Unknown Keyboard.0085 ---> Key.KPComma Keyboard.0086 ---> Key.Unknown Keyboard.0087 ---> Key.RO Keyboard.0088 ---> Key.Katakana/Hiragana Keyboard.0089 ---> Key.Yen Keyboard.008a ---> Key.Henkan Keyboard.008b ---> Key.Muhenkan Keyboard.008c ---> Key.KPJpComma Keyboard.008d ---> Key.Unknown Keyboard.008e ---> Key.Unknown Keyboard.008f ---> Key.Unknown Keyboard.0090 ---> Key.Hangeul Keyboard.0091 ---> Key.Hanja Keyboard.0092 ---> Key.Katakana Keyboard.0093 ---> Key.HIRAGANA Keyboard.0094 ---> Key.Zenkaku/Hankaku Keyboard.0095 ---> Key.Unknown Keyboard.0096 ---> Key.Unknown ... Key.Unknown lines left out Keyboard.009a ---> Key.Unknown Keyboard.009b ---> Key.Unknown Keyboard.009c ---> Key.Delete Keyboard.009d ---> Key.Unknown Keyboard.009e ---> Key.Unknown ... Key.Unknown lines left out Keyboard.00a3 ---> Key.Unknown Keyboard.00a4 ---> Key.Unknown
(聯想專業無線鍵盤、華碩鍵盤……這兩種無線鍵盤均由 Primax 製造。)
(在 Windows 和 GRUB 上沒有遇到的問題。)
(Yves Trudeau 已經使用它並實現了一個忽略額外字節的驅動程序,但我寧願使用來自 vanilla 核心的東西和不那麼 hacky 的東西。)
一個適當的修復被合併到 Linux 核心中:https ://lkml.org/lkml/2019/3/27/350
只要版本 5.2 發布,它就會可用,並且可能會在某些發行版上向後移植。
這是使用hidrd對 0003:17EF:609B.0089 (新鍵盤)的原始 HID 描述符的翻譯:
05 01 Usage Page (Desktop), ; Generic desktop controls (01h) 09 06 Usage (Keyboard), ; Keyboard (06h, application collection) a1 01 Collection (Application), 05 07 Usage Page (Keyboard), ; Keyboard/keypad (07h) 19 e0 Usage Minimum (KB Leftcontrol), ; Keyboard left control (E0h, dynamic value) 29 e7 Usage Maximum (KB Right GUI), ; Keyboard right GUI (E7h, dynamic value) 15 00 Logical Minimum (0), 25 01 Logical Maximum (1), 75 01 Report Size (1), 95 08 Report Count (8), 81 02 Input (Variable), 75 08 Report Size (8), 95 01 Report Count (1), 81 01 Input (Constant), 05 08 Usage Page (LED), ; LEDs (08h) 19 01 Usage Minimum (01h), 29 03 Usage Maximum (03h), 75 01 Report Size (1), 95 03 Report Count (3), 91 02 Output (Variable), 95 01 Report Count (1), 75 05 Report Size (5), 91 01 Output (Constant), 15 00 Logical Minimum (0), 26 ff 00 Logical Maximum (255), 19 00 Usage Minimum (00h), 2a ff 00 Usage Maximum (FFh), 05 07 Usage Page (Keyboard), ; Keyboard/keypad (07h) 75 08 Report Size (8), 95 06 Report Count (6), 81 00 Input, 05 01 Usage Page (Desktop), ; Generic desktop controls (01h) 0a 68 01 Usage (0168h), 15 80 Logical Minimum (-128), 25 7f Logical Maximum (127), 95 01 Report Count (1), 75 08 Report Size (8), 81 02 Input (Variable), c0 End Collection
它包含
Input
欄位(來自鍵盤的報告)和Output
欄位(發送到鍵盤的控制消息),它們混雜在一起,這並不奇怪。輸入欄位也非常標準:第一個字節包含修飾鍵位(左移和右移/ctrl/alt/meta),然後是恆定的零字節,然後是最多 6 個同時按下的鍵的 6 個字節。從報告範例中可以看出,這也正是鍵盤發送的內容。最後一個額外字節的範圍為 -128 到 127(
71
-15 也是如此),並被描述為“通用桌面”,使用索引為 0x168。在公開的 HID Usage Table (HUT) 版本 1.12 中沒有分配這個索引,所以我不知道它是什麼意思。它必須是某種模擬範圍(鍵盤傾斜?壓力?其他感測器?)。它是什麼也不是特別重要,它只會被 HID 翻譯層忽略。輸出消息也是標準的:1 個字節,其中 3 位控制鍵盤 LED(數字鎖定、大寫鎖定、滾動鎖定),5 位未使用。
Usage Page (Keyboard)
但是,從輸出欄位到下一個輸入欄位的切換Usage Page (LED)
發生在塊的中間,顯然這會混淆核心 HID 描述符解析器,因此它將這個輸入欄位也解釋為“LED”,這沒有任何意義根本,並阻止它按應有的方式翻譯密鑰。這是一個錯誤:要麼在核心 HID 描述符解析器中,要麼在 HID 描述符中。在第一種情況下,它應該被修復,在最後一種情況下,描述符應該在核心中得到一個怪癖,以便它可以被修復。無論如何,將其作為錯誤報告給核心維護人員。
一旦它被修復,核心應該可以正常辨識鍵盤事件。不需要額外的驅動程序(儘管在修復錯誤之前使用一個作為解決方法並沒有什麼壞處)。
核心 HID 解析器位於 中
drivers/hid/hid-core.c
,以防您想自己修復它。