Configurando a transferência isócrona para dispositivos IEEE 1394
Antes que os drivers possam iniciar o dispositivo, eles devem seguir estas etapas:
Etapa 1. Escolha a velocidade de transferência.
O barramento IEEE 1394 pode dar suporte a várias velocidades diferentes, limitadas pelo que o hardware permite. Mesmo que um dispositivo específico dê suporte a uma determinada velocidade, ele pode ser conectado a outro dispositivo que só dá suporte a velocidades mais baixas. Os drivers devem determinar em tempo de execução a velocidade de transferência entre o dispositivo e o computador. Eles consultam o motorista do ônibus com a solicitação REQUEST_GET_SPEED_BETWEEN_DEVICES para determinar a velocidade máxima possível entre dois dispositivos no ônibus ou o dispositivo e o computador host.
Etapa 2. Alocar largura de banda.
Antes que qualquer transferência de dados isócrona possa ocorrer, o motorista deve reservar largura de banda no ônibus. O barramento acompanha a quantidade de largura de banda alocada até atingir um valor fixo (de acordo com a especificação IEEEE 1394-1995, a largura de banda máxima que pode ser enviada é de 80% de uma ciclo de ônibus, que é de 125 nanossegundos); em seguida, ele não permite que nenhum outro dispositivo adquira largura de banda até que parte da largura de banda alocada no momento seja liberada. O motorista envia o REQUEST_ISOCH_ALLOCATE_BANDWIDTH solicitação ao motorista do ônibus para reservar largura de banda.
Se a solicitação for bem-sucedida, o motorista do ônibus retornará uma alça de largura de banda. O motorista usa esse identificador em solicitações futuras relacionadas à largura de banda para o motorista do ônibus. Por exemplo, o driver pode usar REQUEST_ISOCH_SET_CHANNEL_BANDWIDTH no identificador para ajustar a quantidade de largura de banda alocada. Quando o driver tiver terminado com a largura de banda alocada, ele deverá usar REQUEST_ISOCH_FREE_BANDWIDTH para liberar a largura de banda, para que ele possa ser usado por outros dispositivos no barramento.
Se a solicitação falhar, o driver não deverá tentar nenhuma transferência de dados. Os drivers que não alocarem largura de banda podem ser capazes de alocá-lo em tentativas subsequentes, portanto, eles devem deixar-se em um estado em que possam tentar alocar largura de banda mais tarde, quando apropriado. As tentativas de alocar largura de banda após uma redefinição de barramento provavelmente serão bem-sucedidas, pois o sistema libera automaticamente todos os canais e largura de banda alocados anteriormente após uma redefinição de barramento.
Os drivers que conseguem alocar largura de banda devem realocar sua largura de banda e canais após uma redefinição de barramento, pelos motivos mencionados. Além disso, após uma redefinição, os identificadores de largura de banda ficam obsoletos e devem ser liberados por uma chamada para REQUEST_ISOCH_FREE_BANDWIDTH, a menos que a largura de banda tenha sido alocada com o sinalizador IRB_FLAG_ALLOW_REMOTE_FREE definido.
Etapa 3. Alocar um canal.
Depois que uma solicitação de alocação de largura de banda for bem-sucedida, o driver solicitará um canal isócrono no qual gravar dados. Vários dispositivos podem ler pacotes em um canal isócrono, mas apenas um dispositivo pode gravar em um canal. Os dispositivos que recebem pacotes isócronos não enviam pacotes de confirmação em troca.
Os motoristas solicitam um canal enviando a solicitação REQUEST_ISOCH_ALLOCATE_CHANNEL para o motorista do ônibus. O driver pode solicitar um canal específico ou ISOCH_ANY_CHANNEL para alocar qualquer canal gratuito. Com êxito, o motorista do ônibus retorna o canal alocado. Se o motorista do ônibus retornar um código de erro, os drivers não deverão tentar nenhuma transferência de dados e devem desalocar a largura de banda alocada na Etapa 2.
Os drivers não devem assumir que, como um canal não está disponível no momento, ele nunca estará disponível. Os canais podem se tornar gratuitos a qualquer momento, portanto, os drivers devem deixar-se em um estado em que possam tentar alocar um canal mais tarde, quando apropriado.
Etapa 4. Alocar um identificador de recurso.
Depois que o driver aloca um canal, ele aloca um identificador de recurso para esse canal. Em todas as etapas subsequentes, o driver usa o identificador de recurso para especificar o canal.
Os motoristas alocam um identificador de recurso para o canal enviando a solicitação REQUEST_ISOCH_ALLOCATE_RESOURCES ao motorista do ônibus.
Quando o driver aloca um identificador de recurso, ele também especifica sinalizadores que indicam como os buffers anexados ao identificador serão usados:
Se o driver usar o canal para ler dados de um dispositivo (uma operação REQUEST_ISOCH_LISTEN ), ele definirá o sinalizador RESOURCE_USED_IN_LISTENING. Se o driver usar o canal para gravar dados no dispositivo (uma operação REQUEST_ISOCH_TALK ), ele definirá o sinalizador RESOURCE_USED_IN_TALKING.
O driver usa o identificador para fornecer buffers de dados para a transação. (Confira a Etapa 5 para obter detalhes.) O motorista do barramento usa os buffers na ordem até que ele seja executado e, em seguida, pausa a operação até que o driver do dispositivo anexe mais buffers. Consulte Buffering Isochronous DMA Transfers for IEEE 1394 Devices (Buffering Isochronous DMA Transfers for IEEE 1394 Devices ) para obter detalhes.
O driver pode especificar que a operação seja sincronizada com um determinado valor do relógio de ciclo isócrono. Consulte Opções de sincronização isocronas para dispositivos IEEE 1394 para obter detalhes.
O driver pode definir opções para escutas isocronas. O driver pode indicar se os cabeçalhos de pacote isocrono são retirados dos pacotes de dados. O driver também pode indicar se os dados que chegam devem ser copiados para os buffers de dados em espera um pacote por buffer ou se cada buffer deve ser preenchido com dados. Consulte Opções de escuta isocronas para dispositivos IEEE 1394 para obter detalhes.
Se essa solicitação falhar, os drivers deverão desalocar todos os recursos isocronos alocados nas etapas anteriores.
Etapa 5. Anexe buffers ao identificador de recurso.
Depois que o driver aloca um identificador de recurso, ele anexa buffers ao identificador. O controlador de DMA do host lerá dados ou gravará dados nos buffers anexados.
Com cada buffer, o driver passa uma estrutura ISOCH_DESCRIPTOR que descreve como o buffer será usado. Na estrutura ISOCH_DESCRIPTOR do buffer, o driver pode especificar as seguintes informações:
O número máximo de bytes por quadro. Ao transmitir dados, o controlador de host divide o buffer de dados em pacotes desse tamanho.
Uma rotina de retorno de chamada opcional. O motorista do ônibus chama essa rotina quando termina o processamento
Opções de sincronização. Consulte Opções de sincronização isocronas para dispositivos IEEE 1394 para obter uma descrição das opções de sincronização.
Em operações de conversa isocronas, o driver pode designar esse buffer como uma lista de cabeçalhos a serem anexados aos próximos pacotes de dados. Confira Opções de Conversa Isocrona para Dispositivos IEEE 1394 para obter detalhes.
Depois que a operação for iniciada, o driver poderá desanexar buffers que ele não precisa mais e pode anexar buffers adicionais. O motorista pode usar a rotina de retorno de chamada identificada em ISOCH_DESCRIPTOR para sinalizar a si mesmo quando o motorista do ônibus tiver concluído o processamento do último buffer anexado. Consulte Buffering Isochronous DMA Transfers for IEEE 1394 Devices for a description of DMA buffering for IEEE 1394 devices.
Etapa 6. Iniciar a transferência de dados
Para ler do dispositivo, o driver emite a solicitação REQUEST_ISOCH_LISTEN . Para gravar no dispositivo, o driver emite a solicitação REQUEST_ISOCH_TALK . Em seguida, o driver pode ativar o dispositivo para leitura ou gravação, da maneira apropriada específica do dispositivo.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de