EC 所需知識 - KBC
EC 所需知識
軟體工程師的第一步,先把相關的規範(Specification)了解清楚,就像開發一套軟體之前要先了解需求,才能做出一套符合需求的體。相同的EC工程師就是需要把 LPC / SMBUS / PS2 / KBC 等相關知識,清楚明瞭再進下一步。
- Keyboard Controller
最早的鍵盤控制器是Intel 8042,主要包含四個暫存器和三個I/O控制埠,四個暫存器分別為一個BYTE的輸入緩衝暫存器、一個BYTE的輸出緩衝器、一個狀態暫存器及一個控制暫存器。
三個I/O控制埠的定義如下表:
- PORT #1
- PORT #2
- PORT #3
- Status Register
- OBF (Output Buffer Full) – 表示有資料寫入8042的輸出緩衝區.
- IBF (Input Buffer Full) – 系統把資料寫入8042的輸入緩衝區.
- SYS (System Flag) – 指示系統是Warning Boot 寫是Cold Boot. 「1」表示為Warning Boot。
- A2 (Address line 2) – 指示系統資料是寫入I/O PORT 0x64還是0x60,「1」是表示PORT0x64。
- INH (Inhibit flag) – 指示系統和PS/2 KEYBOARD介面是否正常,LOW表示Clock被拉到LOW,也就是系統和PS/2 KEYBOARD溝通介面被禁止。
- TxTO (Transmit Timeout) – 系統傳送指令給鍵盤在限制的時間內並沒有被接收,也就是說系統上可能沒有鍵盤存在。「0」表示沒有超時現象發生。
- RxTO (Receive Timeout) – 表示鍵盤沒在限制時間內對系統指令做回應。「0」表示沒有超時現象發生。
- PERR (Parity Error) – 表示在系統和鍵盤傳送之間的資料不正確。「0」表示沒有資料不正確的情形。
- MOBF (Mouse Output Buffer Full) – 表示有資料傳送到PS/2 mouse的輸出緩衝區。
- TO (General Timeout) – 表示指令傳送沒有限制時間內被接收或者KEYBOARD沒在限制時間內反應系統指令。
- Control Register
- INT (Output Buffer Full Interrupt) – 控制在鍵盤輸出緩衝區有資料時,是否要傳送IRQ 1告知系統。
- SYS (System Flag) – 表示系統開機事件。「1」表示為Warning Boot
- OVR (Inhibit Override) – 由I/O PIN來控制KBC和系統的介面是否被禁止。
- _EN (Disable Keyboard) – 此位元設定的話,鍵盤停止傳送資料給系統
- PC (PC Mode) –
- XLAT (Translate Scan Code) – 設定鍵盤的Scan Code Set,「1」表示為Code Set 1
- _INT2 (Mouse Output Buffer Full Interrupt) – 控制Mouse輸出緩衝區有資料時,是否要傳送IRQ 12告知系統.
- _EN2 (Disable Mouse) -此位元設定的話,Mouse停止傳送資料給系統
- 系統如何讀寫KBC
- 系統在寫入指令到KBC之前,要先檢測KBC的輸入緩衝區內還有沒有指令或資料還沒有取出。再傳送指令或資料給KBC。
- 系統在讀取KBC的資料之前,要先檢測KBC的輸出緩衝區內有沒有KBC寫入的資料,再讀取資料。
- Keyboard Controller Command
系統指令是由PORT 0x64傳給KBC,系統的資料是由PORT 0x60傳送給KBC,再由KBC對指令及資料做相關的動作,KBC的指令如下:
- 0x20 (Read Command Byte) –讀取KBC的控制位元
- 0x60 (Write Command Byte) – 寫入KBC的控制位元
- 0x90-0x9F (Write to output buffer) –
- 0xA1 (Get firmware version) – 取得KBC靭體的版本
- 0xA4 (Get password) – 確認有無設定密碼,如果有設定密碼,KBC會回應0xFA;如果沒有設定密碼,KBC會回應0xF1。
- 0xA5 (Set password) – 設定使用者密碼。
- 0xA6 (Check password) – 比較輸入的密碼是否正確。
- 0xA7 (Disable mouse interface)
- 0xA8 (Enable mouse interface)
- 0xA9 (Mouse interface test) – 測試Mouse interface的情形
- 0xAA (Controller self test) – KBC自我測試,自我測試成功會回應系統0x55
- 0xAB (Keyboard interface test) – 測試keyboard interface的情形
- 0xAD (Disable Keyboard interface)
- 0xAE (Enable Keyboard interface)
- 0xAF (Get version)
- 0xC0 (Read Input port) – 讀取輸入埠[PORT 1]
- 0xC1 (Copy input port low nibble) - 讀取輸入埠[PORT 1]的BIT[0:3],拷貝到狀態暫存器
- 0xC2 (Copy input port high nibble) – 讀取輸入埠[PORT 1]的BIT[4:7],拷貝到狀態暫存器
- 0xD0 (Read output port) – 讀取輸出埠[PORT 2]
- 0xD1 (Write output port) – 把資料寫入輸出埠[PORT 2]
- 0xD2 (Write Keyboard buffer) – 把資料寫到鍵盤的輸出緩衝區
- 0xD3 (Write Mouse buffer) – 把資料寫到Mouse的輸出緩衝區
- 0xD4 (Write Mouse Device) – 把資料或指令寫到Mouse
- 0xE0 (Read Test Port) – 讀取測試埠[PORT 3]
- 0xFE (Warning Start) – 啟動CPU Reset
留言
張貼留言