Čeština / English
Login

Firmware / Obsluha PS/2 klávesnice

Autoři: Karel Slaný (); Pavel Bartoš ()
Update: 26.3.2009

1. Řadič v FPGA

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).

2. Popis komunikace s klávesnicí

2.1. Protokol PS/2

Dokumentaci lze nalézt na tomto odkazu.

2.2. Sady scan kódů

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í.

2.3. Příkazy klávesnice

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.

2.3.1. Nastavení sady scan kódů

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.

2.3.2. Reset klávesnice

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.

2.3.3. Ovládání LED klávesnice

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.

3. Použití knihovny ps2_keyb

Komunikace s klávesnicí se řídí konečným automatem:

(chybí obrázek)

3.1. Inicializace

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.

3.2. Přerušení

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
  }
}

3.3. Callback funkce

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
};
Zobrazeno: 4106x Naposledy: 29.11.2023 09:26:57