You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OS键盘驱动开发:不同接口键盘是否仅存在扫描码差异?

结论

你提出的「USB等其他类型键盘与PS/2键盘的差异仅体现在扫描码上」的假设完全不成立,二者从底层通信逻辑到上层数据格式都有本质区别,扫描码差异只是最表层的不同。

具体核心差异

  • 底层通信链路和访问方式完全不同
    PS/2键盘对接主板上的8042 PS/2控制器,通过固定的IO端口通信:数据端口是0x60,命令/状态端口是0x64。你当前不使用硬件中断的情况下,只要轮询0x64端口状态寄存器的第0位(输入缓冲区满标志),置1时读0x60端口就能拿到键盘发送的字节,逻辑非常简单直接。
    USB键盘走USB总线,必须先对接对应的USB主机控制器(常见的有UHCI、OHCI、EHCI、xHCI几类),你需要先完成主机控制器驱动、USB总线枚举逻辑,再按照USB HID设备协议和键盘端点通信才能拿到输入数据,根本不存在固定IO端口直接读数据的可能。哪怕你同样用轮询方式不开启中断,轮询USB主机控制器的逻辑和轮询PS/2控制器的逻辑也完全是两套,没有复用性。
  • 数据上报格式和逻辑完全不同
    原生PS/2键盘上报的是对应扫描码集(Set1/Set2/Set3)的字节流,遵循通码(按键按下)、断码(按键松开)规则,比如Set1下普通键断码是通码值加0x80,扩展按键会带0xE0前缀,每次上报对应单个按键的状态变化。
    原生USB HID键盘上报的是固定长度的HID输入报告,最常见的是8字节格式:第1字节存修饰键(Ctrl、Shift、Alt等)的按下状态,第2字节为保留位,后续6字节存当前同时按下的所有按键的HID用法码。它不会单独上报单个按键的松开事件,每次上报的是当前所有按下按键的全量状态,你需要自己维护前后状态对比,才能识别出按键按下、松开的事件,和PS/2的事件上报逻辑完全不一样。

注意:部分主板开启USB Legacy Support时,固件会把USB键盘模拟成PS/2设备,自动把USB数据转成PS/2扫描码送到0x60端口,这种场景下你可以像读PS/2键盘一样读USB键盘输入,但这是主板固件做的兼容层,不是USB键盘本身的特性,不能作为原生驱动的设计依据。

  • 初始化流程完全不同
    PS/2键盘初始化只需要通过8042控制器发送简单的命令:比如复位设备、开启键盘、设置扫描码集、控制LED状态,整个流程只需要几次端口读写就能完成。
    USB键盘初始化需要走完整的USB设备枚举流程:复位USB端口、读取设备描述符、给设备分配唯一地址、读取配置描述符、匹配HID类驱动、配置设备端点、设置报告采样率,整个流程涉及几十次USB传输交互,和PS/2的初始化逻辑没有重叠。

针对你当前开发阶段的参考

你现在开发32位系统、暂未启用硬件中断的阶段,优先实现PS/2键盘驱动是很合理的选择:轮询0x64端口状态位读扫描码的逻辑不依赖IDT和中断处理,能快速拿到键盘输入验证系统功能。后续如果要支持原生USB键盘,必须先搭建完整的USB主机驱动栈和HID类驱动框架,不可能只替换扫描码表就复用现有PS/2驱动逻辑。

内容的提问来源于stack exchange,提问作者ArijitKD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:09:11