Drivere de dispozitiv de intrare

Să ne îndreptăm atenția asupra driverelor pentru dispozitivele de intrare comune, cum ar fi tastaturile, mouse-urile și ecranele tactile. Dar, mai întâi, să luăm o privire rapidă asupra serviciului gata de accesare a echipamentului, disponibil pentru driverele de intrare.







Nivelul serio oferă rutine de bibliotecă pentru a accesa echipamente de intrare învechite, cum ar fi controlorii de tastatură compatibili cu i8042 și portul serial. Tastatura și mouse-ul PS / 2 se conectează la primul și controlerele tactile cu o interfață serială se conectează la acesta din urmă. Pentru a interacționa cu echipamentele seriale, de exemplu, pentru a trimite comenzi către mouse-ul PS / 2, procedurile presetate de apel invers serio sunt înregistrate cu serio_register_driver ().

Pentru a adăuga un nou driver ca parte a serio, folosind serio_register_port (), sunt înregistrate punctele de intrare open () / close () / start () / stop () / write (). Pentru un exemplu, uita-te la drivere / input / serio / serport.c.

După cum se poate observa în Figura 7.1, seria este doar una dintre căile de acces la hardware low-level. Unele drivere de dispozitive de intrare se bazează pe suporturi de nivel inferior de la nivelurile magistralei în loc de acestea, cum ar fi USB sau SPI.

Tastaturi

Tastaturi sunt pentru fiecare gust - PS / 2 învechite, USB, Bluetooth, IR, și așa mai departe. Fiecare tip are un driver de dispozitiv de intrare special, dar toți folosesc același driver de eveniment de tastatură, oferind astfel o interfață de utilizator unică. Cu toate acestea, driverul evenimentului de tastatură are o caracteristică distinctivă în comparație cu alte drivere de evenimente: transferă datele către un alt subsistem kernel (tty level), mai degrabă decât spre spațiul utilizator folosind nodurile / dev.

Tastaturi PC

Tastele PC (denumite și tastaturi PS / 2 sau tastaturi AT) comunică cu procesorul prin controlerul de tastatură compatibil cu i8042. PC-urile au, de obicei, un controler de tastatură dedicat, dar pe laptopuri, comunicarea cu tastatura este una dintre responsabilitățile unui controler general de utilizare (vezi capitolul 20, "Dispozitive și drivere opționale"). Când apăsați o tastă de pe tastatura computerului, acest lucru se întâmplă pe următoarea cale:

1. Controlerul de tastatură (sau controlerul încorporat) scanează și decodează matricea tastaturii și se ocupă de nuanțe, cum ar fi eliminarea deranjamentului contactelor.

2. Driverul de tastatură al dispozitivului, cu serio, citește codurile de scanare brute de la controlerul tastaturii pentru fiecare apăsare și eliberare a tastei. Diferența dintre apăsarea și eliberarea este cel mai semnificativ bit, care este setat pentru ultimul caz. De exemplu, apăsarea butonului "a" oferă o pereche de coduri de scanare, 0x1e și 0x9e. Butoanele speciale sunt scoase cu 0xE0. prin urmare, apăsarea butonului săgeată dreapta produce o secvență (0xE0 0x4D 0xE0 0xCD). Pentru a observa codurile de scanare care ies din controler, puteți utiliza utilitarul showkey (după simbolul → explicațiile merg):

bash> showkey-uri
Claire se afla în modul UNICODE
[Dacă încercați acest lucru sub X, este posibil să nu funcționeze, deoarece
Serverul X citește, de asemenea, / dev / console]

apăsați orice buton (programul se va termina după 10 secunde după)
ultima apăsare a butonului).
.
0x1e 0x9e → Apăsând butonul "a"






3. Driverul de tastatură al dispozitivului convertește codurile de scanare primite în coduri de taste pe baza modului de introducere. Pentru a vedea codul cheie corespunzător butonului "a":

bash> showkey
.
codul de buton 30 apăsați → Apăsarea butonului "a"
codul eliberării butonului 30 → butonul de eliberare "a"

Pentru a informa mai departe aceste coduri cheie, șoferul generează un eveniment de intrare care transmite controlul la driverul de evenimente al tastaturii.

4. Driverul evenimentului de tastatură are grijă de lucrul la conversia codului cheie, în funcție de cartea de cod de chei încărcată. (Vedeți fișierele de încărcare și fișierele de hărți din / lib / kbd / keymaps.) Verifică dacă codul cheie transformat este o acțiune cum ar fi comutarea consolei virtuale sau repornirea sistemului. În loc să repornească sistemul, ca răspuns la apăsarea tastelor Ctrl + Alt + Del, LED-urile CAPSLOCK și NUMLOCK sunt aprinse. adăugați driverul evenimentului tastaturii, drivere / char / keyboard.c, la comanda Ctrl + Alt + Del. Următoarele:

static void fn_boot_it (struct vc_data * vc, struct pt_regs * regs)
<
+ set_vc_kbd_led (kbd, VC_CAPSLOCK);
+ set_vc_kbd_led (kbd, VC_NUMLOCK);
- ctrl_alt_del ();
>

5. Pentru cheile convenționale, codul de clic convertit este trimis terminalului virtual asociat și disciplinei liniei N_TTY. (Am discutat despre terminalele virtuale și despre disciplinele de linie din capitolul 6, "Drivere de porturi seriale") Drivere / char / keyboard.c procedează astfel:

/ * Adăugați codul cheie pentru tamponul comutat * /
tty_insert_flip_char (tty, keycode, 0);
/ * Planificam * /
con_schedule_flip (tty);

Figura 7.3 arată mișcarea datelor din momentul în care tasta este apăsată pe tastatură, până când aceasta apare în consola virtuală. Partea stângă a cifrei depinde de echipament, iar jumătatea dreaptă este de natură generală. În conformitate cu scopul de a dezvolta subsistemul de intrare, interfața hardware de bază este transparentă pentru driverul evenimentului de tastatură și nivelul tty. Astfel, kernelul de intrare și interfețele de eveniment bine definite protejează utilizatorii de intrare de nuanțele echipamentului.

Drivere de dispozitiv de intrare

Figura 7.3. Flux de date de la tastatură compatibilă cu PS / 2.

Tastaturi USB și Bluetooth

Specificațiile USB asociate cu dispozitivele de interacțiune umană (HID) oferă un protocol prin care tastaturile USB, șoarecii, seturile de butoane și alte dispozitive de intrare periferice sunt utilizate pentru interacțiune. Pe Linux, acest lucru se face prin driverul USB usbhid client. care este responsabil pentru clasa USB HID (0x03). Usbhid se înregistrează ca driver de dispozitiv de intrare. Aceasta corespunde API-ului de intrare și raportează evenimentele de intrare corespunzătoare ale HID-urilor conectate.

Pentru a înțelege calea codului pentru tastatura USB, revenim la Figura 7.3 și schimbăm jumătatea stângă dependentă de hardware. Înlocuiți controlerul de tastatură în caseta "Echipamente de intrare" de pe controlerul USB, serio la nivelul miezului USB și caseta "Driver de dispozitiv de intrare" la driverul usbhid.

Pentru tastatura Bluetooth, în figura 7.3, înlocuiți controlerul de la tastatură cu chipset-ul Bluetooth, serio la nivel de bază Bluetooth și caseta "Driver pentru dispozitivul de intrare" din driverul hidp Bluetooth.

USB și Bluetooth sunt discutate în detaliu în capitolul 11, "Universal Serial Bus" și în capitolul 16, "Linux fără fire", respectiv.

Șoarecii, cum ar fi tastaturile, vin cu capabilități diferite și au diferite opțiuni de interacțiune. Să ne uităm la cele utilizate în mod obișnuit.

Șoarecii generează mișcări relative de-a lungul axelor X și Y. În plus, au unul sau mai multe butoane. Unii dintre ei au și o roată de derulare. Driverul de dispozitiv de intrare pentru mouse-ul obișnuit PS / 2 compatibil cu controlerul se bazează pe nivelul serio. Un driver de evenimente de intrare pentru șoareci, numit mousedev. raportează evenimentele mouse-ului către aplicațiile utilizatorilor folosind / dev / input / mouse-uri.

Exemplu de șofer: rotița mouse-ului

Șoferul dispozitivului mouse-wheel, implementat în listare 7.3, funcționează cu sisteme de ferestre, cum ar fi X Windows. Pentru a vedea cum pretinde șoferul despre capacitățile sale asemănătoare mouse-ului, uita-te la roller_mouse_init (). Spre deosebire de driverul de roți din lista 4.1 din capitolul 4, șoferul roții mouse-ului nu are nevoie de metodele read () sau poll (). deoarece evenimentele sunt raportate utilizând API-ul de intrare. Funcționatorul de întrerupere pentru roller_isr () se modifică și în consecință. Eliminăm acțiunile de serviciu efectuate în handlerul de întrerupere folosind coada de așteptare, spinlock și procedura store_movement () pentru a suporta citirea () și sondajul ().

În Tipărirea 7.3, + și - la începutul liniilor, sunt indicate diferențele de la conducătorul roții rotative implementate în Lista 4.1 din Capitolul 4.

Tipărirea 7.3. Mouse-ul șoferului







Articole similare

Trimiteți-le prietenilor: