Linux

Primax 無線鍵盤的 Linux HID 驅動程序

  • September 19, 2019

我買了一個與舊鍵盤類似的新鍵盤。舊的有效,新的無效。新鍵盤有一個不尋常的 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,以防您想自己修復它。

引用自:https://unix.stackexchange.com/questions/377830