ExpOS 鍵盤掃瞄碼 鍵盤控制器

2021-09-05 13:45:27 字數 4531 閱讀 1362

thanks adam chapweske

訊號和協議, 掃瞄碼, 命令集, 初始化,相容性問題, pc的鍵盤控制器.

參考

歷史 常用鍵盤包括:

usb 鍵盤 - 最近為所有的新機器所支援(macintosh and ibm/compatible).

ibm/相容 鍵盤 - 也稱 "at keyboards" 或者 "ps/2 keyboards", 現代pc都支援. 本文的主題.

原來的ibm 以及相容機使用一種稱作 "xt "的鍵盤. 現在不多見了,我們不介紹.後來ibm引入 at 系統, at之後是ibm ps/2. at 鍵盤和 ps/2

鍵盤類似,是我們常用的鍵盤. ps/2 裝置使用更小的聯結器,支援更多一點的特性. 同時相容at, 新的特性幾乎不使用.

ibm 的幾種鍵盤:

ibm pc/xt 鍵盤 (1981):

83 個鍵

5-pin din 聯結器

簡單單向串列埠協議

使用掃瞄碼 set 1

沒有 host-to-keyboard 的命令

ibm at 鍵盤 (1984) - 不相容xt

84 到 101鍵

5-pin din 聯結器

雙向串列埠協議

使用掃瞄碼 set 2

8個 host-to-keyboard 命令

ibm ps/2 鍵盤(1987) - 相容at

84 到 101 鍵

6-pin mini-din 聯結器

雙向串列埠協議

可選掃瞄碼 set 3

17 個 host-to-keyboard 命令

今天買的鍵盤都相容 ps/2 和 at .所以今天的 "at" 和 "ps/2" 有意義的只有他們的介面大小. 盡量不使用擴充套件特性.

現代相容 at-ps/2 鍵盤

任意鍵數目 (通常是101 或 104)

5-pin or 6-pin 聯結器

雙向串列埠協議

掃瞄碼 set 2 肯定支援

應答所有的命令,但是可能並無此功能.

簡單描述:

鍵盤包含乙個由 keys組成的矩陣. 所有的鍵都為乙個板上處理器監控,稱作鍵盤編碼器, (一般是i8048? 見下表).雖然這種晶元挺多,但是其職

能基本如下:

監控是哪個或那幾個鍵被按下/釋放,把相應的資料送到主機板. 這個處理器處理所有的 debouncing(?what!) ,把資料快取到他的16-byte 的緩衝區中. 在ibm相容機上,主機板也有乙個板上晶元,稱作鍵盤控制器.一般是8042. 他負責解碼從鍵盤來的資訊,通知系統軟體各種事件.在host 和主機板的通訊中 都使用ibm 協議.

現代鍵盤的encoders:

holtek: ht82k28a, ht82k628a, ht82k68a, ht82k68e?emc: em83050, em83050h, em83052h, em83053h,?intel: 8048, 8049

motorola: 6868, 68hc11, 6805

zilog: z8602, z8614, z8615, z86c15, z86e23

電器介面和協議:

at 和 ps/2 鍵盤使用和 ps/2 滑鼠一樣的協議. 這裡是協議的細節.

掃瞄碼:

鍵盤處理器(encoder)大部分時間在"掃瞄", 監視著鍵矩陣. 一旦發現有鍵被按下,釋放,或被按住不放,encoder就會向計算機傳送乙個資料報,稱為掃瞄碼. 有兩種不同的掃瞄碼, "make codes" 和 "break codes". make code 是鍵被按下,按住不放是產生的. break code 是鍵被釋放時產生的. 每個鍵都有自己唯一的make code 和 break code. make code 和 break codes 的集合稱為掃瞄碼集. 共有三種標準的掃瞄碼集.所有現代的鍵盤預設使用掃瞄碼集 set 2.

詳細情況見:

scan code set 1

- 原來的 xt 掃瞄碼集, 也有現代鍵盤支援此種東東.

scan code set 2

- 現代鍵盤的預設掃瞄碼集.

scan code set 3

- 可選的 ps/2 掃瞄碼集,很少使用.

make codes, break codes, and typematic repeat:

a make code 和乙個 ascii 碼之間並無固定的轉換關係.儘管set 2的 make codes 大部分只有1個位元組寬度, 但是有"extended keys" 的make codes 是2或4個位元組寬,這些擴充套件鍵的make codes 的第乙個位元組總是 e0h.?每個鍵也有自己的唯一 break code(1). 但總是和make code有聯絡, 給程式設計帶來不少方便. set 2 的大部分break codes 有2個位元組寬,第乙個位元組是 f0h 第二個是那個鍵的make code. 擴充套件鍵的 break codes 通常3個位元組,前兩個位元組是e0h, f0h, 最後乙個位元組是那個鍵的 make code的最後乙個位元組.

按住乙個鍵不放時,那個key 變成 typematic, 意味著鍵盤會不斷的向主機板傳送那個鍵,直到釋放他,或者另外乙個鍵按下.這個過程有兩個引數: typematic 延遲, typematic 速率. typematic 延遲從 0.25 秒到 1.00 秒, typematic 速率從 2.0 cps (characters per second) 到 30.0 cps. 可以使用"set typematic rate/delay" (0xf3) 命令改變這個值.如果多個鍵被按住不放,只有最後乙個鍵成為typematic.

實際上,"pause/break" 鍵沒有 break code(set 1,2).

i8042 :鍵盤控制器

以上的討論都是針對硬體,其實,如果寫乙個底層的鍵盤相關的軟體for pc,是不該直接和鍵盤通訊的. 主機板上一般都有鍵盤控制器,它在鍵盤和外設匯流排間是乙個介面. 這個控制器處理 signal-level的東東和協議的細節 ,同時提供轉換,解釋,處理掃瞄碼,執行命令的功能.

pc 的鍵盤一般使用intel 8042/相容 的微控制器.現代計算機上,這個功能一般整合到南橋 . 然而,這個裝置邏輯上仍然叫做 "the 8042".基於主機板的不同,鍵盤控制器可以工作於:"at-相容" 模式, 或者 "ps/2-相容" 模式. 如果主機板支援 ps/2 滑鼠就會使用後者. 這時, 8042 既是鍵盤控制器又是滑鼠控制器. 鍵盤控制器根據硬連線的方式自動決定工作於哪種模式.

8042 包含如下暫存器:

1位元組的輸入快取 - 包含從鍵盤來的資料,唯讀

1位元組的輸出快取 - 包含,要被寫到鍵盤的資料;只寫

1位元組的狀態暫存器 - 8 個狀態位; 唯讀

1位元組控制暫存器 - 7 個控制位; 讀寫?

前三個暫存器可以被cpu通過io埠0x60 and 0x64直接訪問.最後乙個必須使用"read command byte" 命令讀, 使用"write command byte" 命令寫.(見關於鍵盤的其他帖)

8042的埠在cpu的io空間位址如下:

port----read/write-----function

0x60----read----------read input buffer

0x60----write---------write output buffer

0x64----read----------read status register

0x64----write---------send command

寫埠 0x64 不會寫任何指定的暫存器, 只是給8042乙個命令. 如果命令有引數,引數就送到埠0x60. 命令的返回值也從埠 0x60去讀.

("input buffer" : input from the keyboard, "output buffer": output to be sent to the keyboard.)

鍵盤復位

加電時,(或者"reset" 命令) , 鍵盤進行 bat (basic assurance test)並裝載下面的預設值:

typematic delay 500 ms.

typematic rate 10.9 cps.

*選擇掃瞄碼集 set 2.

*把所有鍵設定為 typematic/make/break 統統使能.

* 一些鍵盤可以改變,一些不能.

進入 bat後, 三個 led 點亮,bat 完成之後熄滅.同時,bat **返回給host: 0xaa (bat successful) , 0xfc (error). 許多鍵盤在bat時忽略clock 和 data 線, 直到bat完成.因此, "禁止條件" (clock line low) 不能鍵盤阻止向host傳送bat code.

參考資料

adam's micro-resources home

keyboard scan codes

ps/2 mouse/keyboard protocol - protocol used by at and ps/2 keyboards.

keyboard code/projects

鍵盤掃瞄碼

當按下一鍵時,產生 mark 碼,產生一次 irq1 中斷。放開鍵時,產生 break 碼,產生一次 irq1 中斷。因此 當按下 a 鍵放開,實際上產生了兩次 irq1 中斷 break 是 mark 碼的 bit7 置 1 得來,也就是 break mark 0x80 這裡只說一般日常應用中的鍵...

彙編顯示鍵盤掃瞄碼和ASCII碼

題目及要求如下 利用中斷型別16h呼叫鍵盤i o介面程式,並顯示由鍵盤中斷程式送回的掃瞄碼和ascii碼。顯示的格式如下 scan ascii char 1e 61 a 30 62 b 2e 63 c 按ctrl c可以中止程式。ctrl c對應的ascii碼為03h。練習將二進位制數轉換為16進製...

PS2鍵盤第二套鍵盤掃瞄碼學習發現

ps2鍵盤中第二套鍵盤掃瞄碼使用最廣泛。但是每個按鍵的鍵值,大多數是乙個位元組。有少量的兩個位元組 小鍵盤enter 鍵 e0 5a 右ctrl e0 14 右gui e0 27 左gui e0 1f 右alt e0 11 fn e0 2f 小鍵盤 e0 4a 這些按鍵一般在鍵盤上能找到另乙個相同功...