Uso da interface de solicitação de E/S do SPB
A partir do Windows 8, a extensão de estrutura SPB (SpbCx) é um componente fornecido pelo sistema que oferece suporte à interface de solicitação de E/S do SPB. Os drivers de dispositivo periférico SPB usam essa interface para enviar solicitações de E/S para dispositivos conectados a I²C, SPI e outros barramentos periféricos simples (SPBs). Ao disponibilizar uma interface de solicitação de E/S padronizada em uma variedade de tipos de barramento, o SpbCx simplifica a tarefa de oferecer suporte a drivers para uma família de dispositivos periféricos em uma série de plataformas de hardware e controladores SPB de diferentes fornecedores de hardware.
Se as seguintes condições forem atendidas, o fornecedor de hardware de um dispositivo periférico conectado ao SPB poderá desenvolver um driver de dispositivo que possa funcionar em vários tipos de barramento:
- O dispositivo periférico deve ser compatível com hardware com esses barramentos.
- O driver pode usar os mesmos protocolos de controle de dispositivo em todos esses tipos de barramento.
Ao eliminar o código específico do barramento dos drivers periféricos, a extensão da estrutura SPB reduz o tempo de desenvolvimento desses drivers e garante um comportamento mais consistente entre os tipos de barramento compatíveis.
Os dispositivos periféricos conectados a SPBs não são associados à memória e os drivers desses dispositivos não podem acessar diretamente os registradores de hardware desses dispositivos. Em vez disso, um driver de dispositivo periférico SPB deve depender de um controlador SPB para transferir dados em série de e para o dispositivo. Para solicitar essa transferência, o driver deve enviar uma solicitação de E/S ao dispositivo. Essa solicitação de E/S é enviada a uma fila gerenciada pelo SpbCx.
O SpbCx coopera com um driver de controlador SPB para lidar com solicitações de E/S de drivers. O fornecedor de hardware do controlador SPB fornece o driver do controlador SPB para realizar tarefas específicas do hardware do controlador.
Somente drivers podem enviar solicitações de E/S à interface de solicitação de E/S de um controlador SPB. Os aplicativos não podem enviar solicitações de E/S diretamente a um controlador SPB. Em vez disso, um aplicativo pode enviar solicitações de E/S ao driver de um dispositivo periférico conectado ao SPB e, em seguida, confiar no driver para enviar ao controlador SPB todas as solicitações de E/S que possam ser necessárias para transferir dados de ou para o dispositivo.
Para que um driver possa enviar solicitações de E/S a um dispositivo periférico conectado ao SPB, ele precisa abrir uma conexão lógica com o dispositivo. Para abrir essa conexão, o driver usa o ID de conexão que recebeu como um recurso de hardware do gerenciador Plug and Play. Para obter mais informações, consulte IDs de conexão para dispositivos periféricos SPB.
O SpbCx e o driver do controlador SPB processam um conjunto solicitações de leitura e de gravação para dispositivos periféricos conectados ao SPB. Em resposta a uma solicitação IRP_MJ_READ, o controlador SPB transfere o número especificado de bytes de um dispositivo periférico para um buffer fornecido pelo driver. Em resposta a uma solicitação IRP_MJ_WRITE, o controlador SPB transfere o número especificado de bytes de um buffer fornecido pelo driver para um dispositivo periférico.
Para uma solicitação IRP_MJ_READ ou IRP_MJ_WRITE para transferir zero bytes, o SpbCx conclui a solicitação com um código de status STATUS_SUCCESS, mas não realiza nenhuma operação.
O SpbCx e o driver do controlador SPB também processam estes códigos de controle de E/S (IOCTLs) específicos do SPB:
Um driver periférico SPB usa esses IOCTLs para executar sequências de transferência de E/S. Sequência de transferência de E/S é um conjunto ordenado de transferências de barramento (operações de leitura e de gravação) executado como uma única operação de barramento atômico. Para obter mais informações sobre esses IOCTLs, consulte Sequências de transferência de E/S.
O driver de um controlador SPB específico pode oferecer suporte a IOCTLs personalizados que executam funções específicas de hardware. Esses são IOCTLs que o SpbCx não processa e para os quais o fornecedor de hardware do controlador SPB oferece suporte para o benefício dos drivers de dispositivo periférico SPB que precisam realizar operações específicas de hardware. Se um driver de dispositivo periférico SPB enviar um IOCTL que nem o SpbCx nem o driver do controlador SPB reconheçam, nenhuma operação será realizada e a solicitação de E/S será concluída com um valor de status de erro STATUS_NOT_SUPPORTED.
O driver de um dispositivo periférico conectado ao SPB normalmente é um driver UMDF (User-Mode Driver Framework) ou um driver KMDF (Kernel-Mode Driver Framework). Para enviar uma solicitação de leitura, gravação ou IOCTL a um dispositivo periférico conectado ao SPB, um driver UMDF chama um método, como IWDFIoRequest::Send. Um driver KMDF chama um método, como WdfIoTargetSendReadSynchronously, WdfIoTargetSendWriteSynchronously ou WdfIoTargetSendIoctlSynchronously.
Para ver exemplos de código que mostram como enviar solicitações de E/S a dispositivos periféricos conectados ao SPB, consulte estes tópicos:
Recursos de hardware para drivers periféricos SPB no modo de usuário
Recursos de hardware para drivers periféricos SPB no modo de kernel