Configurazione del trasferimento isochronous per dispositivi IEEE 1394
Prima che i driver possano avviare il dispositivo, devono seguire questa procedura:
Passaggio 1. Scegliere la velocità di trasferimento.
Il bus IEEE 1394 può supportare diverse velocità, limitate da ciò che l'hardware consente. Anche se un dispositivo specifico supporta una certa velocità, può essere collegato a un altro dispositivo che supporta solo velocità inferiori. I driver devono determinare in fase di esecuzione la velocità di trasferimento tra il dispositivo e il computer. Esegue una query sul driver del bus con la richiesta di REQUEST_GET_SPEED_BETWEEN_DEVICES per determinare la velocità massima possibile tra due dispositivi sul bus o il dispositivo e il computer host.
Passaggio 2. Allocare la larghezza di banda.
Prima che si verifichi un trasferimento di dati isochronous, il driver deve riservare la larghezza di banda sul bus. Il bus tiene traccia della quantità di larghezza di banda allocata fino a raggiungere un importo fisso (secondo la specifica IEEEE 1394-1995, la larghezza di banda massima che può essere inviata è il 80% di un ciclo del bus, ovvero 125 nanosecondi); non consente quindi ad altri dispositivi di acquisire la larghezza di banda fino a quando non viene liberata una larghezza di banda attualmente allocata. Il driver invia la richiesta di REQUEST_ISOCH_ALLOCATE_BANDWIDTH al driver del bus per riservare la larghezza di banda.
Se la richiesta ha esito positivo, il driver del bus restituisce un handle di larghezza di banda. Il driver usa questo handle nelle richieste future relative alla larghezza di banda al driver del bus. Ad esempio, il driver può usare REQUEST_ISOCH_SET_CHANNEL_BANDWIDTH sull'handle per regolare la quantità di larghezza di banda allocata. Al termine del driver con la larghezza di banda allocata, deve usare REQUEST_ISOCH_FREE_BANDWIDTH per liberare la larghezza di banda, in modo che possa essere usata da altri dispositivi nel bus.
Se la richiesta ha esito negativo, il driver non deve tentare alcun trasferimento dei dati. I driver che non possono allocare la larghezza di banda potrebbero essere in grado di allocarlo nei tentativi successivi, quindi devono lasciarsi in uno stato in cui possono tentare di allocare la larghezza di banda in un secondo momento quando appropriato. I tentativi di allocare la larghezza di banda dopo la reimpostazione del bus potrebbero avere esito positivo, perché il sistema rilascia automaticamente tutta la larghezza di banda e i canali allocati in precedenza dopo la reimpostazione del bus.
I driver che hanno esito positivo nell'allocazione della larghezza di banda, devono riallocare la larghezza di banda e i canali dopo la reimpostazione del bus, per i motivi appena menzionati. Inoltre, dopo una reimpostazione, i handle di larghezza di banda diventano non aggiornati e devono essere liberati da una chiamata a REQUEST_ISOCH_FREE_BANDWIDTH, a meno che la larghezza di banda non sia stata allocata con il set di flag IRB_FLAG_ALLOW_REMOTE_FREE.
Passaggio 3. Allocare un canale.
Dopo aver completato una richiesta di allocazione della larghezza di banda, il driver richiede un canale isochronous su cui scrivere dati. Più dispositivi possono leggere pacchetti in un canale isochrono, ma solo un dispositivo può scrivere in un canale. I dispositivi che ricevono pacchetti isocroni non inviano pacchetti di riconoscimento in restituzione.
I driver richiedono un canale inviando la richiesta di REQUEST_ISOCH_ALLOCATE_CHANNEL al driver del bus. Il driver può richiedere un canale specifico o ISOCH_ANY_CHANNEL per allocare qualsiasi canale gratuito. In caso di esito positivo, il driver del bus restituisce il canale allocato. Se il driver del bus restituisce un codice di errore, i driver non devono tentare alcun trasferimento dei dati e devono deallocare la larghezza di banda allocata nel passaggio 2.
I driver non dovrebbero presupporre che perché un canale non è attualmente disponibile, non sarà mai disponibile. I canali possono diventare liberi in qualsiasi momento, quindi i driver devono lasciarsi in uno stato in cui possono tentare di allocare un canale in un secondo momento quando appropriato.
Passaggio 4. Allocare un handle di risorse.
Una volta allocato un canale, il driver alloca un handle di risorse per tale canale. In tutti i passaggi successivi, il driver usa l'handle di risorse per specificare il canale.
I driver allocano un handle di risorse per il canale inviando la richiesta di REQUEST_ISOCH_ALLOCATE_RESOURCES al driver del bus.
Quando il driver alloca un handle di risorse, specifica anche i flag che indicano come verranno usati i buffer collegati all'handle:
Se il driver userà il canale per leggere i dati da un dispositivo (un'operazione di REQUEST_ISOCH_LISTEN), imposta il flag di RESOURCE_USED_IN_LISTENING . Se il driver userà il canale per scrivere dati nel dispositivo (un'operazione di REQUEST_ISOCH_TALK), imposta il flag di RESOURCE_USED_IN_TALKING .
Il driver usa l'handle per fornire buffer di dati per la transazione. Per informazioni dettagliate, vedere Passaggio 5. Il driver del bus usa i buffer in ordine fino a quando non viene esaurito e quindi sospende l'operazione fino a quando il driver del dispositivo collega più buffer. Per informazioni dettagliate, vedere Buffering Isochronous DMA Transfer for IEEE 1394 Devices ( Trasferimento DMA isochronous per dispositivi IEEE 1394 ).
Il driver può specificare che l'operazione viene sincronizzata con un determinato valore dell'orologio del ciclo isochrono. Per informazioni dettagliate , vedere Opzioni di sincronizzazione Isochronous per dispositivi IEEE 1394 .
Il driver può impostare le opzioni per ascolti isochronous. Il driver può indicare se le intestazioni del pacchetto isochronos vengono rimosse dai pacchetti di dati. Il driver può anche indicare se l'arrivo dei dati deve essere copiato nel buffer di dati in attesa un pacchetto per buffer o se ogni buffer deve essere riempito con dati. Per informazioni dettagliate , vedere Opzioni di ascolto Isochronous per dispositivi IEEE 1394 .
Se questa richiesta ha esito negativo, i driver devono deallocare tutte le risorse isochrono assegnate nei passaggi precedenti.
Passaggio 5. Collegare i buffer all'handle di risorse.
Dopo aver allocato un handle di risorse, il driver collega i buffer all'handle. Il controller DMA host legge i dati dai dati o scrive i dati nei buffer collegati.
Con ogni buffer, il driver passa una struttura ISOCH_DESCRIPTOR che descrive come verrà usato il buffer. Nella struttura di ISOCH_DESCRIPTOR del buffer, il driver può specificare le informazioni seguenti:
Numero massimo di byte per fotogramma. Quando si trasmetteno dati, il controller host suddivide il buffer dei dati in pacchetti di queste dimensioni.
Routine di callback facoltativa. Il driver del bus chiama questa routine al termine dell'elaborazione
Opzioni di sincronizzazione. Per una descrizione delle opzioni di sincronizzazione, vedere Opzioni di sincronizzazione Isochronous per i dispositivi IEEE 1394 .
Nelle operazioni di talk isochronous, il driver può designare questo buffer come elenco di intestazioni da prependare ai pacchetti di dati successivi. Per informazioni dettagliate , vedere Opzioni di talk isochronous per dispositivi IEEE 1394 .
Una volta avviata l'operazione, il driver può scollegare i buffer che non è più necessario e può collegare buffer aggiuntivi. Il driver può usare la routine di callback identificata in ISOCH_DESCRIPTOR per segnalare se stesso quando il driver del bus ha completato l'elaborazione dell'ultimo buffer collegato. Per una descrizione del buffering dei dispositivi IEEE 1394 per dispositivi IEEE 1394, vedere Buffering Isochronous per dispositivi IEEE 1394 .
Passaggio 6. Avviare il trasferimento dei dati
Per leggere dal dispositivo, il driver genera la richiesta di REQUEST_ISOCH_LISTEN . Per scrivere nel dispositivo, il driver genera la richiesta di REQUEST_ISOCH_TALK . Il driver può quindi attivare il dispositivo per la lettura o la scrittura, in modo specifico del dispositivo appropriato.