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:
- LIRC_MODE2_SPACE
- Valoarea reflectă o durată a spațiului
(microsecunde).
- LIRC_MODE2_PULSE
- Valoarea reflectă durata unui impuls (microsecunde).
- LIRC_MODE2_FREQUENCY
- Valoarea reflectă o frecvență (Hz); consultați
ioctl-ul LIRC_SET_MEASURE_CARRIER_MODE.
- LIRC_MODE2_TIMEOUT
- Valoarea reflectă o durată a spațiului
(microsecunde). Pachetul reflectă un timp de așteptare;
consultați ioctl-ul LIRC_SET_REC_TIMEOUT_REPORTS.
- LIRC_MODE2_OVERFLOW
- 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:
- LIRC_GET_FEATURES
(void)
- 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.
- LIRC_GET_REC_MODE
(void)
- 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:
- LIRC_MODE_MODE2
- Controlorul returnează o secvență de durate ale
impulsurilor/spațiilor.
- LIRC_MODE_SCANCODE
- Controlorul returnează valorile structurii lirc_scancode,
fiecare dintre acestea reprezentând o apăsare de buton
decodificată.
- LIRC_SET_REC_MODE
(int)
- 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.
- LIRC_GET_SEND_MODE
(void)
- 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.
- LIRC_SET_SEND_MODE
(int)
- 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.
- LIRC_SET_SEND_CARRIER
(int)
- Stabilește frecvența de modulație. Argumentul este
frecvența (Hz).
- LIRC_SET_SEND_DUTY_CYCLE
(int)
- 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.
- LIRC_GET_MIN_TIMEOUT(void)
- LIRC_GET_MAX_TIMEOUT(void)
- 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.
- LIRC_SET_REC_TIMEOUT
(int)
- 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ă.
- LIRC_GET_REC_TIMEOUT
(void)
- Returnează timpul de inactivitate curent (microsecunde).
Disponibilă de la Linux 4.18.
- LIRC_SET_REC_TIMEOUT_REPORTS
(int)
- 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).
- LIRC_SET_REC_CARRIER
(int)
- Stabilește limita superioară a frecvenței
purtătoare de recepție (Hz). A se vedea
LIRC_SET_REC_CARRIER_RANGE.
- LIRC_SET_REC_CARRIER_RANGE
(int)
- 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.
- LIRC_SET_MEASURE_CARRIER_MODE
(int)
- 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.
- LIRC_GET_REC_RESOLUTION
(void)
- Returnează rezoluția controlorului (microsecunde).
- LIRC_SET_TRANSMITTER_MASK
(int)
- 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.
- LIRC_SET_WIDEBAND_RECEIVER
(int)
- 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ă:
- LIRC_CAN_REC_MODE2
- Controlorul este capabil să recepționeze utilizând
LIRC_MODE_MODE2.
- LIRC_CAN_REC_SCANCODE
- Controlorul este capabil să recepționeze folosind
LIRC_MODE_SCANCODE.
- LIRC_CAN_SET_SEND_CARRIER
- Controlorul acceptă schimbarea frecvenței de modulare
utilizând LIRC_SET_SEND_CARRIER.
- LIRC_CAN_SET_SEND_DUTY_CYCLE
- Controlorul acceptă modificarea ciclului de funcționare
utilizând LIRC_SET_SEND_DUTY_CYCLE.
- LIRC_CAN_SET_TRANSMITTER_MASK
- Controlorul acceptă schimbarea emițătorului
(emițătoarelor) activ(e) utilizând
LIRC_SET_TRANSMITTER_MASK.
- LIRC_CAN_SET_REC_CARRIER
- 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.
- LIRC_CAN_SET_REC_CARRIER_RANGE
- 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ă.
- LIRC_CAN_GET_REC_RESOLUTION
- Controlorul acceptă LIRC_GET_REC_RESOLUTION.
- LIRC_CAN_SET_REC_TIMEOUT
- Controlorul acceptă LIRC_SET_REC_TIMEOUT.
- LIRC_CAN_MEASURE_CARRIER
- Controlorul acceptă măsurarea frecvenței de
modulație utilizând
LIRC_SET_MEASURE_CARRIER_MODE.
- LIRC_CAN_USE_WIDEBAND_RECEIVER
- Controlorul acceptă modul de învățare
utilizând LIRC_SET_WIDEBAND_RECEIVER.
- LIRC_CAN_SEND_PULSE
- 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.
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.