PDA

View Full Version : Driver in linux


homer87
08-01-2006, 11:21
Avrei intenzioni (sempre conscio delle mie modeste capacità) di creare un driver per il pinguino di questa periferica:

http://www.adstech.com/products/USBAV_701/specifications/usb701specs.asp?pid=USBAV701

Magari avreste un volume in cui sono indicati i passaggi e le librerie indicate da utilizzare nel pingux?

Le specifiche visto che non sono fornite -.- sto cercando di fare un reverse dei driver proprietari... Se riesco a cavare un ragno dal buco... :mc:

Consigli please???

VICIUS
08-01-2006, 12:09
Qui c'è un libro gratuito in pdf che spiega le basi. http://lwn.net/Kernel/LDD3/ Per il resto non posso che augurarti un bel in bocca al lupo. :)

ciao ;)

homer87
08-01-2006, 12:15
Ok, ti ringrazio!!! :D

ilsensine
09-01-2006, 09:34
Ti consiglio prima di esercitarti con il protocollo del paperweight (ammesso che riesci a farne reverse engeenering), puoi farlo in userspace tramite le libusb. E' molto più semplice che farlo nel kernel.

Se poi nel frattempo riesco a trovare tempo e voglia per completare il mio bridge user space -> char device (che tengo nel cassetto da tempo immemore), puoi realizzare il driver completamente in userspace.

homer87
09-01-2006, 13:58
Ok ti ringrazio, io intanto vedo se riesco a ricavare qualcosa con il reverse.
Se mi potresti consigliare qualche dritta anche per quest'utimo, (anche perchè sui driver non ho esperienza, ad esempio i decompilatori come funzionerebbero???) te ne sarei infinitamente grato. :)

ilsensine
09-01-2006, 14:34
Non tentare di decompilare il driver, è una follia. Invece, dovrebbe esserci in giro qualche tool per sniffare il traffico usb, per windows.
Ti avverto, è un lavoraccio.

homer87
10-01-2006, 16:05
Allora, oggi ho avuto un po' di tempo e ho fatto un po' di sniffing.... :sofico:

In 2356 pacchetti solo all'avvio e quindi (in conseguenti 23 mega di log da polparmi) sono riuscito a rilevare dei pacchetti che dovrebbero essere abbastanza importanti, e li ho classificati in questo modo:

I pacchetti di inizializzazione:
2266 in totale.
Ma che si possono riassiumere in 5 pacchetti fondamentali:

Seq: 6 Dir : in down End Point : n/a Time: 0.469 Function:GET_DESCRIPTOR_FROM_DEVICE Data: /*Campo Vuoto */ Result: /* Campo Vuoto */
URB Header (length: 80)
SequenceNumber: 6
Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)

------------------------------------------------------------

Seq: 6 Dir : in up End Point : n/a Time: 0.469 Function:CONTROL_TRANSFER Data: 04 03 Result: 0x00000000

URB Header (length: 80)
SequenceNumber: 6
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 834d3480

SetupPacket:
0000: 80 06 00 03 09 04 02 00
bmRequestType: 80
DIR: Device-To-Host
TYPE: Standard
RECIPIENT: Device
bRequest: 06
GET_DESCRIPTOR
Descriptor Type: 0x0003
STRING


TransferBuffer: 0x00000002 (2) length
0000: 04 03

------------------------------------------------------------

Seq: 8 Dir : ??? up End Point : n/a Time: 0.594 Function:SELECT_CONFIGURATION Data: /*Campo vuoto */Result: 0x00000000


URB Header (length: 120)
SequenceNumber: 8
Function: 0000 (SELECT_CONFIGURATION)
Configuration Descriptor:
bLength: 9 (0x09)
bDescriptorType: 2 (0x02)
wTotalLength: 46 (0x002e)
bNumInterfaces: 1 (0x01)
bConfigurationValue: 1 (0x01)
iConfiguration: 0 (0x00)
bmAttributes: 192 (0xc0)
0x80: Bus Powered
0x40: Self Powered
MaxPower: 50 (0x32)
(in 2 mA units, therefore 100 mA power consumption)

Number of interfaces: 1
Interface[0]:
Length: 0x0060
InterfaceNumber: 0x00
AlternateSetting: 0x00
Class = 0xff
SubClass = 0x00
Protocol = 0x00
InterfaceHandle = 0x83409130
NumberOfPipes = 0x00000004
Pipe[0]:
MaximumPacketSize = 0x0200
EndpointAddress = 0x02
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x8340914c
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Pipe[1]:
MaximumPacketSize = 0x0200
EndpointAddress = 0x04
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x8340916c
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Pipe[2]:
MaximumPacketSize = 0x0200
EndpointAddress = 0x86
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x8340918c
MaxTransferSize = 0x00001000
PipeFlags = 0x00
Pipe[3]:
MaximumPacketSize = 0x0200
EndpointAddress = 0x88
Interval = 0x00
PipeType = 0x02
UsbdPipeTypeBulk
PipeHandle = 0x834091ac
MaxTransferSize = 0x00001000
PipeFlags = 0x00

-----------------------------------------------------------
Seq: 9 Dir : out down End Point : 0x00 Time: 0.594 Function:VENDOR_DEVICE Data: 01 Result: /*Campo vuoto */

URB Header (length: 80)
SequenceNumber: 9
Function: 0017 (VENDOR_DEVICE)
PipeHandle: 00000000

SetupPacket:
0000: 00 a0 00 e6 00 00 00 00
bmRequestType: 00
DIR: Host-To-Device
TYPE: Standard
RECIPIENT: Device
bRequest: a0
unknown!


TransferBuffer: 0x00000001 (1) length
0000: 01

-----------------------------------------------------------
Seq: 9 Dir : out up End Point : n/a Time: 0.594 Function:CONTROL_TRANSFER Data: - Result:0x00000000]



URB Header (length: 80)
SequenceNumber: 9
Function: 0008 (CONTROL_TRANSFER)
PipeHandle: 834d3480

SetupPacket:
0000: 40 a0 00 e6 00 00 01 00
bmRequestType: 40
DIR: Host-To-Device
TYPE: Vendor
RECIPIENT: Device
bRequest: a0


No TransferBuffer


L'unica differenza con il trasferimento dati vero e proprio riguarda questo pacchetto:


Seq: 3127 Dir : in down End Point : 0x86 Time: 2726.092Function:BULK_OR_INTERRUPT_TRANSFER Data: - Result: /*Campo Vuoto*/

URB Header (length: 72)
SequenceNumber: 3127
Function: 0009 (BULK_OR_INTERRUPT_TRANSFER)
TransferFlags: 0x00000003

No TransferBuffer

-----------------------------------------------------------
Qui avviene il trasferimento dati vero e proprio:

Seq: 3127 Dir : in up End Point : 0x86 Time: 2726.198Function:BULK_OR_INTERRUPT_TRANSFER Data: 00 00 ba 01 00 44 51 7e - Result:0x00000000


URB Header (length: 72)
SequenceNumber: 3127
Function: 0009 (BULK_OR_INTERRUPT_TRANSFER)
TransferFlags: 0x00000003

TransferBuffer: 0x00001000 (4096) length
0000: 00 00 ba 01 00 44 51 7e 01 5c 89 01 f8 c3 00 00
0010: e0 01 ec 07 00 80 ae 00 15 46 ea c9 93 58 cc 44
0020: b8 21 40 19 89 04 7b 00 2f 03 90 ff 62 68 c9 e0
0030: e0 ff 12 3d ea a4 10 06 61 01 11 5f a5 f2 fc 80
0040: 46 e1 f3 2c 54 40 9c 75 48 04 ce 8c d1 3c 32 34
0050: 19 44 06 40 1f 07 20 ff c5 d0 52 ce f3 87 99 07
0060: c3 9d 73 d8 39 35 60 8c 2d 8c af d4 0a ce 8d 0f
0070: c7 71 85 87 42 73 ee 3b 29 3b 91 ab 98 04 ee 71
0080: 36 a5 16 ca 19 aa 34 38 fc ff 9f 0c 03 ff ff 7f
0090: 00 9d 8f 0d ac 0e 6c f0 18 00 00 1c 61 06 98 0b
00a0: fd 03 8b 85 cd 1c be b8 80 b7 c1 3d 5c 44 a0 40
00b0: b7 16 c7 1f 9c ab 1e e1 04 59 e0 48 39 e6 39 6c
00c0: 44 e8 37 68 fc 7f d4 01 f5 01 5e 0c 4f 10 4e 1c
00d0: 85 65 80 8e 59 3f 3f 18 00 9f 06 7a 94 99 74 b1...




Scusate per la lunghezza del post, ma a quanto ho (tentato) di capire, all'inizio fa solo dei controlli sulla connessione(velocità ecc..) e sul dispositivo (spento acceso, modello e produttore) ma quali azz di dati bisogna tenere in seria considerazione?? :fagiano:

ilsensine
10-01-2006, 16:30
Quelle "function" sono l'incapsulamento standard e le funzioni di controllo e configurazione di base del protocollo usb; niente di misterioso. Nota che già capire come funziona il rpotocollo usb è complicato. Tu sai benissimo come funziona, vero? ;)


Scusate per la lunghezza del post, ma a quanto ho (tentato) di capire, all'inizio fa solo dei controlli sulla connessione(velocità ecc..) e sul dispositivo (spento acceso, modello e produttore) ma quali azz di dati bisogna tenere in seria considerazione?? :fagiano:
Una volta imparato a masticare i princìpi del protocollo usb -- hai presente quelle interminabili sequenze di byte scritte in esadecimale, senza alcun significato apparente? :sofico:

homer87
10-01-2006, 18:11
Quelle "function" sono l'incapsulamento standard e le funzioni di controllo e configurazione di base del protocollo usb; niente di misterioso. Nota che già capire come funziona il rpotocollo usb è complicato.


Appunto io mi riferivo proprio a quelle. Sono da considerarsi universali o valide solo sui S.O. win? Se utilizzo la libusb una buona parte del lavoro non dovrebbe essere già fatto??


Tu sai benissimo come funziona, vero? ;)

Sapessi, come lo vorrei sapere!!! :D


Una volta imparato a masticare i princìpi del protocollo usb -- hai presente quelle interminabili sequenze di byte scritte in esadecimale, senza alcun significato apparente? :sofico:


TransferBuffer: 0x00001000 (4096) length
0000: 00 00 ba 01 00 44 51 7e 01 5c 89 01 f8 c3 00 00
0010: e0 01 ec 07 00 80 ae 00 15 46 ea c9 93 58 cc 44
0020: b8 21 40 19 89 04 7b 00 2f 03 90 ff 62 68 c9 e0
0030: e0 ff 12 3d ea a4 10 06 61 01 11 5f a5 f2 fc 80
0040: 46 e1 f3 2c 54 40 9c 75 48 04 ce 8c d1 3c 32 34
0050: 19 44 06 40 1f 07 20 ff c5 d0 52 ce f3 87 99 07
0060: c3 9d 73 d8 39 35 60 8c 2d 8c af d4 0a ce 8d 0f
0070: c7 71 85 87 42 73 ee 3b 29 3b 91 ab 98 04 ee 71
0080: 36 a5 16 ca 19 aa 34 38 fc ff 9f 0c 03 ff ff 7f
0090: 00 9d 8f 0d ac 0e 6c f0 18 00 00 1c 61 06 98 0b
00a0: fd 03 8b 85 cd 1c be b8 80 b7 c1 3d 5c 44 a0 40
00b0: b7 16 c7 1f 9c ab 1e e1 04 59 e0 48 39 e6 39 6c
00c0: 44 e8 37 68 fc 7f d4 01 f5 01 5e 0c 4f 10 4e 1c
00d0: 85 65 80 8e 59 3f 3f 18 00 9f 06 7a 94 99 74 b1...

Ti riferisci a queste?
Ma questi sono i dati che vengono trasferiti durante la trasmissione (o almeno credo).
Io infatti ho abbreviato tutto (ho messo i tre puntini) altrimenti usciva qualcosa di enorme.

Secondo me, per implementare qualcosa e nella funzione "SELECT_CONFIGURATION" che dovremmo dare una bella occhiata, casomai vedo mi meglio il protocolla usb e poi ti faccio sapere.

Inoltre Leggendomi qualche guida su qualche sito son riuscito a capire :read: che per implementare una semplice "function" come la definisci tu in downstream è possibile utilizzare la funzione usb_control_msg della libusb ma non ho idea che valori metterci -_- .

Tu qualche hai info sul protocollo usb o altro? :D

Ah quante domande, vado a magnà qualcosa!!! :O

ilsensine
11-01-2006, 09:54
Ti dico quel poco che so sul protocollo.

I device usb sono organizzati secondo gerarchie, questo forse lo sai. La gestione dell'albero dei dispositivi è demandata all'hardware e ai driver dei bridge; non devi occuparti di questi dettagli. Le libusb ti consentono di "sfogliare" l'albero alla ricerca del device che ti interessa.

Un device è destritto da alcune informazioni standard, quali il vendorId:deviceId, la classe, ecc. Esistono classi standard di device, quali "usb mass storage" oppure "usb serial converter". Queste classi utilizzano lo stesso protocollo (o con piccole variazioni), quindi puoi gestire tutti i device di una classe con lo stesso driver. Il tuo dispositivo probabilmente utilizza un protocollo proprietario.

La comunicazione con un device passa tramite diversi "pipe" logici di comunicazione. Puoi pensare a un singolo pipe come a un canale seriale, monodirezionale. Ogni pipe è detto anche "endpoint" (ep). Gli ep (tranne lo 0, v. sotto) sono in genere configurabili dal driver; il tuo controllo è (fortunatamente!) in genere abbastanza limitato, puoi al massimo selezionare un tipo di configurazione oppure una alternativa.
Oltre che dalla direzione (in oppure out), un ep è descritto dalla dimensione in byte dei singoli pacchetti, e dal tipo:
- canale di controllo
E' generalmente associato convenzionalmente all'ep0. Serve per inviare comandi di configurazione al device. Alcuni comandi sono standard nel protocollo usb; altri possono essere specifici del vendor.
- canale interrupt
Canale ad alta priorità per trasferire piccole quantità di dati. Serve in genere per comunicare eventi importanti.
- canale bulk
Pipe di comunicazione affidabile per i dati. Viene usato ad es. dagli storage device per trasmettere o ricevere i dati dei settori. Il canale bulk viene usato quando i dati da trasmettere non devono essere persi.
- canale isochronous (iso)
Simile al canale bulk, ma senza l'affidabilità. Viene utilizzato quando i dati da trasmettere possono essere persi se la banda non è sufficiente (ad es. webcam, o dispositivi di acquisizione in genere). Puoi fare una analogia tra il canale bulk e un socket tcp, e tra il canale iso e un socket udp, per renderti una idea.

Un device definisce un certo numero di ep, tipicamente 6-8. Consente, come ho accennato, di scegliere anche configurazioni alternative. Queste informazioni possono essere consultate tra le caratteristiche del dispositivo, tramite le libusb.

Quindi, per iniziare, ti consiglio di sniffare il traffico iniziale con il dispositivo, che probabilmente passa per il canale di controllo, e cercare di capire cosa viene fatto.

Ti consiglio inoltre di fare un pò di pratica con le libusb, in rete trovi un pò di codice di esempio. Utilizza la versione devel in cvs, in quanto non credo che quella ufficiale gestisca i canali interrupt. Per gestire il canale iso, nel caso il tuo device lo usi, potrebbe essere necessaria una patch esterna.
E iscriviti alla loro mailing list, possono aiutarti ;)

homer87
11-01-2006, 18:35
Il tuo dispositivo probabilmente utilizza un protocollo proprietario.
Si infatti, il driver non è WDM ma può essere utilizzato solo con la loro applicazione o VideoStudio opprtunamente modificato.

Ok grazie mille delle informazioni, vedrò ciò che riesco a fare. :)