Odczyt i zapis klawiatury PS/2

Zasada działania klawiatury typu AT

Klawiatura typu AT posiada złącze typu DIN, przez które przesyłane są 4 sygnały: CLOCK, DATA, +5V i GND. Zasilanie +5V jest dostarczane z komputera, a masa klawiatury GND jest dołączona do masy komputera. Sygnały CLOCK i DATA są typu "otwarty kolektor". Klawiatura, jak również komputer, posiadają rezystory podpinające sygnały CLOCK i DATA do zasilania +5V. Komunikacja pomiędzy klawiaturą i komputerem odbywa się za pomocą dwukierunkowego synchronicznego protokołu szeregowego - dane są odczytywane bit po bicie podczas każdego cyklu zegara. Klawiatura może wysyłać dane do komputera, a komputer może wysyłać dane do klawiatury, ale priorytet ma zawsze komputer i w każdej chwili może wstrzymać komunikację ustawiając sygnał CLOCK w stan niski.

Dane wysyłane z klawiatury do komputera są odczytywane podczas opadającego zbocza zegara. Dane wysyłane przez komputer do klawiatury są odczytywane podczas narastającego zbocza zegara. Bez względu na kierunek komunikacji, sygnał zegara zawsze generuje klawiatura. Jeśli komputer chce wysłać dane, to musi "poprosić" klawiaturę o wygenerowanie sygnału zegara:

  1. Ustawić CLOCK=0 na przynajmniej 100us.
  2. Ustawić DATA=0.
  3. Uwolnić linię CLOCK.
  4. Poczekać aż klawiatura ustawi CLOCK na zero.
  5. Odpowiednio ustawić linię DATA aby wysłać pierwszy bit danych.
  6. Poczekać aż klawiatura ustawi CLOCK=1.
  7. Poczekać aż klawiatura ustawi CLOCK=0.
  8. Powtórzyć kroki 5-7 dla pozostałych bitów danych oraz bitu parzystości.
  9. Zwolnić linię danych.
  10. Poczekać, aż klawiatura ustawi DATA=0.
  11. Poczekać, aż klawiatura ustawi CLOCK=0.
  12. Poczekać, aż klawiatura zwolni DATA i CLOCK.

Maksymalna częstotliwość sygnału zegarowego wynosi 33kHz, ale najczęściej jest to 10-20kHz (zaleca się 15kHz).

Współpraca komputera z klawiaturą polega w większości na odczytywaniu przez komputer danych z klawiatury. Komputer wysyła dane do klawiatury wtedy, gdy np. chce ustawić CAPS LOCK, SCROLL LOCK, NUM LOCK, wpisać częstotliwość powtarzania klawiszy typematic rate, wpisać opóźnienie włączenia powtarzania klawiszy typematic delay itp.

Dane z klawiatury wysyłane są szeregowo w następującej kolejności:
- 1 bit startu (zawsze 0);
- 8 bitów danych (najpierw najmniej znaczący bit);
- 1 bit parzystości (jeśli liczba jedynek jest parzysta to bit parzystości = 1);
- 1 bit stopu (zawsze 1).

Bity są odczytywane podczas opadającego zbocza zegara:

 

Czas od narastającego zbocza zegara CLOCK do zmiany sygnału DATA wynosi przynajmniej 5us. Czas od zmiany sygnału DATA do opadającego zbocza sygnału CLOCK wynosi przynajmniej 5us a najwyżej 25us. Po wysłaniu bitu stopu klawiatura czeka przynajmniej 50us, zanim wyśle następny znak. Kody wysyłane przez klawiaturę opisuje poniższa tabela. Kod "make" jest wysyłany przy naciśnięciu klawisza. Jeśli przycisk jest trzymany, to po upływie czasu "typematic delay" klawiatura dalej wysyła kody "make" z częstotliwością określoną przez "typematic rate". Jeśli przycisk jest puszczony to wysyłany jest kod "break".

  wartość domyślna dopuszczalny zakres
typematic delay [s] 0.5 0.25 - 1
typematic rate [cps]
(cps = character per second)
10.9 2 - 30

Kody klawiatury "Keyboard Scan Codes, Set 2":

* Wszystkie wartości w formacie szesnastkowym.

KEY

MAKE

BREAK

-----

KEY

MAKE

BREAK

-----

KEY

MAKE

BREAK

A

1C

F0,1C

 

9

46

F0,46

 

[

54

FO,54

B

32

F0,32

 

`

0E

F0,0E

 

INSERT

E0,70

E0,F0,70

C

21

F0,21

 

-

4E

F0,4E

 

HOME

E0,6C

E0,F0,6C

D

23

F0,23

 

=

55

FO,55

 

PG UP

E0,7D

E0,F0,7D

E

24

F0,24

 

\

5D

F0,5D

 

DELETE

E0,71

E0,F0,71

F

2B

F0,2B

 

BKSP

66

F0,66

 

END

E0,69

E0,F0,69

G

34

F0,34

 

SPACE

29

F0,29

 

PG DN

E0,7A

E0,F0,7A

H

33

F0,33

 

TAB

0D

F0,0D

 

U ARROW

E0,75

E0,F0,75

I

43

F0,43

 

CAPS

58

F0,58

 

L ARROW

E0,6B

E0,F0,6B

J

3B

F0,3B

 

L SHFT

12

FO,12

 

D ARROW

E0,72

E0,F0,72

K

42

F0,42

 

L CTRL

14

FO,14

 

R ARROW

E0,74

E0,F0,74

L

4B

F0,4B

 

L GUI

E0,1F

E0,F0,1F

 

NUM

77

F0,77

M

3A

F0,3A

 

L ALT

11

F0,11

 

KP /

E0,4A

E0,F0,4A

N

31

F0,31

 

R SHFT

59

F0,59

 

KP *

7C

F0,7C

O

44

F0,44

 

R CTRL

E0,14

E0,F0,14

 

KP -

7B

F0,7B

P

4D

F0,4D

 

R GUI

E0,27

E0,F0,27

 

KP +

79

F0,79

Q

15

F0,15

 

R ALT

E0,11

E0,F0,11

 

KP EN

E0,5A

E0,F0,5A

R

2D

F0,2D

 

APPS

E0,2F

E0,F0,2F

 

KP .

71

F0,71

S

1B

F0,1B

 

ENTER

5A

F0,5A

 

KP 0

70

F0,70

T

2C

F0,2C

 

ESC

76

F0,76

 

KP 1

69

F0,69

U

3C

F0,3C

 

F1

05

F0,05

 

KP 2

72

F0,72

V

2A

F0,2A

 

F2

06

F0,06

 

KP 3

7A

F0,7A

W

1D

F0,1D

 

F3

04

F0,04

 

KP 4

6B

F0,6B

X

22

F0,22

 

F4

0C

F0,0C

 

KP 5

73

F0,73

Y

35

F0,35

 

F5

03

F0,03

 

KP 6

74

F0,74

Z

1A

F0,1A

 

F6

0B

F0,0B

 

KP 7

6C

F0,6C

0

45

F0,45

 

F7

83

F0,83

 

KP 8

75

F0,75

1

16

F0,16

 

F8

0A

F0,0A

 

KP 9

7D

F0,7D

2

1E

F0,1E

 

F9

01

F0,01

 

]

5B

F0,5B

3

26

F0,26

 

F10

09

F0,09

 

;

4C

F0,4C

4

25

F0,25

 

F11

78

F0,78

 

'

52

F0,52

5

2E

F0,2E

 

F12

07

F0,07

 

,

41

F0,41

6

36

F0,36

 

PRNT
SCRN

E0,12,
E0,7C 

E0,F0,
7C,E0,
F0,12 

 

.

49

F0,49

7

3D

F0,3D

 

SCROLL

7E

F0,7E

 

/

4A

F0,4A

8

3E

F0,3E

 

PAUSE

E1,14,77,
E1,F0,14,
F0,77

-NONE-

 

 

 

 

 

 

Wybrane polecenia wysyłane do klawiatury:

MSB             LSB
0 0 0 0 0 CAPS
LOCK
LED
NUM
LOCK
LED
SCROLL
LOCK
LED
  • 0xFF (Reset) - Klawiatura odpowiada "ack" (0xFA), następnie przechodzi w tryb "Reset".
  • 0xFE (Resend) - Klawiatura odpowiada "ack", powtórnie wysyłając ostanio wysłany bajt. Wyjątek: jeśli ostatnio wysłany bajt to "resend" (0xFE), to klawiatura wysyła ostanio nadany bajt inny niż 0xFE. To polecenie jest wykorzystywane w celu zasygnalizowania przez komputer błędu w odbiorze danych.
  • 0xF6 (Set Default) - Ustawienie domyślnych wartości, m.in. typematic rate/delay (10.9cps / 500ms).
  • 0xF5 (Disable) - Klawiatura przestaje skanować klawisze, zostają załadowane wartości domyślne (patrz "Set Default") i czeka na dalsze instrukcje.
  • 0xF4 (Enable) - Ponownie uruchamia klawiaturę po jej wyłączeniu poleceniem "Disable".
  • 0xF3 (Set Typematic Rate/Delay) - Po tym poleceniu komputer wysyła jeden bajt określający typematic rate oraz delay.
  • 0xF2 (Read ID) - Klawiatura odpowiada zwracając 2-bajtowy ID: 0xAB, 0x83 (najpierw 0xAB, potem 0x83).
  • 0xF0 (Set Scan Code Set) - Klawiatura odpowiada "ack", a następnie czyta kolejny bajt przesłany przez komputer. Ten bajt może mieć wartość: 0x01, 0x02 lub 0x03 - ustawienie trybu scan code na: 1, 2 lub 3. Klawiatura odpowiada na ten bajt "ack". Jeśli argument jest równy 0x00, to klawiatura odpowiada "ack" a następnie przesyła numer aktualnie ustawionego scan code set.
  • 0xEE (Echo) - Klawiatura odpowiada "Echo" (0xEE).
  • 0xED (Set/Reset LEDs) - Po tym poleceniu komputer musi wysłać dodatkowy bajt, który określa stan diod LED na klawiaturze: Num Lock, Caps Lock i Scroll Lock. Ten argument jest określony jako:
  • LED: 0=off 1=on

Źródło: http://www.computer-engineering.org/ps2keyboard

Uwagi:

Opisana zasada działania klawiatury AT ze złączem DIN ma również zastosowanie do klawiatury typu PS/2. Taki sam protokół wykorzystywany jest również przez mysz typu PS/2.

  • Sygnał CLOCK może posiadać zakłócenia. Zaleca się kilkakrotne próbkowanie sygnału CLOCK, aby wykryć opadające zbocze.
  • Najlepiej zacząć od układu wykrywania zbocza zegara, przesyntezować go i przeprowadzić implementację oraz obserwacje na oscyloskopie. Następnie należy dodawać i sprawdzać kolejne porcje projektu.