USB 键盘是只发送信号,还是也从计算机接收信号?

Ne *_* Mo 82 usb keyboard

键盘不需要来自电脑的任何信号,只需要电源,对吧?或者它需要接收信号和发送信号吗?

编辑:我没想到这个问题会引起这么大的兴趣!我问它是因为我有一个空闲的梦想,那就是建造一个复制信号的 doohickey,这样键盘就可以同时向两台计算机发送相同的字母。由于(从我在答案中可以看出)计算机像任何其他设备一样主动控制键盘,这显然是不可能的。没什么大不了的,因为实际上我无论如何都没有构建它的技能!

Law*_*ceC 101

从“人机接口设备 (HID) 的设备类定义”版本 11.1规范中:

LED 状态与 CAPS LOCK、NUM LOCK、SCROLL LOCK、COMPOSE 和 KANA 事件之间的同步由主机而非键盘维护。如果使用附录 B 中的键盘描述符,则通过 Set_Report(Output) 请求向键盘发送5 位绝对报告来设置 LED 状态。

要更改键盘 LED,键盘会接受一个命令来执行此操作。所以它不是一个“仅输入”设备(意味着它只向主机输出数据)。

话虽如此,所有需要在主机和设备之间进行来回对话的 USB 设备都有一个协商和枚举过程。您不能拥有“只读”USB 设备。

即使在 USB 出现之前,PC 键盘控制器也会接受命令,因为它除了读取键盘(参考)之外还做了一些事情:

如果键盘是一个单独的外围系统单元(例如在大多数现代台式计算机中),则键盘控制器不直接连接到按键,而是通过某种串行接口从嵌入键盘的微控制器接收扫描码。在这种情况下,控制器通常还通过电线将数据发送回键盘来控制键盘的 LED。

IBM PC AT 使用 Intel 8042 芯片连接到键盘。这台计算机还控制对 A20 线的访问,以解决 Intel 80286 中的芯片错误。1键盘控制器还用于启动软件 CPU 复位,以允许 CPU 从保护模式转换为真实模式模式1,因为 286 不允许 CPU 从保护模式进入实模式,除非 CPU 复位。这是一个问题,因为 BIOS 和操作系统服务只能由程序在实模式下调用。

这些行为已被大量预期这种行为的软件使用,因此键盘控制器继续控制 A20 线路并执行软件 CPU 重置,即使英特尔 80386 能够切换到实模式从保护模式,无需 CPU 复位。

  • 如果我们谈论的是“信号”级别的东西,即使我们忘记了枚举和 LED,USB 输入也是基于轮询的。除非主机要求,否则设备无法主动向主机发送数据。输入设备只是经常被轮询,询问它是否有任何新的报告。 (15认同)

Dmi*_*yev 56

任何 USB 设备,无论其类别如何,都需要双向通信才能运行。每个USB设备(或功能在USB规范的术语)被表示为一组的端点,其可以被认为是作为接受或接收数据缓冲区。然而,即使是只能发送数据的端点也需要等待一个称为令牌的特殊数据包才能回复: 在此处输入图片说明

(图片来自这里,灰色框代表USB主机,白色框代表USB功能)

甚至所谓的中断传输也是以这种方式完成的,USB 主机使用令牌数据包轮询连接的设备。常规(批量)传输和中断传输之间的区别在于轮询时间很短,并且在后一种情况下是有保证的。尽管如此,所有传输都是由主机发起的。


Ale*_*ski 18

这个问题反映了一个普遍的误解,即当按下一个键(或鼠标移动)时,USB 设备会自行“发送”一些东西给 PC,这就是为什么如此受到高度关注。事实上,USB 设备在收到来自主机的相应请求之前不会发送任何内容。一个例外是从挂起的设备唤醒过程。

USB虽然表面上看起来很简单,但实际上它的功能相当复杂。任何新的 USB 设备在开始运行之前都必须先“枚举”。顺序如下:

  1. 插入键盘后,主机端口接收“连接状态”信号(对于LS信号,D-被键盘拉高)。

  2. 然后主机将端口设置为“端口重置”模式,USB PHY(物理层驱动程序)沿 D+/D- 线发送“USB_RESET”(两条线在规定的时间内被驱动为低电平)。可以在此处找到有关 FS/HS 设备的“端口重置”的一些信息。

  3. 然后主机开始以 1ms 的间隔输出帧边界数据包。对于作为普通有线键盘的低速 (LS) 设备,这些只是“保持活动”脉冲,而对于 FS,会生成特殊的 SOF - 帧起始数据包。这些数据包使设备处于活动模式并防止其进入低功耗挂起状态。

  4. 然后“枚举”开始。主机发送请求以获取设备描述符。请求被发送到设备地址为“0”的“默认管道”。[此时只有一个这样的设备 - 键盘 - 因为总线上的所有其他设备都应该有单独分配的 USB 地址]

  5. 键盘返回请求的信息,因此主机将能够确定应该加载哪种驱动程序。

  6. 主机发送一个事务,要求设备将其默认地址更改为新分配的地址。

  7. 然后主机开始与设备的新一轮通信,现在在新分配的地址。所有其他设备忽略此通信,因为它不是针对它们的。

  8. 主机可能会从其他几个描述符中读取更多信息,并最终选择“设备配置”。枚举过程到此结束。

  9. 根据 USB 设备类别,主机开始与设备通信。在键盘情况下,主机本质上是周期性地发送“IN”请求,本质上是轮询设备(即使这个周期性管道被称为“中断”管道)。如果键盘有任何按键按下/按下,键盘将返回此信息。如果不是,则不会向设备驱动程序返回任何数据。

简而言之,每个 USB 设备都必须从 USB 主机接收唯一的地址,并且两个 USB 主机将难以与一个设备进行通信——总线冲突、地址不匹配、按键数据的随机拦截等。 USB 协议使得无法共享一个设备。两个 USB 主机之间的设备。

  • 幽灵键与物理键的接线方式有关。更便宜的键盘控制器没有用于每个键的单个引脚,而是它们有一个网格系统,例如具有行和列的寻址系统,其中控制器断言列线,并在行线上寻找信号。在这种情况下,除了计时之外,同时按下两个键(例如 E 和 S)可能与按下 W 和 D 没有区别。 (4认同)
  • @shadow ,不知道你在问什么。如果我记得的话,键盘的轮询速率是 8 毫秒。您正在异步按下按键,因此某些事件(接通或断开)可以进入不同的轮询帧,某些事件将在 IN 请求正在进行时发生。一个好的键盘控制器应该正确处理所有事件交叉,并且不应该丢失事件。我不知道为什么键盘会生成“鬼键”,但这与 USB 协议无关。 (2认同)