Differenze tra le versioni di "Emulare in Gambas le macro IOC, IOR, IOW e IOWR usate con la funzione ioctl()"

Da Gambas-it.org - Wikipedia.
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
 
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>&#91;[[#Note|nota 1]]&#93;</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>&#91;[[#Note|nota 1]]&#93;</sup>
  
Di seguito verranno mostrate le mmodalità per emulare in Gambas tali macro.
+
====Il terzo parametro====
 +
Il terzo parametro può richiedere un valore.
 +
<BR>Talvolta può trovarsi una simile semplice dichiarazione come la seguente: ''int'' .
 +
<BR>In tal caso in Gambas va così interpretata: <FONT Color=green>SizeOf(gb.Integer)</font>.
  
 +
 +
==Le Mcro e le modalità per emularle in Gambas==
 +
Di seguito verranno mostrati le varie ''Macro'' e le rispettive modalità per essere emulate in Gambas.
  
 
===Macro _IOC===
 
===Macro _IOC===
Riga 29: Riga 35:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ris As Long
 
   Dim ris As Long
Riga 39: Riga 45:
 
   Print ris
 
   Print ris
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function _IOC(iocread As Long, type As Long, nr As Long, size As Long) As Long
+
  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)
 
   Return Shl(iocread, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
    
 
    
  '''End'''
+
  End
  
  
Riga 65: Riga 71:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ris As Long
 
   Dim ris As Long
Riga 75: Riga 81:
 
   Print ris
 
   Print ris
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function _IOR(type As Long, nr As Long, size As Long) As Long
+
  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)
 
   Return Shl(_IOC_READ, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
    
 
    
  '''End'''
+
  End
  
  
Riga 88: Riga 94:
 
La macro
 
La macro
 
  _IOW(int type, int number, data_type)
 
  _IOW(int type, int number, data_type)
è utilizzata con la funzione ''ioctl( )'' per scrivere ''sizeof(data_type)'' byte-dati nel driver del dispositivo.
+
è utilizzata con la funzione esterna "ioctl()" per scrivere ''sizeof(data_type)'' byte-dati nel driver del dispositivo.
 +
 
 +
Il primo parametro è il valore numerico di un carattere ASCII.
  
 
In Gambas si potrà emulare come segue:
 
In Gambas si potrà emulare come segue:
Riga 101: Riga 109:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ris As Long
 
   Dim ris As Long
Riga 111: Riga 119:
 
   Print ris
 
   Print ris
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function _IOW(type As Long, nr As Long, size As Long) As Long
+
  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)
 
   Return Shl(_IOC_WRITE, _IOC_DIRSHIFT) Or Shl(type, _IOC_TYPESHIFT) Or Shl(nr, _IOC_NRSHIFT) Or Shl(size, _IOC_SIZESHIFT)
 
    
 
    
  '''End'''
+
  End
  
  
Riga 139: Riga 147:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim ris As Long
 
   Dim ris As Long
Riga 149: Riga 157:
 
   Print ris
 
   Print ris
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function _IOWR(type As Long, nr As Long, size As Long) As Long
+
  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)
 
   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'''
+
  End
  
  

Versione attuale delle 08:26, 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

Il terzo parametro può richiedere un valore.
Talvolta può trovarsi una simile semplice dichiarazione come la seguente: int .
In tal caso in Gambas va così interpretata: SizeOf(gb.Integer).


Le Mcro e le modalità per emularle in Gambas

Di seguito verranno mostrati le varie Macro e le rispettive modalità per essere emulate in Gambas.

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.

Il primo parametro è il valore numerico di un carattere ASCII.

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


Riferimenti