Download Documentazione del progetto

Transcript
CAPITOLO 6.
133
SCELTE DI IMPLEMENTAZIONE DEL SISTEMA
6.2.1 L'avvio del sistema
Come descritto con le sequenze presentate (cfr. 5.4) la fase di avvio è piuttosto semplice ed è portata avanti dai due oggetti principali sia lato host che
host/usb_module/thmx.c
gadget (implementati, rispettivamente, da
e
gad-
get/thmx_gadget.c ). Nel primo caso, la funzione thmx_probe() viene richiacore USB per l'avvio del driver USB, e questa alloca il contenitore
mata dal
di dati principale del sistema (la
struct thmx)
che contiene i puntatori a
tutte le altre strutture dati relative agli altri oggetti necessari all'esecuzione.
Tra i campi di questa struttura, viene allocata la coda di attesa
thmx.wait_queue
che viene utilizzata nel sistema per implementare degli
sleep basati su timeout (tramite la funzione
wait_event_interruptible_timeout()).
Questi sleep sono utilizzati per
eettuare una sincronizzazione sia quando l'host deve ricevere dati dal gadget (come si vede nella funzione
host/usb_module/thmx_usb.c :
thmx_usb_send_ra_req()
in
l'attesa qui permette di essere certi che questi
dati sono stati inviati) sia di inviare messaggi MIDI al livello applicativo (come in
call_vtm_conversion() dentro host/usb_module/thmx_aux_thread.c :
l'attesa permette di far sì che ALSA interpreti i messaggi come avvenuti in
momenti dierenti, mentre inviare un unico buer fa sì che i messaggi sono
interpretati come avvenuti nello stesso istante).
Per il resto, ogni oggetto
viene inizializzato con una sua funzione specica, allocando tutte le risorse
che gli sono necessarie come verrà spiegato in seguito.
Sul gadget, la situazione è molto simile:
caso, richiama la funzione
get/thmx_gadget.c ),
tenuti nella
gthmx_bind()
il sotto-sistema USB, in questo
dichiarata nel driver usb (
gad-
la quale si occupa di inizializzare tutti gli oggetti con-
struct thmx_gadget
richiamando le loro funzioni speciche.
6.2.2 La comunicazione USB
La comunicazione tra host e gadget tramite USB è stata implementata seguendo quanto già descritto in precedenza (cfr. 3.3.5 e 3.7.1). Per prima cosa
il gadget dichiara staticamente (nel le
gadget/thmx_gadget_usb.c )
tutti i
descrittori necessari a rispondere correttamente alle richieste dell'host. Tra
questi (cfr. 3.2) il device descriptor, il cong descriptor, l'interface descriptor,
i vari descrittori per gli endpoint e per le stringhe del le di congurazione.
Inoltre, per quanto riguarda gli endpoint, come descritto nella Sezione 3.2 lo
standard USB 2.0 richiede che, quando un dispositivo vuole presentarsi con
una congurazione High-Speed (cfr. 3.2), e questo è il caso del Thereminux,
deve comunque dichiarare anche i descrittori adatti per la comunicazione FullSpeed, per cui nel le
gadget/thmx_gadget_usb.c
troviamo le varie coppie di