lirc(4) Device Drivers Manual lirc(4)

lirc - dispozitive lirc (Linux Infrared remote control)

Dispozitivele de caractere /dev/lirc* oferă o interfață bidirecțională de nivel scăzut pentru telecomenzile cu infraroșu (IR). Majoritatea acestor dispozitive pot primi, iar unele pot trimite. Atunci când primește sau trimite date, controlorul funcționează în două moduri diferite, în funcție de hardware-ul subiacent.

Unele echipamente hardware (de obicei, plăci TV) decodifică semnalul IR intern și furnizează apăsările de buton decodificate ca valori ale codului de scan. Controlorii pentru acest tip de hardware funcționează în modul LIRC_MODE_SCANCODE. De obicei, un astfel de hardware nu acceptă trimiterea de semnale IR. În plus, un astfel de hardware poate decodifica doar un set limitat de protocoale IR, de obicei doar protocolul telecomenzii specifice care este inclusă, de exemplu, cu o placă TV.

Alte echipamente hardware furnizează un flux de durate ale impulsurilor/spațiilor. Astfel de controlori funcționează în modul LIRC_MODE_MODE2. Acest tip de hardware poate fi utilizat cu (aproape) orice tip de telecomandă. Acest tip de hardware poate fi utilizat și în modul LIRC_MODE_SCANCODE, caz în care decodoarele IR ale nucleului vor decoda IR. Aceste decodoare pot fi scrise în BPF extins (a se vedea bpf(2)) și atașate la dispozitivul lirc. Uneori, acest tip de hardware acceptă și trimiterea de date IR.

Ioctl-ul LIRC_GET_FEATURES (a se vedea mai jos) permite, printre altele, să se verifice dacă primirea și trimiterea sunt acceptate și în ce moduri.

Citirea intrării cu modul LIRC_MODE_MODE2

În modul LIRC_MODE_MODE2, datele returnate de read(2) furnizează valori pe 32 de biți reprezentând un spațiu sau o durată de impuls. Timpul duratei (microsecunde) este codificat în cei 24 de biți inferiori. Impulsul (cunoscut și sub denumirea de flash) indică o durată de detectare a luminii infraroșii, iar spațiul (cunoscut și sub denumirea de spațiu) indică o durată fără infraroșu. Dacă durata spațiului depășește timpul de inactivitate, este livrat un pachet special de timp de inactivitate, care marchează sfârșitul unui mesaj. Cei 8 biți superiori indică tipul de pachet:

Valoarea reflectă o durată a spațiului (microsecunde).
Valoarea reflectă durata unui impuls (microsecunde).
Valoarea reflectă o frecvență (Hz); consultați ioctl-ul LIRC_SET_MEASURE_CARRIER_MODE.
Valoarea reflectă o durată a spațiului (microsecunde). Pachetul reflectă un timp de așteptare; consultați ioctl-ul LIRC_SET_REC_TIMEOUT_REPORTS.
Receptorul IR s-a confruntat cu o depășire de capacitate și, prin urmare, datele lipsesc (de la Linux 5.18).

Citirea intrării în modul LIRC_MODE_SCANCODE

În modul LIRC_MODE_SCANCODE, datele returnate de read(2) reflectă apăsările de buton decodate, în structura lirc_scancode. Codul de scanare este stocat în câmpul scancode, iar protocolul IR este stocat în rc_proto. Acest câmp are una dintre valorile din structura enum rc_proto.

Scrierea ieșirii în modul LIRC_MODE_PULSE

Datele scrise în dispozitivul de caractere folosind write(2) sunt o secvență de impulsuri/spații de valori întregi. Impulsurile și spațiile sunt marcate doar implicit prin poziția lor. Datele trebuie să înceapă și să se încheie cu un impuls, deci trebuie să includă întotdeauna un număr impar de eșantioane. Funcția write(2) se blochează până când datele au fost transmise de hardware. Dacă sunt furnizate mai multe date decât poate trimite hardware-ul, apelul write(2) eșuează cu eroarea EINVAL.

Scrierea ieșirii în modul LIRC_MODE_SCANCODE

Datele scrise în dispozitivele de caractere trebuie să fie o singură structură lirc_scancode. Câmpurile scancode și rc_proto trebuie completate, toate celelalte câmpuri trebuie să fie 0. Codificatoarele IR ale nucleului vor converti scan-codul în impulsuri și spații. Protocolul sau codul de scanare nu este valid, sau dispozitivul lirc nu poate transmite.

#include <linux/lirc.h>    /* Dar consultați secțiunea ERORI */
int ioctl(int fd, int cmd, int *val);

Următoarele operații ioctl(2) sunt furnizate de dispozitivul de caractere lirc pentru a sonda sau modifica parametrii hardware specifici lirc.

Dispozitivele /dev/lirc* acceptă întotdeauna următoarele comenzi:

Returnează o mască de biți de caracteristici combinate; consultați CARACTERISTICI.

Dacă un dispozitiv returnează un cod de eroare pentru LIRC_GET_FEATURES, se poate presupune că acesta nu este un dispozitiv lirc.

Unele dispozitive lirc acceptă comenzile enumerate mai jos. Cu excepția cazului în care se specifică altfel, acestea eșuează cu eroarea ENOTTY dacă operația nu este acceptată sau cu eroarea EINVAL dacă operația a eșuat sau au fost furnizate argumente nevalide. Dacă un controlor nu anunță suportul pentru anumite caracteristici, invocarea ioctl-urilor corespunzătoare va eșua cu eroarea ENOTTY.

Dacă dispozitivul lirc nu are receptor, această operație eșuează cu eroarea ENOTTY. În caz contrar, se returnează modul de recepție, care va fi unul dintre:
Controlorul returnează o secvență de durate ale impulsurilor/spațiilor.
Controlorul returnează valorile structurii lirc_scancode, fiecare dintre acestea reprezentând o apăsare de buton decodificată.
Stabilește modul de recepție. val este fie LIRC_MODE_SCANCODE, fie LIRC_MODE_MODE2. Dacă dispozitivul lirc nu are receptor, această operație eșuează cu eroarea ENOTTY.
Returnează modul de trimitere. Este acceptat modul LIRC_MODE_PULSE sau LIRC_MODE_SCANCODE. Dacă dispozitivul lirc nu poate trimite, această operație eșuează cu eroarea ENOTTY.
Stabilește modul de trimitere. val este fie LIRC_MODE_SCANCODE, fie LIRC_MODE_PULSE. Dacă dispozitivul lirc nu poate trimite, această operație eșuează cu eroarea ENOTTY.
Stabilește frecvența de modulație. Argumentul este frecvența (Hz).
Stabilește ciclul de funcționare al purtătoarei. val este un număr în intervalul [0,100] care descrie lățimea impulsului ca procent din ciclul total. În prezent, nu este definită nicio semnificație specială pentru 0 sau 100, dar valorile sunt rezervate pentru utilizare viitoare.
Unele dispozitive au temporizatoare interne care pot fi utilizate pentru a detecta absența activității IR pentru o perioadă lungă de timp. Acest lucru poate ajuta lircd(8) să detecteze că un semnal IR s-a terminat și poate accelera procesul de decodare. Aceste operații returnează valori întregi cu timpul de așteptare minim/maxim care poate fi definit (microsecunde). Unele dispozitive au un timp fix de așteptare. Pentru astfel de controlori, LIRC_GET_MIN_TIMEOUT și LIRC_GET_MAX_TIMEOUT vor eșua cu eroarea ENOTTY.
Stabilește valoarea întreagă pentru timpul de inactivitate IR (microsecunde). Pentru a fi acceptată, valoarea trebuie să fie în limitele definite de LIRC_GET_MIN_TIMEOUT și LIRC_GET_MAX_TIMEOUT. O valoare de 0 (dacă este acceptată de hardware) dezactivează toți timpii de așteptare hardware, iar datele trebuie raportate cât mai curând posibil. Dacă valoarea exactă nu poate fi definită, atunci trebuie definită următoarea valoare posibilă mai mare decât valoarea dată.
Returnează timpul de inactivitate curent (microsecunde). Disponibilă de la Linux 4.18.
Activează (val este 1) sau dezactivează (val este 0) pachetele de timp de așteptare în LIRC_MODE_MODE2. Comportamentul acestei operații a variat în funcție de versiunile nucleului:
Începând cu Linux 5.17: pachetele de timp de așteptare sunt întotdeauna activate, iar acest ioctl este un no-op.
Începând cu Linux 4.16: pachetele de timp de expirare sunt activate în mod implicit. De fiecare dată când dispozitivul lirc este deschis, operația LIRC_SET_REC_TIMEOUT poate fi utilizată pentru a dezactiva (și, dacă se dorește, pentru a reactiva ulterior) timpul de așteptare pe descriptorul de fișier.
În Linux 4.15 și versiunile anterioare: pachetele de timp de așteptare sunt dezactivate în mod implicit, iar activarea lor (prin LIRC_SET_REC_TIMEOUT) pe orice descriptor de fișier asociat cu dispozitivul lirc are ca efect activarea timpilor de așteptare pentru toate descriptoarele de fișier care se referă la acel dispozitiv (până când timpii de așteptare sunt dezactivați din nou).
Stabilește limita superioară a frecvenței purtătoare de recepție (Hz). A se vedea LIRC_SET_REC_CARRIER_RANGE.
Stabilește limita inferioară a frecvenței purtătoare de recepție (Hz). Pentru ca acest lucru să aibă efect, stabiliți mai întâi limita inferioară utilizând ioctl-ul LIRC_SET_REC_CARRIER_RANGE și apoi limita superioară utilizând ioctl-ul LIRC_SET_REC_CARRIER.
Activează (val este 1) sau dezactivează (val este 0) modul de măsurare. Dacă este activat, de la următoarea apăsare de tastă, controlorul va trimite pachete LIRC_MODE2_FREQUENCY. În mod implicit, acesta ar trebui să fie dezactivat.
Returnează rezoluția controlorului (microsecunde).
Activează setul de transmițătoare specificate în val, care conține o mască de biți în care fiecare transmițător activat este un 1. Primul transmițător este codificat de bitul cel mai puțin semnificativ și așa mai departe. Atunci când este dată o mască de biți nevalidă, de exemplu un bit este activat chiar dacă dispozitivul nu are atât de multe transmițătoare, această operație returnează numărul de transmițătoare disponibile și nu face nimic în caz contrar.
Unele dispozitive sunt echipate cu un receptor special de bandă largă care este destinat a fi utilizat pentru a învăța ieșirea unei telecomenzi existente. Acest ioctl poate fi utilizat pentru a activa (val egal cu 1) sau dezactiva (val egal cu 0) această funcționalitate. Acest lucru ar putea fi util pentru dispozitivele care, altfel, au receptoare cu bandă îngustă care le împiedică să fie utilizate cu anumite telecomenzi. De asemenea, receptoarele cu bandă largă pot fi mai precise. Pe de altă parte, dezavantajul lor este, de obicei, gama redusă de recepție.
Notă: receptorul de bandă largă poate fi activat implicit dacă activați rapoartele purtătoarei. În acest caz, acesta va fi dezactivat de îndată ce dezactivați rapoartele purtătoarei. Încercarea de a dezactiva un receptor de bandă largă în timp ce rapoartele purtătoarei sunt active nu va avea niciun efect.

ioctl-ul LIRC_GET_FEATURES returnează o mască de biți care descrie caracteristicile controlorului. Următorii biți pot fi returnați în mască:

Controlorul este capabil să recepționeze utilizând LIRC_MODE_MODE2.
Controlorul este capabil să recepționeze folosind LIRC_MODE_SCANCODE.
Controlorul acceptă schimbarea frecvenței de modulare utilizând LIRC_SET_SEND_CARRIER.
Controlorul acceptă modificarea ciclului de funcționare utilizând LIRC_SET_SEND_DUTY_CYCLE.
Controlorul acceptă schimbarea emițătorului (emițătoarelor) activ(e) utilizând LIRC_SET_TRANSMITTER_MASK.
Controlorul acceptă stabilirea frecvenței purtătoare de recepție utilizând LIRC_SET_REC_CARRIER. Orice dispozitiv lirc de la fuzionarea controlorilor în Linux 2.6.36 trebuie să aibă activată funcția LIRC_CAN_SET_REC_CARRIER_RANGE dacă este activată funcția LIRC_CAN_SET_REC_CARRIER.
Controlorul acceptă LIRC_SET_REC_CARRIER_RANGE. Limita inferioară a purtătoarei trebuie mai întâi stabilită utilizând ioctl-ul LIRC_SET_REC_CARRIER_RANGE, înainte de a utiliza ioctl-ul LIRC_SET_REC_CARRIER pentru a stabili limita superioară.
Controlorul acceptă LIRC_GET_REC_RESOLUTION.
Controlorul acceptă LIRC_SET_REC_TIMEOUT.
Controlorul acceptă măsurarea frecvenței de modulație utilizând LIRC_SET_MEASURE_CARRIER_MODE.
Controlorul acceptă modul de învățare utilizând LIRC_SET_WIDEBAND_RECEIVER.
Controlorul acceptă trimiterea folosind LIRC_MODE_PULSE sau LIRC_MODE_SCANCODE

Utilizarea acestor dispozitive necesită fișierul de antet al sursei nucleului lirc.h. Acest fișier nu este disponibil înainte de Linux 4.6. Utilizatorii de nuclee mai vechi ar putea folosi fișierul inclus în http://www.lirc.org.

ir-ctl(1), lircd(8), bpf(2)

https://www.kernel.org/doc/html/latest/userspace-api/media/rc/lirc-dev.html

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

1 septembrie 2024 Pagini de manual de Linux 6.12