EC 所需知識 - KBC

EC 所需知識
軟體工程師的第一步,先把相關的規範(Specification)了解清楚,就像開發一套軟體之前要先了解需求,才能做出一套符合需求的體。相同的EC工程師就是需要把 LPC / SMBUS / PS2 / KBC 等相關知識,清楚明瞭再進下一步。


  • Keyboard Controller

最早的鍵盤控制器是Intel 8042,主要包含四個暫存器和三個I/O控制埠,四個暫存器分別為一個BYTE的輸入緩衝暫存器、一個BYTE的輸出緩衝器、一個狀態暫存器及一個控制暫存器。

三個I/O控制埠的定義如下表:

  • PORT #1

Port 1 [ Input Port ]

Pin

Name

Function

0

P10

Keyboard Data [PS/2]

1

P11

Mouse Data [PS/2]

2

P12


3

P13


4

P14

External ROM

1:Enable 

0:Disable

5

P15

Manufacturing Setting

1:Enable

0:Disable

6

P16

Display Type Switch

1:Color

0:Monochrome

7

P17

Keyboard Inhibit Switch

1:Enable

0:Disable

  • PORT #2

Port 2 [ Output Port ]

Pin

Name

Function

0

P20

System Reset

1:Nornal

0:Reset 

1

P21

Gate A20

2

P22

Mouse Data [PS/2]

1:Pull Data low

0:High –Z

3

P23

Mouse Clock [PS/2]

1:Pull Data low

0:High –Z

4

P24

Input Buffer Full / Keyboard IBF interrupt [PS/2]

1:Assert IRQ 1

0:De-assert IRQ1

5

P25

Output Buffer Empty / Mouse IBF interrupt [PS/2]

1:Assert IRQ 12

0:De-assert IRQ12

6

P26

Keyboard Clock

1:Pull Clock low

0:High Z

7

P27

Keyboard Data

1:Pull Data low

0:High Z

  • PORT #3

Port 3 [ Test Port ]

Pin

Name

Function

0

T0

Keyboard Clock

1

T1

Keyboard Data

2



3



4



5



6



7



  • Status Register


7

6

5

4

3

2

1

0

AT – Compatible Mode

PERR

RxTO

TxTO

INH

A2

SYS

IBF

OBF

PS/2 – Compatible Mode

PERR

TO

MOBF

INH

A2

SYS

IBF

OBF


    • 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


7

6

5

4

3

2

1

0

AT – Compatible Mode


XLAT

PC

_EN

OVR

SYS


INT

PS/2 – Compatible Mode


XLAT

_EN2

_EN


SYS

INT2

INT

    • 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。


WaitIBE:

          in      al,64h

          and     al,10b

          jnz     WaitIBE

          out     60h,cl



    • 系統在讀取KBC的資料之前,要先檢測KBC的輸出緩衝區內有沒有KBC寫入的資料,再讀取資料。


WaitOBF:

          in      al,64h

          and     al,01b

          jz      WaitOBF

          in      al,60h



  • 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的情形

Value

Description

Value

Description

0x0

OK

0x3

Data Line 為 LOW

0x1

Clock line 為LOW

0x4

Data Line 為 HIGH

0x2

Clock line 為HIGH



    • 0xAA (Controller self test) – KBC自我測試,自我測試成功會回應系統0x55
    • 0xAB (Keyboard interface test) – 測試keyboard interface的情形

Value

Description

Value

Description

0x0

OK

0x3

Data Line 為 LOW

0x1

Clock line 為LOW

0x4

Data Line 為 HIGH

0x2

Clock line 為HIGH



    • 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

留言

這個網誌中的熱門文章

EC 所需知識 - SMBUS

EC 所需知識 - LPC