EC 所需知識 - PS2
EC 所需知識
軟體工程師的第一步,先把相關的規範(Specification)了解清楚,就像開發一套軟體之前要先了解需求,才能做出一套符合需求的體。相同的EC工程師就是需要把 LPC / SMBUS / PS2 / Smart Battery 的相關知識,清楚明瞭再進下一步。
早期的PC和鍵盤/滑鼠是透過PS2來傳送使用者按下鍵盤或移動滑鼠給鍵盤管理者[Keyboard Controller „KBC“]。KBC工程師需對PS2介面知識相當的瞭解,才能順利的和PS2的裝置溝通。因此,本篇文章將詳盡的介紹PS2相關所需要的知識。
PS2 INTERFACE
PS/2 Interface最早是由IBM製訂的標準。提供Keyboard、Mouse和系統連接溝通的介面。本篇文章將會由外觀、傳輸的訊號、Keyboard、Mouse及Keyboard Controller的動作指令詳細介紹。
- PS2 SOCKET
在PS/2 Device和PS/2 Socket連接時,可能的話,先地線連接再連接電源,若先連接電源的話,有些PS/2 Device會電源初始化失敗,無法和系統連接成功,系統會誤認PS/2 Device沒有和系統連接。
- PS2 HARDWARE
Clock
|
Data
|
Bus Status
|
High
|
High
|
閒置狀態
|
High
|
Low
|
禁止傳輸資料
|
Low
|
High
|
Host要求傳輸資料給裝置
|
最高的工作頻率為 33KHz,一般工作頻率在10-20KHz
Pin
|
Direct
|
Description
|
Clock
|
由PS/2 Device 產生
| |
Data
|
Host->Device
|
由Falling Edge讀取資料
|
Data
|
Device->Host
|
由Rising Edge讀取資料
|
PS/2 Data Format
- 1 start bit - always logical low
- 8 data bits - D0 to D7
- 1 parity bit - Odd parity
- 1 stop bit - always logical high
Device to Host Communication
Host to Device Communication
PS2 MOUSE
由PS/2 Mouse的工作模式、Mouse的控制指令及Window如何設定及起動Mouse的程序來做說明。
- 工作模式
- Reset Mode – 當系統傳送指令0xFF給Mouse,Mouse即刻進入初始化工作模式, Mouse開始自我測試 ( Basic Assurance Test “BAT” )及預設值的設定。Mouse的預設值為
- Sample Rate - 100 samples / sec
- Resolution - 4 counts / mm
- Scaling - 1:1
在自我測試及設定完預計值之後,Mouse會回傳0xAA及0x00給系統;反之在過程中有任何錯誤的話,Mouse會回傳0xFC讓系統知道Mouse初始化失敗。
- Stream Mode –當Mouse移動或者左右按鍵被按下時,Mouse就會依照Sample Rate的時間,把移動或按鍵的資料傳送給系統。
- Remote Mode –系統定時的下指令[0xEB]詢問Mouse的相對位移及按鍵狀態,每次指令後,Mouse會重新計算相對的偏移值。
- Wrap Mode – 系統傳送無效的指令給Mouse時,Mouse就會回傳給系統告知此指令是無效的。
- Mouse的資料封包
- Microsoft Intelimouse
- << Configuration setting >>
- Set sample rate 200 0xF3 0xC8
- Set sample rate 100 0xF3 0x64
- Set sample rate 80 0xF3 0x50
- Get Device ID [0xF2] wait for respond ID=03
- Scrolling Wheel + 5 Button Mouse
- << Configuration setting >>
- Set sample rate 200 0xF3 0xC8
- Set sample rate 200 0xF3 0xC8
- Set sample rate 80 0xF3 0x50
- Get Device ID [0xF2] wait for respond ID=04
- Mouse的系統指令
Mouse在收到每一筆系統的指令或資料都會回傳0xFA給系統,告知系統,讓系統傳送下一筆指令或資料。系統傳給Mouse的指令如下:
- 0xE6 [ Set Scaling ] – 設定比率為1:1
- 0xE7 [ Set Scaling ] - 設定比率為2:1
- 0xE8 [ Set Resolution ] – 設定位移解析度,Mouse收到指令後,再取得設定值。
- 0xE9 [ Status Request ] – 回傳Mouse的設定狀態給系統,Mouse收到指令後,再把3Bytes的狀態值傳給系統。
Scaling = 1為2:1 ; Scaling = 0為1:1
Mode = 1為Remote Mode ; Mode = 0為Stream Mode
- 0xEA [ Set Stream Mode ] – 設定為Stream Mode。
- 0xEB [ Data Request ] – 在Remote Mode時,系統用來詢問資料的指令,Mouse收到指令後,再把相對位址的值傳給系統。
- 0xEC [ Reset Wrap Mode ] – 把位址計數值歸零。
- 0xEE [ Set Wrap Mode ] -把位址計數值歸零並且進入Wrap Mode。
- 0xF0 [ Set Remote Mode ] -把位址計數值歸零並且進入Remote Mode。
- 0xF2 [ Get Device ID ] – 回傳Mouse的ID,Mouse收到指令後再回傳Mouse ID給系統。
- 0xF3 [ Set Sample Rate ] – 設定取樣頻率。Mouse收到指令後,再取得取樣頻率值。取樣頻率值為10 ,20 ,40 ,60 ,80 ,100 and200 samples/sec
- 0xF4 [ Enable Data Reporting ] – Mouse支援位移及按鍵狀態的傳遞。
- 0xF5 [ Disable Data Reporting ] – Mouse停止位移及按鍵狀態的傳遞。
- 0xF6 [ Set Default Value ] – 將Mouse的相關值設為預設值。Sampling Rate = 100、Resolution = 4 counts/mm、Scaling = 1:1及Disable Data Reporting。
- 0xFE [ Resend ] – 要求系統重新傳送上一個指令
- 0xFF [ Reset ] – Mouse初始化的指令
由Mouse插入系統後,得到系統電源,Mouse先完成自我測試傳出0xAA 0x00告知系統,Mouse已經加入系統,系統會要求Mouse做自我測試後,偵測Mouse的ID後,才開始初始化設定Mouse,讓Mouse開始傳送資料給系統。
Host
|
Mouse
|
說明
|
Mouse Plug-In System
| ||
0xAA 0x00
|
Mouse電源的初始化完成
| |
0xFF
|
0xFA 0xAA 0x00
|
Mouse自我測試完成
|
0xFF
|
0xFA 0xAA 0x00
|
Mouse自我測試完成
|
0xFF
|
0xFA 0xAA 0x00
|
Mouse自我測試完成
|
Check Mouse ID
| ||
0xF3
|
0xFA
|
設定Sample Rate
|
0xC8
|
0xFA
|
200 samples/sec
|
0xF3
|
0xFA
|
設定Sample Rate
|
0x64
|
0xFA
|
100 samples/sec
|
0xF3
|
0xFA
|
設定Sample Rate
|
0x50
|
0xFA
|
50 samples/sec
|
0xF2
|
0xFA 0x03
|
Scrolling mouse
|
Check Mouse ID
| ||
0xF3
|
0xFA
|
設定Sample Rate
|
0xC8
|
0xFA
|
200 samples/sec
|
0xF3
|
0xFA
|
設定Sample Rate
|
0xC8
|
0xFA
|
200 samples/sec
|
0xF3
|
0xFA
|
設定Sample Rate
|
0x50
|
0xFA
|
50 samples/sec
|
0xF2
|
0xFA 0x04
|
Scrolling Wheel + 5 Button Mouse
|
Check Mouse ID
| ||
0xF3
|
0xFA
|
設定Sample Rate
|
0x0A
|
0xFA
|
10 samples/sec
|
0xF2
|
0xFA 0x00
|
3 Button Mouse
|
初始化設定
| ||
0xE8
|
0xFA
|
設定Resolution
|
0x03
|
0xFA
|
8 counts/mm
|
0xE6
|
0xFA
|
設定Scaling 1:1
|
0xF3
|
0xFA
|
設定Sample Rate
|
0x28
|
0xFA
|
40 samples/sec
|
0xF4
|
0xFA
|
可以Data Reporting
|
如何模擬Mouse移動及按鍵被按下的動作,首先,在Clock被拉Low的時侯表示Host傳送Data給Mouse,轉為接收資料,在系統傳送0xF4指令告知Mouse可以開始傳送Mouse移動及按鍵變化才能傳送資料給系統。Mouse的各種動作如下:
Emulated Action
|
Data send to host
|
Move up one
|
0x08 0x00 0x01
|
Move down one
|
0x28 0x00 0xFF
|
Move right one
|
0x08 0x01 0x00
|
Move left one
|
0x18 0xFF 0x00
|
Press left button
|
0x09 0x00 0x00
|
Release left button
|
0x08 0x00 0x00
|
Press middle button
|
0x0C 0x00 0x00
|
Release middle button
|
0x08 0x00 0x00
|
Press right button
|
0x0A 0x00 0x00
|
Release right button
|
0x08 0x00 0x00
|
PS2 KEYBOARD
PS2 Keyboard 最早是在1981年由IBM開發出來,運用在PC/XT的機器上使用的鍵盤,當時只有83個按鍵依照Scan Code Set1定義每個按鍵的按鍵值。直到1984年IBM又開發了新的鍵盤提供給PC/AT的機器使用,共有84-101個按鍵可支援多個語言,和舊的PC/XT並不相容,依照Scan Code Set 2去定義每個按鍵的按鍵值。到了1987年IBM又定義了新的鍵盤,更改了連接孔及按鍵值改採Scan Code Set 3,和PC/AT的鍵盤相容,但是新的鍵盤並沒有辦法取代PC/AT鍵盤,造成現行的鍵盤都以PC/AT為主。
以下依據各種Scan Code Set的不同做說明:
- Scan Code Set 1 –
- 根據鍵盤的位置來定義各個按鍵的按鍵值
- 按鍵放開的按鍵值 = 按鍵按下的按鍵值 + 0x80,只使用1個byte
- 控制按鍵 [i.e Ctrl,Shift,Fn,Insert,…] 使用 2 bytes
- Windows 多媒體按鍵 scan code = E0 + 按鍵值,2 bytes
- Scan Code Set 2 –
- 按鍵放開的按鍵值 = 0xF0 + 按鍵按下的按鍵值,使用2 bytes
- Scan Code Set 3 –
- 控制按鍵 [i.e Ctrl,Shift,Fn,Insert,…] 使用 1 byte
- 自我校正
在電源供電及系統傳送初始化指令[0xFF]時,鍵盤就會開始自我測試並且把鍵盤初始值如下:
- Typematic delay 500 ms
- Typemaic rate 10.9 cps
- Scan code set 2
- Set all keys typematic / make / break
當系統端使用初始化指令,初始鍵盤時,若初始化成功完成,鍵盤會以0xAA回應系統;如果失敗,鍵盤會以0xFC回應系統。
- 鍵盤的指令
鍵盤在收到每一筆系統的指令或資料都會回傳0xFA給系統,告知系統,讓系統傳送下一筆指令或資料。系統傳給鍵盤的指令如下:
- 0xE6 [ Set/Reset LEDs ] – 設定或清除鍵盤上的LED,系統的控制位元值的定義如下:
- 0xEE [ Echo ] - 鍵盤會回復0xEE給系統
- 0xF0 [ Set Scan Code Set ] – 設定鍵盤的Scan Code Set,系統控制位元值的定義如下:
- 0xF2 [ Get Device ID ] – 取得鍵盤的識別碼,一般值為 0xAB 0x83
- 0xF3 [ Set Typematic Rate / Delay ] – 鍵盤敲打的速率及重覆的延遲時間。系統控制位元值的定義如下
- The argument byte – Repeat Rate [CPS]
- The argument byte – Delay [ Second ]
- 0xF4 [ Enable ] – 鍵盤開始傳送資料給系統
- 0xF5 [ Disable ] – 鍵盤禁止傳送資料給系統
- 0xF6 [ Set Default ] – 設定為初始值,其內容為
- Typematic rate / delay = 10.9 cps / 500 ms
- Key type = all key typematic / make / break
- Scan Code Set 2
- 0xF7 [ Set All Keys Typematic ] – 設定所有的按鍵沒有Break Code
- 0xF8 [ Set All Keys Make/Break ] – 設定所有的按鍵沒有repeat的功能
- 0xF9 [ Set All Keys Make ] – 設定所有的按鍵只有Make Code
- 0xFA [ Set All Keys Typematic/Make/Break ] – 設定覆正常狀態
- 0xFB [ Set Key Type Typematic ] - 設定按鍵沒有Break Code
- 0xFC [ Set Key Type Make/Break ] - 設定按鍵沒有repeat的功能
- 0xFD [ Set Key Type Make ] - 設定按鍵只有Make Code
- 0xFE [ Resend ] – 要求系統重新傳送前一次的指令給鍵盤
- 0xFF [ Reset ] – 鍵盤重新自我測試及初始化
- 鍵盤初始化的指令
由鍵盤插入系統後,得到系統電源,鍵盤先完成自我測試傳出0xAA告知系統,鍵盤已經加入系統,系統會要求鍵盤做自我測試後,偵測鍵盤的ID後,才開始初始化設定鍵盤,讓鍵盤開始傳送資料給系統。
留言
張貼留言