Compartilhar via


Transações de Custom-Transmit serCx2

Algum hardware do controlador serial pode implementar um mecanismo de transferência de dados diferente de PIO ou DMA do sistema para gravar dados em um controlador serial. Um driver de controlador serial pode dar suporte a transações de transmissão personalizada para disponibilizar esse mecanismo de transferência de dados para ser usado pelo SerCx2.

Para iniciar uma transação de transmissão personalizada, o SerCx2 chama a função de retorno de chamada de evento EvtSerCx2CustomTransmitTransactionStart do driver e fornece como parâmetros a solicitação de gravação (IRP_MJ_WRITE) e uma descrição do buffer de gravação para a transação. Nessa chamada, a função inicia a transação e retorna. Em seguida, o driver é responsável por concluir a transação e concluir a solicitação de gravação.

Criando o objeto de transmissão personalizada

Antes que o SerCx2 possa chamar qualquer uma das funções EvtSerCx2CustomTransmitTransactionXxx** do driver, o driver deve chamar o método SerCx2CustomTransmitTransactionCreate para registrar essas funções com SerCx2. Esse método aceita, como parâmetro de entrada, um ponteiro para uma estrutura SERCX2_CUSTOM_TRANSMIT_TRANSACTION_CONFIG que contém ponteiros para as funções EvtSerCx2CustomTransmitTransactionXxx** do driver.

O driver deve implementar a seguinte função:

Como opção, o driver pode implementar uma ou ambas as seguintes funções:

O método SerCx2CustomTransmitTransactionCreate cria um objeto de transmissão personalizada e fornece ao driver de chamada um identificador SERCX2CUSTOMTRANSMITTRANSACTION para esse objeto. As funções EvtSerCx2CustomTransmitTransactionXxx** do driver assumem esse identificador como seu primeiro parâmetro. Os seguintes métodos SerCx2 assumem esse identificador como seu primeiro parâmetro:

Inicialização de hardware e limpo-up

Alguns drivers de controlador serial podem precisar inicializar o hardware do controlador serial no início de uma transação de transmissão personalizada ou para limpo o estado de hardware do controlador serial no final da transação.

Se um driver implementar uma função de retorno de chamada de evento EvtSerCx2CustomTransmitTransactionInitialize , o SerCx2 chamará essa função para inicializar o controlador serial antes de iniciar a transação. Se implementada, a função EvtSerCx2CustomTransmitTransactionInitialize deverá chamar o método SerCx2CustomTransmitTransactionInitializeComplete para informar o SerCx2 quando o driver terminar de inicializar o controlador serial.

Se o driver implementar uma função de retorno de chamada de evento EvtSerCx2CustomTransmitTransactionCleanup, o SerCx2 chamará essa função para limpo o estado do hardware após o término da transação. Se implementada, a função EvtSerCx2CustomTransmitTransactionInitialize deverá chamar o método SerCx2CustomTransmitTransactionCleanupComplete para informar o SerCx2 quando o driver terminar de limpar o controlador serial.

Acessando o objeto de solicitação

Para iniciar uma transação de transmissão personalizada, o SerCx2 chama a função EvtSerCx2CustomTransmitTransactionStart do driver e passa a solicitação de gravação associada (encapsulada em um identificador de objeto WDFREQUEST) para essa função como um parâmetro. O driver é responsável por chamar um método como WdfRequestComplete para concluir essa solicitação quando a transação for concluída. A menos que a solicitação possa ser concluída imediatamente, antes que a função EvtSerCx2CustomTransmitTransactionStart retorne, o driver deve chamar um método como WdfRequestMarkCancelableEx para marcar a solicitação como cancelável.

O driver do controlador serial não deve usar um método como WdfRequestRetrieveInputBuffer para acessar o buffer de dados na solicitação de gravação. Em vez disso, o driver deve usar os valores de parâmetro Mdl, Offset e Length passados para a função EvtSerCx2CustomTransmitTransactionStart para acessar esse buffer.

Durante uma transação de transmissão personalizada, talvez o driver precise armazenar informações sobre a transação em um contexto anexado ao objeto de solicitação. Nesse caso, a função de retorno de chamada de evento EvtDriverDeviceAdd do driver pode chamar o método WdfDeviceInitSetRequestAttributes para definir os atributos a serem usados para objetos de solicitação. Esses atributos incluem o nome e o tamanho da alocação a serem usados para contextos de solicitação. Os atributos de solicitação especificados nessa chamada devem corresponder aos atributos de solicitação especificados pelo driver na chamada para o método SerCx2InitializeDevice . Esses atributos são especificados no membro RequestAttributes da estrutura SERCX2_CONFIG que o driver passa para SerCx2InitializeDevice. Para obter mais informações, consulte SERCX2_CONFIG.

Para uma solicitação de gravação que o driver do controlador serial recebe no início de uma transação de transmissão personalizada, o contexto de solicitação alocado pela estrutura do driver não é inicializado. O driver deve, como prática recomendada, chamar a rotina RtlZeroMemory para inicializar esse contexto de solicitação para todos os zeros.