Een duur toetsenbord
door Xavier & Illiac
In dit artikel beschrijven we een hoe een toetsenbord werkt
en hoe deze te simuleren is via de parallele poort van een computer.
Werking van een toetsenbord
Het PC/AT toetsenbord verzend data in een serieel formaat bestaande uit een startbit 8
data bits(LSB first) en even parity check en een stopbit. Zoals te zien is in figuur 1.
Naast de clock en data heeft de 5 pins connector (figuur 2) ook aansluitingen voor 5V
voeding, een ground en niet gebruikte pin. Zowel de clock als de data lijn zijn
geimplementeerd op het toetsenbord als een open-collector output met een pull-up weerstand
naar +5V. OPM. het PS/2 toetsenbord is logisch equivalent maar gebruikt een andere
connector (met een extra niet gebruikte pin).
Figuur 1. PC/AT Keyboard Timing (C) Philips
Als er op een toets gedrukt wordt , zend het PC/AT
toetsenbord een 'make' code, en wanneer de toets los gelaten wordt een 'break' code. De
'break' code bestaat uit dezelfde 8-bit scan code voorafgegeaan door de speciale
hexidecimale code : F0.
Figuur 2. Keyboard Connections (looking in male-connector). Original image is (C)
by Philips
Een opmerkelijk verschil met een regulier ascii toetsenbord
is de manier waarop CTLR,ALT,SHIFT, enz werken. Bij een ASCII toetsenbord wordt door deze
control toetsen direct de output verandert. bijvoorbeeld : een 61H (ascii code voor 'a')
is uitvoer als alleen op de 'A' toets gedrukt wordt. Terwijl 41H(ascii code voor 'A') de
uitvoer is als zowel op SHIFT en 'A' gedrukt wordt. Bij een PC/AT toetsenbord werkt dit
anders, een AT toetsenbord ziet zo'n combinatie als 2 aparte toetsindrukken : SHIFT-make,
'A'-make, SHIFT-break, 'A'-break. De 'A' scan code(1CH) is hetzelfde voor zowel de
geshifte als niet geshifte toestand. Om nu onderscheid te maken tussen een 'a' of een 'A'
als de 'A' scancode verstuurd wordt moet de pc dus bijhouden of er een SHIFT-make aan
voorafgegaan is.
Verder zijn er nog berichten die van de computer naar het
toetsenbord gaan. Bij een PC/AT toetsenbord is het mogelijk om control berichten van het
systeem te ontvangen naast de te zenden scan code informatie naar de computer. Op deze
manier kunnen de LED's en de keyboard typematic keyrate instellingen gewijzigd worden.
Command transmissie naar het toetsenbord wordt geinitieerd door de CLOCK-line low te
brengen voor een minimum van 60 uS. na de 60uS vertraging moet de data lijn omlaag
gebraagd worden en de clock line weer hoog gemaaakt worden. Na een bepaalde tijd (max 10
milliseconden) moet het toetsenbord clock pulsen gaan genereren. Op elke hoog naar laag
clock transitie neem het toetsenbord een nieuw bit aan. De data stream van het system op
de data line moet conform het bovenstaande protocol verzonden worden. Nadat het pariteit
bit ontvangen is, moet de computer de data line weer hoogmaken en wachten totdat het
toetsenbord nog een clockpulse zendt, dit wordt het 10e hoog ->laag transistie, de
initiele hoog->laag transitie geinitieerd door de host niet meegeteld.
Als de data lijn niet hoog gemaakt wordt nar de 10e clock
bit dan blijft het toetsenbord clockpulsen sturen totdat de data-lijn vrijgegeven wordt.
Mocht dit voorkomen dan wordt na een korte vertraging door het toetsenbord de data lijn
laaggemaakt en een RESEND status byte (FEh) verzonden.
Commando's
Hieronder de commando's die de computer sturen kan naar het toetsenbord.
F5h |
Default disable. Reset het toetsenbord, retourneer een ACK
en wacht met het uitlezen van toetsen, op een volgend commando. Wijzigt niet de status van
de indicatie leds. |
EEh |
Echo. Reageer met een ECHO code (EEh). |
F4h |
Enable. Leegt alle output buffer, enabled kbd, retourneer
een ACK. |
F2h |
Read ID. Reageer met een ACK en 2 ID bytes (83h,ABh). Gaat
verder met uitlezen van toetsen zelfs als voorheen uitgezet is. |
FEh |
Resend. Verzend de laatst verzonden scan code opnieuw. |
FFh |
Reset. Reset het keyboard CPU, start de power-on test.
Reageer met een power-on-test byte. |
F0h |
Select scan code set. Reageer met een ACK, dan wachten op
de computer die een van de volgende bytes (01h,02h or 03h) stuurt, waarmee de te gebruiken
scan code set wordt aangegeven. Als een 00h verzonden is, reageert het toetsenbord met een
ACK en gebruik verder de aangeven set. |
F7h |
'Set all keys typematic' |
F8h |
'Set all keys make/break' |
F9h |
'Set all keys make' |
FAh |
'Set all keys typematic/make/break' Geen idee wat deze
codes doen, vermoed wordt dat ze aangeven op wat voor manier het toetsenbord de scancodes
moet verzenden. Alle bovenstaande commando's reageren met een ACK code. |
F6h |
Set default. Reageer hetzelfde als de 'Default Disable',
maar stop niet met uitlezen van toetsen. Wijzigt niet de led status. |
FBh |
'Set key type typematic' |
FCh |
'Set key type make/break' |
FDh |
'Set key type make' Nog steeds onzeker wat deze code doen.
In tegenstelling tot de 'set all' commando's, werken deze commando's alleen op 1 enkele
toets. Het toetsenbord verzend een ACK code, wacht dan op de toetsenbord scan code. ACK
wordt gezet na elke ontvangen scan code. Het toetsenbord blijft in de 'set type' state
totdat een nieuw commando's ontvangen is. |
EDh |
Set/reset status indicators. Met dit commando worden de
status leds op het toetsenbord gewijzigd. Het toetsenbord reageert met een ACK en wacht op
de optie byte, als volgt samengesteld : b0-Scrollock, b1-Numlock, b2-Capslock, b3..7=0.
een '1' bit zet de indicatie AAN. |
F3h |
Set autorepeat rate/delay. Reageer met een ACK, wacht dan
op een optie byte dat de autorepeat delay en de rate specificeerd, alsvolgt samengesteld:
b7-unused. b6..5-Repeat delay (00=250 mS, 11=1000mS). b4..0-Repeat rate (00000=30x/sec,
11111=2x/sec). Toetsenbord reageert met een ACK na ontvangst van het option byte. |
De Scan Codes
De toetsen op het toetsenbord zijn alsvolgt genummerd :
,-------,---,---,---,---,,---,---,---,---,,---,---,---,---,
|ESC |F1 |F2 |F3 |F4 ||F5 |F6 |F7 |F8 ||F9 |F10|F11|F12|
|110 |112|113|114|115||116|117|118|119||120|121|122|123|
'-------'---'---'---'---''---'---'---'---''---'---'---'---'
,---,---,---,---,---,---,---,---,---,---,---,---,---,-----,
|~ |1 |2 |3 |4 |5 |6 |7 |8 |9
|0 |- |= |<- |
|1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11
|12 |13 |15 |
|---',--',--',--',--',--',--',--',--',--',--',--',--',----|
|TAB |Q |W |E |R |T |Y |U |I |O |P
|[ |] |\ |
|16 |17 |18 |19 |20 |21 |22 |23 |24 |25 |26 |27 |28 |29 |
|----',--',--',--',--',--',--',--',--',--',--',--',--'----|
|CAPS |A |S |D |F |G |H |J |K |L |;
|, |ENTER |
|30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |40 |41 |43 |
|-----',--',--',--',--',--',--',--',--',--',--',----------|
|SHIFT |Z |X |C |V |B |N |M |, |. |/
|SHIFT |
|44 |46 |47 |48 |49 |50 |51 |52 |53 |54 |55 |57
|
|----,-',--'--,'---'---'---'---'---'---'--,'--,'-----,----|
|CTRL| |ALT | SPACE
|ALT|
|CTRL|
|58 | |60 |
61 |62 |
|64 |
'----'--'-----'---------------------------'---'------'----'
,-----,-----,-----,
|PSCRN|SLOCK|BREAK|
|124 |125 |126 |
'-----'-----'-----'
,-----,-----,-----, ,-----,-----,-----,-----,
|INS |HOME |PGUP | |NLOCK|/ |* |-
|
|75 |80 |85 | |90 |95
|100 |105 |
|-----|-----|-----| |-----|-----|-----|-----|
|DEL |END |PGDN | |7 |8 |9
|+ |
|76 |81 |86 | |91 |96
|101 |106 |
'-----'-----'-----' |-----|-----|-----|-----|
|4 |5 |6 |
|
|92 |97 |102 | |
,-----,
|-----|-----|-----|-----|
|UP |
|1 |2 |3 |ENTER|
|83 |
|93 |98 |103 |108 |
,-----|-----|-----, |-----------|-----| |
|LEFT |DOWN |RIGHT| |0 |.
| |
|79 |84 |89 | |99
|104 | |
'-----'-----'-----' '-----------'-----'-----'
Hieronder een tabel met de bijbehorende scancodes die de
toetsen genereren.
1 |
0x0E |
21 |
0x2C |
41 |
0x52 |
61 |
0x29 |
81 |
0xE069 |
101 |
0x7D |
121 |
0x09 |
2 |
0x16 |
22 |
0x35 |
42 |
-5 |
62 |
0xE011 |
82 |
-5 |
102 |
0x74 |
122 |
0x78 |
3 |
0x1E |
23 |
0x3C |
43 |
0x5A |
63 |
-5 |
83 |
0xE075 |
103 |
0x7A |
123 |
0x07 |
4 |
0x26 |
24 |
0x43 |
44 |
0x12 |
64 |
0xE014 |
84 |
0xE072 |
104 |
0x71 |
124 |
-2 |
5 |
0x25 |
25 |
0x44 |
45 |
-5 |
65 |
-5 |
85 |
0xE07D |
105 |
0x7B |
125 |
0x7E |
6 |
0x2E |
26 |
0x4D |
46 |
0x1A |
66 |
-5 |
86 |
0xE07A |
106 |
0x79 |
126 |
-4 |
7 |
0x36 |
27 |
0x54 |
47 |
0x22 |
67 |
-5 |
87 |
-5 |
107 |
-5 |
127 |
-5 |
8 |
0x3D |
28 |
0x5B |
48 |
0x21 |
68 |
-5 |
88 |
-5 |
108 |
0xE05A |
128 |
-5 |
9 |
0x3E |
29 |
0x5D |
49 |
0x2A |
69 |
-5 |
89 |
0xE074 |
109 |
-5 |
|
|
10 |
0x46 |
30 |
0x58 |
50 |
0x32 |
70 |
-5 |
90 |
0x77 |
110 |
0x76 |
|
|
11 |
0x45 |
31 |
0x1C |
51 |
0x31 |
71 |
-5 |
91 |
0x6C |
111 |
-5 |
|
|
12 |
0x4E |
32 |
0x1B |
52 |
0x3A |
72 |
-5 |
92 |
0x6B |
112 |
0x05 |
|
|
13 |
0x55 |
33 |
0x23 |
53 |
0x41 |
73 |
-5 |
93 |
0x69 |
113 |
0x06 |
|
|
14 |
-5 |
34 |
0x2B |
54 |
0x49 |
74 |
-5 |
94 |
-5 |
114 |
0x04 |
|
|
15 |
0x66 |
35 |
0x34 |
55 |
0x4A |
75 |
0xE070 |
95 |
0xE04A |
115 |
0x0C |
|
|
16 |
0x0D |
36 |
0x33 |
56 |
-5 |
76 |
0xE071 |
96 |
0x75 |
116 |
0x03 |
|
|
17 |
0x15 |
37 |
0x3B |
57 |
0x59 |
77 |
-5 |
97 |
0x73 |
117 |
0x0B |
|
|
18 |
0x1D |
38 |
0x42 |
58 |
0x14 |
78 |
-5 |
98 |
0x72 |
118 |
0x83 |
|
|
19 |
0x24 |
39 |
0x4B |
59 |
-5 |
79 |
0xE06B |
99 |
0x70 |
119 |
0x0A |
|
|
20 |
0x2D |
40 |
0x4C |
60 |
0x11 |
80 |
0xE06C |
100 |
0x7C |
120 |
0x01 |
|
|
In deze tabel staat voor:
-1 is E02AE037
-2 is E012E07C
-3 is E11D45E19DC5
-4 is E11477E1F014F077
-5 is een niet bestaande/gereserveerde toets..
Figuur 3. KeySim Schema Keyboard (C) Xavier & Illiac
Keysim 1.0 - De simulator
De simulator gebruikt de parallele poort (25 pins D-connector) van een pc. Verder moet de
hardware verbonden worden aan de 5 pins male keyboard connector. De software is geschreven
in Borland C 3.1. De software draait onder dos. Gebruik in een dos-box onder Windows is
niet aan te bevelen. De software haalt de te simuleren toetsen uit een woordenlijst. (RARA
waar hebben we dit voor gebruikt ?) De software is natuurlijk aan te passen, zodat deze
zelf woorden kan genereren.
Download hier de software & sourcecode.
Bekende bugs
- Als de simulator bij het opstarten er al in zit geeft de computer de melding dat er geen
toetsenbord aanwezig is.
Opl.: De computer stuurt na het opstarten een reset naar het toetsenbord en wacht
dan op antwoord. Krijgt hij deze niet, dan geeft hij de melding dat er geen toetsenbord
aanwezig is. De software houd hier geen rekening met deze reset en zal dus geen antwoord
geven. Bij het opstarten zal er dus een echt toetsenbord aan de pc moeten zitten. Na het
opstarten kan op ieder gewenst moment eenvoudigweg het toetsenbord vervangen worden door
de simulator.
Geraadpleegde Literatuur
- Philips Semiconductors Microcontroller products. AN434.
- PC Keyboard FAQ.
Disclaimer
De informatie op deze pagina's is alleen bedoeld voor educatieve doeleinden. Ik (Xavier) accepteer geen enkele verantwoordelijkheid met
betrekking tot de informatie op deze pagina's. Eventuele schade die ontstaan is door
informatie die op deze pagina's, is geheel eigen schuld omdat de informatie alleen voor
educatieve doeleinden bedoeld is. Het is de verantwoordelijkheid van de gebruiker zelf
te onderzoeken of hij/zij bij gebruik van informatie op deze pagina's niet handelt in
strijd met de wet. De images op deze pagina's mogen alleen gebruikt worden in combinatie
met deze pagina's. De pagina's mogen alleen elders op het internet gepubliseerd worden
(gemirrord), mits ongewijzigd, volledig intact en onder vermelding van het originele
adres. Elke andere vorm van publikatie of reproduktie is niet toegestaan zonder
uitdrukkelijke schriftelijke toestemming van de auteur. Er mogen tevens geen delen van
deze pagina's gepubliseerd worden zonder uitdrukkelijke schriftelijke toestemming van de
auteur. De Keyboard simulator en de bijbehorende software zijn beide copyright van de
auteurs. De software mag gebruikt en veranderd worden mits de juiste credits gegeven
worden. Er is echter 1 uitzondering de software mag in zowel in originele als gewijzigde
vorm niet commercieel gebruikt worden.
|