Condividi tramite


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 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:

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.