为什么单个 Yubico 显示为多个设备,hid-generic 和 input 之间有什么区别?

为什么单个 Yubico 显示为多个设备,hid-generic 和 input 之间有什么区别?

当我插入 Yubikey 时,它显示为,

usb 1-1: new full-speed USB device number 46 using xhci_hcd
usb 1-1: New USB device found, idVendor=1050, idProduct=0407, bcdDevice= 5.12
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1: Product: YubiKey OTP+FIDO+CCID
usb 1-1: Manufacturer: Yubico
input: Yubico YubiKey OTP+FIDO+CCID as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:1050:0407.006A/input/input93
hid-generic 0003:1050:0407.006A: input,hidraw0: USB HID v1.10 Keyboard [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-1/input0
hid-generic 0003:1050:0407.006B: hiddev0,hidraw1: USB HID v1.10 Device [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-1/input1

为什么 Yubikey 有三个输入设备?

/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:1050:0407.006A/input/input93
usb-0000:00:14.0-1/input0
usb-0000:00:14.0-1/input1

hid-generic和 和有什么区别input?又是如何hidraw发挥作用的呢?

答案1

部分答案:

内核input层是通过所有可能的传输技术对所有可能的输入设备的抽象。 PS/2 键盘、串行鼠标、USB 键盘、USB 摄像头按钮等最终都显示为输入设备。这些设备上的事件可通过 获得/dev/input/event*,您可以使用evtest来显示它们。在其之上分层(例如 X viaevdev或 Wayland via libinput),然后拾取这些事件并使它们可供(图形应用程序)使用。

在层次结构的另一侧,大多数设备还具有与特定传输关联的设备文件。一个重要的类别是 HID(= 人机接口设备),这些设备(通常是 USB)带有用于设备功能的标准化描述符(“HID 描述符”)。所以设备本身告诉内核它是键盘、鼠标、操纵杆等;它生成哪些键或移动事件,在某种程度上如何配置它等等。

HID 设备也始终会获取一个/dev/hidraw*文件,可以在其中读取原始 HID 事件(如有必要)。通常,如果内核可以理解 HID 描述符,这些事件将由内核处理,然后作为输入层事件提供。

因此,您需要阅读如下系统日志条目:

input: Yubico YubiKey OTP+FIDO+CCID as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:1050:0407.006A/input/input93
hid-generic 0003:1050:0407.006A: input,hidraw0: USB HID v1.10 Keyboard [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-1/input0

“有一个类键盘的USB HID接口。内核理解这个类,它将获取一个hidraw0设备文件和一个/dev/input/eventX(可能X=93)设备文件。hid-generic内核模块检测到这一点,并调用input内核层。”

hid-generic 0003:1050:0407.006B: hiddev0,hidraw1: USB HID v1.10 Device [Yubico YubiKey OTP+FIDO+CCID] on usb-0000:00:14.0-1/input

“有一个 USB HID 接口,其类无法被内核理解。由于它无法转发到输入层,因此它将获取hiddev0通用 HID 事件的设备文件,并且还将获取hidraw1原始设备文件HID 事件。hid-generic

因此,根据您的计算方式,您拥有的不是三个,而是两个 HID 接口,每个接口都有两个关联的设备文件,总共有四个设备文件,其中仅自动使用输入层设备文件。

至于为什么Yubikey 是这么做的,只有 Yubikey 知道。一个合理的猜测是,它们提供了一个可以被任何操作系统(键盘 HID)拾取的通用接口和一个用于 Yubikey 特殊配置的接口,该接口只能被 Yubikey 特定软件理解。

相关内容