Compartilhar via


Optimizing a USB Function Driver Stack

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Quando um driver cliente função USB emite um transferir, o driver cliente função USB passa um parâmetro personalizável para o driver cliente função USB PDD. O driver cliente função USB pode usar essa variável para operações intensa ou para otimizar sua pilha driver função USB. Usar este parâmetro pode forçar fazer hardware plataforma modificações específicas para seu driver cliente função USB. Depois de fazer essas modificações, seu driver cliente função USB só pode operar com o hardware plataforma específica USB função controlador driver PDD. Nenhum dos drivers USB função cliente fornecidos por Microsoft usar este parâmetro personalizável. Para obter mais informações, consulte o STransfer estrutura em % _WINCEROOT%\Public\Common\OAK\Inc\Usbfn.h.

Configurando transferências acesso direto à memória (DMA) entre um driver de cliente e um PDD

Quando o driver USB função cliente emite um transferir, o driver cliente pode transmitir endereços acesso direto à memória (DMA) o PDD. Isso pode permitir que o PDD para executar transferências acesso direto à memória (DMA) diretamente para o disco, instead of executar transferências acesso direto à memória (DMA) a memória e, em seguida, tendo o USB função cliente driver executar o acesso direto à memória (DMA) transferir para o disco após concluir a transferir.

Normalmente, o driver controlador USB função PDD pode implementar acesso direto à memória (DMA) usando um físico interno reserva. De exemplo, na maiúsculas e minúsculas de transferir uma out, o PDD pode acesso direto à memória (DMA) um ou mais pacotes USB para seu próprio físico reserva e, em seguida, use memcpy, Consulte Alphabetical Function Reference (CRT), para copiar os pacotes para reserva de cliente. Isso memcpy é adicional sobrecarga adicional e ele seria ideais para removê-lo.

Em ordem para remover esse memcpy, o driver cliente função USB e o driver controlador USB função PDD devem ambas ser modificados para permitir acesso direto à memória (DMA) diretamente a reserva de cliente.

O cliente deve criar sua usando reserva HalAllocateCommonBuffer. Ele obtém os parâmetros específicos de hardware para essa rotina por chamado para o MDD/PDD com IOCTL_UFN_GET_PDD_INFO. Se IOCTL_UFN_GET_PDD_INFO falhar, o PDD não suporte acesso direto à memória (DMA) diretamente para reserva de cliente e ele é melhor não usar HalAllocateCommonBuffer, pois HalAllocateCommonBuffer Sempre cria uma reserva uncached. Se o cliente está usando HalAllocateCommonBuffer, ele deve transmitir o físico endereço reserva in addition to seu correspondente endereço virtual para o lpIssueTransfer função.

O driver controlador USB função PDD deve implementar IOCTL_UFN_GET_PDD_INFO in UfnPdd_IOControl.

Se o driver cliente controlador USB função passa um físico endereço no seu chamar para lpIssueTransfer, o PDD irão vê-lo na dwBufferPhysicalAddress campo da STransfer estrutura passado para UfnPdd_IssueTransfer. Ele deve usar este contíguo físico reserva para acesso direto à memória (DMA).

O seguinte codificar amostras mostra como para verificar se o driver controlador USB função PDD pode identificador transfere acesso direto à memória (DMA).

HANDLE hBus = CreateBusAccessHandle(lpActiveRegPath); // path from driver's Init call

if (hBus == NULL) {
  //  fail somehow
}

UFN_PDD_INFO PddInfo;

BOOL fSuccess = BusIoControl(hBus, IOCTL_UFN_GET_PDD_INFO, 0, NULL, &PddInfo, sizeof(PddInfo), NULL, NULL);

if (!fSuccess) {
  //  PDD cannot do DMA directly to the client buffer
}

CloseBusAccessHandle(hBus);

See Also

Other Resources

USB Function Controller Driver Migration