发帖
客户端
扫码下载

[电脑] 笔电键盘技术解析:从矩阵扫描到EC管理的二十年演进

[复制链接]
4 |0
数字前沿 发表于 昨天 13:47 | 显示全部楼层 |阅读模式
现代笔记本电脑的键盘区域设计精致,有的还配备了炫酷的背光和跑马灯效果,加上各种独特的功能键,充满了高科技感。然而,其背后的工作原理和运作逻辑,在过去二三十年间几乎未发生显著变化。与普通桌面键盘从PS/2接口逐渐转变为USB接口不同,现代笔记本电脑的键盘在很大程度上仍保留着二十年前的设计,这主要归功于键盘系统控制器(KSC)的嵌入式控制器(EC)在这方面表现得“太过稳定”。

追溯键盘的发展历史,最早的键盘可追溯到IBM PC及其后续的IBM XT系统上的“XT键盘”,这些键盘如今已显过时,与现代键盘存在显著差异。随后,IBM AT系统及其后续的IBM PS/2系统引入了AT键盘和PS/2键盘,它们与现代键盘的外观已十分相似。PS/2键盘采用了更小的接口,并支持额外功能,同时保持了对AT键盘的向后兼容性,强调兼容性而非额外功能。最终,USB接口取代了PS/2,成为当今键盘的主要连接方式。

尽管键盘技术经历了数十年的演进,但其底层技术原理几乎未变,主要包含两部分:如何获取按键信息以及如何将这些信息汇报给CPU。键盘消息的汇总由键盘本身完成,主要是通过监控按键矩阵来得到扫描码(Scan Code);而将这些信息报告给CPU的工作,最初由南桥中的键盘控制器(KCS,即8042键盘控制器)完成,后来则由USB HID主机设备来承担。

那么,什么是扫描码呢?可以将键盘视为一个由众多小开关组成的矩阵,每个小开关都可以通过列(column)和行(row)来唯一定位。通过监控行和列电路上的电流变化,可以确定各个开关的状态。桌面电脑键盘中通常带有一个小处理器MCU,它大部分时间都在“扫描”或监控按键矩阵。当发现任何按键被按下、松开或按住时,MCU就会记录下一个称为“扫描码”的信息。扫描码分为通码(make code)和断码(break code)两种,按下或按住按键时产生通码,释放按键时则生成断码。每个按键都有自己独一无二的通码和断码,因此主机只需查看一个扫描码,就能准确确定哪个按键发生了什么。

在最初和之后的很长一段时间里,收集并汇报这些扫描码信息给CPU的工作由8042键盘控制器或其仿真品来完成。然而,随着PS/2接口的淘汰,市面上几乎看不到PS/2接口的键盘了,取而代之的是USB键盘。在PCH南桥中,8042这个IP被移除,取而代之的是由USB协议栈来汇报扫描码。但在笔记本电脑中,8042这个“上古恐龙”仍以某种形式存在着。

笔记本电脑的“管家”——EC,最初就是为了模仿8042而设计的。尽管现在这个功能只是其功能集合中的一小部分,但仿真8042、扫描键盘矩阵、产生扫描码,并处理8042的编程接口(端口0x60和0x64)的功能,仍然顽固地存在于EC的代码中,且几乎未发生改变。

以ChromeBook的EC代码仓库为例,其键盘处理代码相对简单,主要集中在common目录下。其中,keyboard_scan.c文件实现了EC中的键盘扫描模块,负责检测和处理键盘矩阵中的按键事件,这是键盘输入处理的底层实现,为上层键盘协议(如8042或MKBP)提供基础支持。该文件中的keyboard_scan_task()函数被注册在系统任务中,单独开一个线程运行,不断扫描键盘矩阵以查看是否发生了变化。它通过读取行和列的信息来检测按键状态,并通过keyboard_state_changed()函数通知8042仿真模块。

除了通过行列扫描方式读取键盘矩阵状态和检测按键按下、释放事件外,该模块还支持处理按键去抖动、检测并处理键盘幽灵键问题、支持按键模拟功能以及特殊按键组合和特殊功能键。

而keyboard_8042.c文件则实现了8042键盘控制器协议,其辅助函数库为keyboard_8042_sharedlib1.c。在sharedlib中,可以看到行和列对应的扫描码集合。该文件的功能主要分为三部分:处理矩阵扫描的结果、命令端口(0x64)处理以及数据端口(0x60)处理。通过端口0x60和0x64的组合,可以完成键盘和PS/2鼠标(已淘汰)的初始化等复杂操作。

虽然键盘实现原理看似简单,但背后涉及的技术细节却不容忽视。例如,当几个按键同时按下时,程序能否正确处理?这背后涉及到按键冲突检测和防鬼键技术等复杂问题,值得深入探讨。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门版块
数码讨论
畅谈数码,分享心得。
快速回复 返回顶部 返回列表