Differenze tra le versioni di "Emulare in Gambas le macro IOC, IOR, IOW e IOWR usate con la funzione ioctl()"
Riga 2: | Riga 2: | ||
Queste macro sono specificate nel file header "''/usr/include/asm-generic/ioctl.h'' ", e ciascuna di esse restituisce un valore da passare al 2° parametro della predetta funzione "ioctl()". <SUP>[[[#Note|nota 1]]]</sup> | Queste macro sono specificate nel file header "''/usr/include/asm-generic/ioctl.h'' ", e ciascuna di esse restituisce un valore da passare al 2° parametro della predetta funzione "ioctl()". <SUP>[[[#Note|nota 1]]]</sup> | ||
+ | <BR>Il terzo parametro può richiedere un valore. Talvolta può trovarsi una simile semplice dichiarazione: ''int'' . In tal caso in Gambas va così interpretata: <FONT Color=green>SizeOf(gb.Integer)</font>. | ||
Di seguito verranno mostrate le mmodalità per emulare in Gambas tali macro. | Di seguito verranno mostrate le mmodalità per emulare in Gambas tali macro. | ||
Riga 88: | Riga 89: | ||
La macro | La macro | ||
_IOW(int type, int number, data_type) | _IOW(int type, int number, data_type) | ||
− | è utilizzata con la funzione | + | è utilizzata con la funzione esterna "ioctl()" per scrivere ''sizeof(data_type)'' byte-dati nel driver del dispositivo. |
In Gambas si potrà emulare come segue: | In Gambas si potrà emulare come segue: |
Versione delle 06:43, 20 lug 2024
Le macro _IOC, _IOR, _IOW e _IOWR soono utilizzate nel linguaggio C per creare il numero del comando per la funzione "ioctl()".
Queste macro sono specificate nel file header "/usr/include/asm-generic/ioctl.h ", e ciascuna di esse restituisce un valore da passare al 2° parametro della predetta funzione "ioctl()". [nota 1]
Il terzo parametro può richiedere un valore. Talvolta può trovarsi una simile semplice dichiarazione: int . In tal caso in Gambas va così interpretata: SizeOf(gb.Integer).
Di seguito verranno mostrate le mmodalità per emulare in Gambas tali macro.
Macro _IOC
La macro
_IOC(dir, type, nr, size)
che sta a significare Input Output Control è costitutiva della definizione delle altre macro in questa pagina prese in esame.
In Gambas si potrà emulare come segue:
Shl((dir), _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) as Long
il parametro (dir), come espresso nel file header "/usr/include/asm-generic/ioctl.h", può essere a seconda della macro alla quale in quel particolare caso _IOC() appartiene, uno dei seguenti: _IOC_NONE, _IOC_READ, _IOC_WRITE, _IOC_READ Or _IOC_WRITE.
Esempio pratico:
Private Const _IOC_NRSHIFT As Integer = 0 Private Const _IOC_NRBITS As Integer = 8 Private _IOC_TYPESHIFT As Integer = _IOC_NRSHIFT + _IOC_NRBITS Private Const _IOC_TYPEBITS As Integer = 8 Private _IOC_SIZESHIFT As Integer = _IOC_TYPESHIFT + _IOC_TYPEBITS Private Const _IOC_SIZEBITS As Integer = 14 Private _IOC_DIRSHIFT As Integer = _IOC_SIZESHIFT + _IOC_SIZEBITS Private Const _IOC_READ As Long = 2 Public Sub Main() Dim ris As Long ' Impostiamo dei valori meramente esemplificativi: ris = _IOC(_IOC_READ, Asc("E"), &h06, 256) ' _IOC(dir,type,nr,size) ' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()": Print ris End Private Function _IOC(iocread As Long, type As Long, nr As Long, size As Long) As Long Return Shl(iocread, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) End
Macro _IOR
La macro
_IOR(int type, int number, data_type)
è utilizzata con la funzione ioctl( ) per leggere i dati dal driver del dispositivo. Il driver potrà restituire all'utente sizeof(data_type) byte.
In Gambas si potrà emulare come segue:
Shl(_IOC_READ, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long
Esempio pratico:
Private Const _IOC_NRSHIFT As Integer = 0 Private Const _IOC_TYPESHIFT As Integer = 8 Private Const _IOC_SIZESHIFT As Integer = 16 Private Const _IOC_DIRSHIFT As Integer = 30 Private Const _IOC_READ As Long = 2 Public Sub Main() Dim ris As Long ' Impostiamo dei valori meramente esemplificativi: ris = _IOR(Asc("|"), &01, 256) ' _IOR(type,nr,size) ' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()": Print ris End Private Function _IOR(type As Long, nr As Long, size As Long) As Long Return Shl(_IOC_READ, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) End
Macro _IOW
La macro
_IOW(int type, int number, data_type)
è utilizzata con la funzione esterna "ioctl()" per scrivere sizeof(data_type) byte-dati nel driver del dispositivo.
In Gambas si potrà emulare come segue:
Shl(_IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long
Esempio pratico:
Private Const _IOC_NRSHIFT As Integer = 0 Private Const _IOC_TYPESHIFT As Integer = 8 Private Const _IOC_SIZESHIFT As Integer = 16 Private Const _IOC_DIRSHIFT As Integer = 30 Private Const _IOC_WRITE As Long = 1 Public Sub Main() Dim ris As Long ' Impostiamo dei valori meramente esemplificativi: ris = _IOW(Asc("|"), &01, 256) ' _IOW(type,nr,size) ' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()": Print ris End Private Function _IOW(type As Long, nr As Long, size As Long) As Long Return Shl(_IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) End
Macro _IOWR
La macro
_IOWR(int type, int number, data_type)
è utilizzata con la funzione ioctl( ) per leggere e scrivere sizeof(data_type) byte-dati da/nel driver del dispositivo.
In Gambas si potrà emulare come segue:
Shl(_IOC_READ Or _IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) As Long
Esempio pratico:
Private Const _IOC_NRSHIFT As Integer = 0 Private Const _IOC_TYPESHIFT As Integer = 8 Private Const _IOC_SIZESHIFT As Integer = 16 Private Const _IOC_DIRSHIFT As Integer = 30 Private Const _IOC_WRITE As Long = 1 Private Const _IOC_READ As Long = 2 Public Sub Main() Dim ris As Long ' Impostiamo dei valori meramente esemplificativi: ris = _IOWR(Asc("|"), &01, 256) ' _IOWR(type,nr,size) ' Viene mostrato il valore esemplificativo che dovrebbe essere passato al 2° parametro della funzione "iocl()": Print ris End Private Function _IOWR(type As Long, nr As Long, size As Long) As Long Return Shl(_IOC_READ Or _IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT) End
Note
[1] Vedere anche la seguente pagina: Ioctl()