筆記本電腦的內(nèi)置鍵盤(pán)是不可缺少的輸入設(shè)備,它經(jīng)歷了二十幾年的迭代才形成如今的設(shè)計(jì)標(biāo)準(zhǔn)(Key Layout、Connector、Protocol、ScanCode...)。
在鍵盤(pán)的發(fā)展歷程中,出現(xiàn)了很多標(biāo)準(zhǔn),有一些標(biāo)準(zhǔn)至今仍被使用。有興趣可以查閱 鍵盤(pán)的發(fā)展。接下來(lái)就詳細(xì)了解下筆記本電腦的鍵盤(pán)。
01—Scan Code
電腦鍵盤(pán)一般有 80-120 個(gè)按鍵,因此采用矩陣設(shè)計(jì)可以減少GPIO 的使用。
如下示意圖,MCU 控制 “A/B/C/D” 都保持低電平,然后挨個(gè)輸出高電平,每次輸出高電平的同時(shí)采集“1/2/3/4” 電平。此過(guò)程稱(chēng)之為 “鍵盤(pán)掃描”。
如果 C-3 按鍵按下,當(dāng) MCU 在 “C” 列輸出高電平時(shí),在 “3” 行可檢測(cè)到高電平。如此 MCU 即可判斷出哪個(gè)按鍵被按下了。
MCU 判斷出哪個(gè)按鍵被按下,需要以數(shù)據(jù)的形式傳遞給 Host 使用。因此需要給每一個(gè)按鍵安排一個(gè)編碼,這個(gè)編碼就是 ScanCode,即 “掃描碼”。
這個(gè) MCU 負(fù)責(zé)掃描矩陣,稱(chēng)之為 KSC(Keyboard Scan Controller)。使用最為廣泛的型號(hào)是 Intel 8048。
鍵盤(pán)的發(fā)展歷程中,一共出現(xiàn)過(guò) 3 套 ScanCode。
Scan Code Set-1
1983年隨 IBM Personal Computer XT(XT:eXtended Technology,Type:5160) 一起發(fā)布的 XT Keyboard 就使用的是此套掃描碼。當(dāng)時(shí)配套的操作系統(tǒng)可以直接識(shí)別此套掃描碼。如今的 Windows、Linux 系統(tǒng)都在沿用。
ScanCode Set-2
1984年隨 IBM Personal Computer AT(AT:Advanced Technology,Type:5170)一起發(fā)布的 AT Keyboard 就是使用的是此套掃描碼。但是操作系統(tǒng)并沒(méi)有兼容識(shí)別此套掃描碼,而是在主板上增加了一個(gè) MCU 把 Set-2 翻譯成 Set-1,然后再發(fā)送給系統(tǒng)。當(dāng)然也有操作系統(tǒng)也可以識(shí)別 Set-2,但并不是主流。
新增的 MCU 稱(chēng)之為 KBC(Keyboard Controller),使用最為廣泛的型號(hào)是 Intel 8042,因此 i8042 也用來(lái)代指 Keyboard Controller。
ScanCode Set-3
1986年,IBM 重新設(shè)計(jì)了鍵盤(pán)布局,在美國(guó)市場(chǎng)上推出了 MF2 Keyboard,有 101個(gè)按鍵。
MF2 Keyboard 設(shè)計(jì)上增加了邏輯更為合理的 ScanCode Set-3,由 i8042 翻譯成 ScanCode Set-1 傳遞給 CPU。此套掃描碼并未流行。
最后流行的 PS/2 鍵盤(pán),采用的仍舊是 ScanCode Set-2。
02—Key Number
在 MF2 鍵盤(pán)出現(xiàn)后,鍵盤(pán) Layout 基本即保持一致了,但是按鍵的絲印卻是千變?nèi)f化,不同絲印的鍵盤(pán)是為了滿(mǎn)足不同語(yǔ)種的需求。
鍵盤(pán)設(shè)計(jì)中,一個(gè)按鍵會(huì)規(guī)定一個(gè) ScanCode。系統(tǒng)端根據(jù)接收的 ScanCode 就知道是哪個(gè)按鍵觸發(fā)了。同樣是按鍵 “Q” 觸發(fā),系統(tǒng)端最終識(shí)別的字符可不一定是字符 “Q”,這是要根據(jù)系統(tǒng)語(yǔ)言判斷的。
鍵盤(pán)語(yǔ)種不同,絲印就不同。因此每個(gè)按鍵還規(guī)定了一個(gè) Key Number,以便區(qū)分按鍵。
一般鍵盤(pán)制造商生產(chǎn)的矩陣鍵盤(pán),會(huì)配套一份設(shè)計(jì)圖紙,會(huì)指明按鍵在矩陣中的位置,此時(shí)使用的就是 KeyNumber。
KSC 掃描這個(gè)矩陣,根據(jù)掃描結(jié)果,識(shí)別出觸發(fā)按鍵在矩陣的位置,
先找到 KeyNumber,從而查找出 ScanCode。
03—Keyboard Protocol
XT Keyboard 和 AT Keyboard 的設(shè)計(jì)中,同 PCH 通訊的規(guī)范已經(jīng)不再使用,因此此處只針對(duì) PS/2 Keyboard 做描述。
PS/2 Keyboard 設(shè)計(jì)中,采用 KSC (Keyboard Scan Controller) 掃描鍵盤(pán)矩陣,按鍵觸發(fā)后會(huì)編碼出 ScanCode Set-2 發(fā)送。其中 KSC 是一個(gè)位于鍵盤(pán)內(nèi)部的 MCU,以 Intel 8048 最為典型。KSC 和 KBC 之間通過(guò) PS/2 協(xié)議通訊,完成KeyCode、Command 的傳遞。
PS/2 鍵盤(pán)結(jié)構(gòu)
在 x86 CPU 系統(tǒng)中,有一個(gè)獨(dú)立的 IO 尋址空間,大小 64K。隨著計(jì)算機(jī)的發(fā)展,默認(rèn) 60/64 兩個(gè) IO 地址被用作 PCH 和 KBC(i8042) 交換數(shù)據(jù)。
有以上兩個(gè)通訊的支持, PS/2 Keyboard 外接在電腦 PS/2 接口上后就可以工作了。
設(shè)計(jì)框圖如下
KBC 寄存器
i8042 作為一個(gè) KBC 使用 IO 60、64 和 PCH 傳遞數(shù)據(jù)。
IO 60/64 分別定義為數(shù)據(jù)寄存器和狀態(tài)寄存器。
針對(duì) Status Register,在 Intel 8042 DataSheet 中定義如下。
BIT0:指示 KBC 是否在 Output Data Register 寫(xiě)入了數(shù)據(jù)。
BIT1:指示 CPU 是否在 Input Data Register 寫(xiě)入了數(shù)據(jù)。
BIT2:指示 CPU 是否讀取了 Output Register。
BIT3:指示 CPU 寫(xiě)了 60H 還是 64H。
BIT4-7:用戶(hù)自定義。
不同廠(chǎng)家在后續(xù)的 KBC 設(shè)計(jì)中,增加了一些自定義狀態(tài)。
如下圖所示,KBC 中增加了針對(duì) PS/2 通訊狀態(tài)的一些定義。
如上圖,Host 端的 Keyboard Driver 利用 IO 60/64 和 KBC通訊。
KBC 內(nèi)部有兩個(gè)數(shù)據(jù)寄存器,Input and Output Data Register。
一個(gè)狀態(tài)寄存器,Status Register。
KB Driver 寫(xiě) 60H 或者 64H,都對(duì)應(yīng) KBC 內(nèi)部 Input Register,KBC 內(nèi)部的 Status Register BIT3 會(huì)做出區(qū)分。
KB Driver 寫(xiě) 60H,KBC 認(rèn)為是 Data。
KB Driver 寫(xiě) 64H,KBC 認(rèn)為是自己的 Command。
KB Driver 讀 60H,KBC 返回 Output Register 內(nèi)容,主要是 ScanCode。
KB Driver 讀 64H,KBC 返回 Status Register 內(nèi)容,指示 Keyboard 狀態(tài)。
04—Keyboard Command
KBC 和 KSC 作為 MCU,分別設(shè)計(jì)了一組命令。Keyboard Driver 可以發(fā)送這些命令,從而控制 KBC 和 KSC 的一些行為。
05—EC Keyboard
在上世紀(jì)的個(gè)人電腦設(shè)計(jì)中,PS/2 鍵盤(pán)屬于一個(gè)外接設(shè)備。PS/2 鍵盤(pán)通過(guò) PS/2 接口和主板上 KBC 通訊。KBC 在 PCH 和鍵盤(pán)中間作為一個(gè) SuperIO 設(shè)備,管理 PS/2 鍵盤(pán)。
隨著個(gè)人電腦的不斷發(fā)展,逐漸演變出便攜式電腦,即筆記本電腦。鍵盤(pán)作為筆記本電腦的標(biāo)配輸入設(shè)備,也遵守了 PS/2 鍵盤(pán)系統(tǒng)的大部分標(biāo)準(zhǔn),并且沿用至今。
在如今的筆記本電腦設(shè)計(jì)中,不再有獨(dú)立的 KSC(i8048,鍵盤(pán)掃描器)和 KBC(i8042,鍵盤(pán)控制器),因此也不再有 PS/2 接口和 PS/2 協(xié)議存在。
KSC 和 KBC 的功能全部集成在一個(gè)專(zhuān)用 MCU 中,即集成在 EC 中。
EC 作為一個(gè)專(zhuān)用 MCU,設(shè)計(jì)有 8*18 的鍵盤(pán)掃描模塊,實(shí)現(xiàn)矩陣鍵盤(pán)的掃描。EC 也設(shè)計(jì)有 LPC 總線(xiàn),和 PCH 實(shí)現(xiàn) IO 6064 通訊。因此在 EC 固件中即可實(shí)現(xiàn) KBC 功能。
EC 這顆專(zhuān)用 MCU 集成了原先 KBC 的功能,因此 EC 也會(huì)叫 KBC。
如今筆記本電腦中,EC 鍵盤(pán)系統(tǒng)設(shè)計(jì)框圖如下:
06—Keyboard Init
EC 鍵盤(pán)的實(shí)際工作原理和 PS/2 鍵盤(pán)基本一致,其中的 KBC 需要被 Host 端 Driver 初始化后,才能正常工作。
KBC 由 EC 固件實(shí)現(xiàn),因此上述 KBC、KSC 相關(guān)的指令必須由 EC 固件實(shí)現(xiàn),并且返回正確的值,否則 OS 端 KB Driver 初始化無(wú)法完成,會(huì)導(dǎo)致Windows 系統(tǒng)下設(shè)備管理器中 PS/2 設(shè)備出現(xiàn)黃色感嘆號(hào),鍵盤(pán)無(wú)法使用。
UEFI 環(huán)境下,KBC 初始化。
EC 固件實(shí)現(xiàn)了 KBC 邏輯后,添加必要的 log后,當(dāng) UEFI 環(huán)境啟動(dòng)后會(huì)對(duì) KBC 初始化。EC 端 log 如下圖:
上圖是在 EC 中記錄了進(jìn)入 UEFI Shell 環(huán)境時(shí)的鍵盤(pán)初始化序列。
通訊 | 釋義 | |
---|---|---|
1 | Host->EC, i8042 cmd[AD] | 8042 command Disable Keyboard |
2 | Host->EC, i8042 cmd[A7] | 8042 command Disable Mouse |
3 | Host->EC, i8042 cmd[AA] | 8042 command Self Test |
4 | EC->Host, data=[55] | EC Response test results |
5 | Host->EC, i8042 cmd[60] | 8042 command Write controller config byte |
6 | Host->EC, i8042 data[67] | controller config byte is 0x67 |
7 | Host->EC, i8042 data[F4] | Send to IO_60 without command |
8 | Host->EC, i8048 cmd[F4] | 8048 command Enable matrix scan |
9 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
10 | Host->EC, i8042 cmd[AB] | 8042 command Keyboard interface test |
11 | EC->Host, data=[00] | EC Response test results,must 00 |
12 | Host->EC, i8042 data[FF] | Send to IO_60 without command |
13 | Host->EC, i8048 cmd[FF] | 8048 command Reset and start self-test |
14 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
15 | EC->Host, data=[AA] | EC Response test results |
17 | Host->EC, i8042 data[F0] | Send to IO_60 without command |
18 | Host->EC, i8048 cmd[F0] | 8048 command Get/set current scan code set |
19 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
20 | Host->EC, i8042 data[02] | Send to IO_60 without command |
21 | Host->EC, i8048 cmd[02] | 8048 sub-command select scancode set-2 |
22 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
23 | Host->EC, i8042 data[F4] | Send to IO_60 without command |
24 | Host->EC, i8048 cmd[F4] | 8048 command Enable matrix scan |
25 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
26 | Host->EC, i8042 data[ED] | Send to IO_60 without command |
27 | Host->EC, i8048 cmd[ED] | 8048 command control LED status |
28 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
29 | Host->EC, i8042 data[00] | Send to IO_60 without command |
30 | Host->EC, i8048 cmd[00] | 8048 set LED off |
31 | EC->Host, data=[FA] | EC send “ACK”,must 0xFA |
上述初始化過(guò)程在如下文件中可以找到:
UDK2018/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c
OS 環(huán)境下,KBC 初始化。
Windows 或者 Linux 系統(tǒng)在加載過(guò)程中,BIOS 聲明了 PS/2 鍵盤(pán)設(shè)備后,OS 內(nèi)置的 PS/2 Keyboard Driver 就會(huì)加載,完成 EC 內(nèi) KBC 和 KSC 的初始化,以及配置。當(dāng)然 Windows Inbox PS/2 Driver 看不到源碼,感興趣的話(huà)可以看看 Linux PS/2 Driver 的源碼。
需要注意的是,UEFI 和 OS 下 KBC 初始化流程基本一致。
差異點(diǎn)是,UEFI 環(huán)境下 CPU 不響應(yīng) SERIRQ 中的 IRQ-1,靠輪詢(xún)的方式工作。OS下 CPU 需要響應(yīng) IRQ-1,當(dāng)有鍵盤(pán)中斷觸發(fā)后,Driver 才會(huì)被回調(diào),處理 IO 60/64 的數(shù)據(jù)。
-
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350982 -
筆記本電腦
+關(guān)注
關(guān)注
9文章
1406瀏覽量
48149 -
鍵盤(pán)
+關(guān)注
關(guān)注
4文章
859瀏覽量
39647 -
電腦鍵盤(pán)
+關(guān)注
關(guān)注
0文章
14瀏覽量
12277 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52051
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論