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