Komunikaci mezi klávesnicí a FITkitem obstarává řadič v FPGA, který převádí sériovou komunikaci PS/2 protokolu na paralelní a naopak. Popis řadiče naleznete v dokumentu Řadič PS/2. Existují 2 varianty tohoto řadiče. Varianta half, která umožňuje přenos pouze z klávesnice do FITkitu, a varinata full, pomocí které lze komunikovat obousměrně. Protože je potřeba pracovat s LED diodami klávesnice a nastavit sadu SCAN kódů, musí se použít varianta full.
Přerušení
Signál využitelný k žádosti o přerušení je možné získat zapojením výstupu DATA_VLD řadiče PS/2 na pin X(0). V případě více zdrojů přerušení v FPGA je vhodné použít řadič přerušení.
Pin X(0) (pin 5 konektoru JP10) je nutné propojit vodičem s některým pinem MCU (konektor JP9).
Dokumentaci lze nalézt na tomto odkazu.
Při stisku nebo uvolnění klávesy klávesnice generuje scan kód, který jednoznačně identifikuje klávesu a její stav (stisknuta, uvolněna). Existují 3 způsoby tvorby tohoto kódu, tzv. sady scan kódů.
Sada 1
Tato sada pochází z klávesnic počítačů XT. Při stisku klávesy se odešle její kód (tzv. make kód). U některých kláves (na některých klávesnicích označeny šedou barvou) tvoří make kód 2 byty, přičemž první má hodnotu E0h. Kupříkladu klávesa Enter má make kód 1Ch a klávesa Enter na numerické části klávesnice má make kód E0 1Ch. Při uvolnění klávesy je generován break kód, který se od make kódu liší jen přičtením hodnoty 80h. V případě 2 bytových kódů se nejdříve odešle hodnota E0h a poté teprve kód klávesy s přičtenou hodnotu 80h. Výjimku tvoří klávesa pause, která generuje make kód E1 1D 45 E1 9D C5h. Break kód při uvolnění negeneruje.
Tuto sadu používá knihovna v souborech mcu/libs/ps2/ps2_keyb.*.
Sada 2
Později byla vyvinuta nová sada scan kódů, ale způsobovala problémy u starých programů. Proto se výstup z klávesnice konvertoval pomocí mikroprocesoru 8042 zpět na sadu 1. Toto řešení se používá dodnes. Sada 2 se od sady 1 liší v jiném číslování kláves a tím i v jiných make kódech. Liší se také v break kódech, kdy místo přičítání 80h se před kódem klávesy odešle byte F0h. Proto může být v této sadě make kód větší než 127. V případě 2 bytových kódů se příznak uvolnění F0h odesílá až po prvním bytu E0h.
Sada 3
Tato sada byla vytvořena pro PS/2 klávesnice, ale v praxi nepoužívá. Některé klávesnice ji ani nepodporují.
Do klávesnice lze odesílat různé příkazy. Například lze požádat o opětovné poslání posledního bytu, nastavit sadu scan kódů, rozsvěcet LED diody, nastavit opakování kláves při dlouhém stisku nebo klávesnici resetovat. Kompletní seznam příkazů lze nalézt zde.
Sadu scan kódů lze u většiny dnešních klávesnic nastavit. Provede se to odesláním bytu F0h, na který klávesnice odpoví bytem ack FAh, a bytu 01h, 02 nebo 03h dle požadované sady, na který klávesnice opět odpoví bytem ack FAh.
Klávesnice provede reset po připojení napájecího napětí nebo po přijetí příkazu k provedení resetu. Po resetu se provede otestování klávesnice, tzv. BAT (Basic Assurance Test). Pokud je tento test úspěšný, klávesnice odešle byte AAh (BAT successful), v případě neúspěchu odešle FCh (error). Po resetu jsou nastaveny tyto hodnoty:
Nastavena sada scan kódů č. 2.
Prodleva před opakováním klávesy nastavena na 500 ms.
Rychlost opakování klávesy 10,9 úhozů za vteřinu.
LED diody na klávesnici lze libovolně rozsvěcet a zhasínat. Ovšem je třeba mít na paměti, že při svítící LED Num Lock má na některých klávesnicích např. klávesa Home jiný scan kód než když LED nesvítí.
Při svítící LED a stisku klávesy Home se odešle kód stisku klávesy Shift, poté kód stisku a uvolnění klávesy 7 na numerické klávesnici a nakonec kód uvolnění klávesy Shift. Jedná se o fake shift.
Ovládání LED diod se provádí odesláním bytu EDh, následovaného bytem obsahujícím požadované stavy LED diod, viz obr. Zapsání 1 na pozici požadované LED znamená rozsvícení, 0 znamená zhasnutí LED.
Komunikace s klávesnicí se řídí konečným automatem:
(chybí obrázek)
Před použitím knihovny v programu je třeba inicializovat spojení s klávesnicí zavoláním funkce
void keyboard_ps2_init(void (*callback)(unsigned char))
V parametru funkce je třeba předat odkaz na funkci, která se má zavolat při přijetí znaku z klávesnice.
Signál žádosti o přerušení z FPGA je třeba připojit na některý ze vstupů MCU.
V programu musíme vytvořit obslužnou rutinu žádosti o přerušení, která při každé žádosti zavolá funkci
void keyboard_ps2_FM()
Příklad obslužné rutiny (signál žádosti o přerušení je připojen na pin P1.7):
#define MCU_INTERRUPT_PINS BIT7 interrupt(PORT1_VECTOR) ps2_interrupt(void) { if (P1IFG & MCU_INTERRUPT_PINS) { P1IFG &= ~(MCU_INTERRUPT_PINS); //nulovani priznaku preruseni keyboard_ps2_FM(); //obslouzeni preruseni } }
Této funkci je předán ASCII znak, který byl zadán na klávesnici. Speciální klávesy jsou mapovány do horní poloviny ASCII tabulky takto:
enum eFuncKeys { KEY_L_CTRL =128, KEY_NUM =129, KEY_CAPS =131, KEY_SCROLL =132, KEY_L_ALT =135, KEY_L_SHIFT =143, KEY_R_CTRL =159, KEY_F1 =161, KEY_F2 =162, KEY_F3 =163, KEY_F4 =164, KEY_F5 =165, KEY_F6 =166, KEY_F7 =167, KEY_F8 =168, KEY_F9 =169, KEY_F10 =170, KEY_F11 =171, KEY_F12 =172, KEY_R_ALT =191, KEY_KP_MINUS=192, KEY_KP_PLUS =193, KEY_KP_0 =194, KEY_KP_1 =195, KEY_KP_2 =196, KEY_KP_3 =197, KEY_KP_4 =198, KEY_KP_5 =199, KEY_KP_6 =200, KEY_KP_7 =201, KEY_KP_8 =202, KEY_KP_9 =203, KEY_HOME =204, KEY_UP =205, KEY_PG_UP =206, KEY_LEFT =207, KEY_RIGHT =208, KEY_END =209, KEY_DOWN =210, KEY_PG_DN =211, KEY_INSERT =212, KEY_DELETE =213, KEY_L_WIN =214, KEY_R_WIN =215, KEY_APPS =216, KEY_ESC =217, KEY_R_SHIFT =255 };