Compartilhar via


Acesso usermode ao GPIO, I2C e SPI

O Windows 10 contém novas APIs para acessar GPIO, I2C, SPI e UART diretamente no modo do usuário. Placas de desenvolvimento como Raspberry Pi 2 expõem uma sub-rede dessas conexões, o que permite que os usuários estendam um módulo de computação base com circuitos personalizados para endereçar um aplicativo específico. Esses barramentos de baixo nível geralmente são compartilhados com outras funções de integração críticas, com apenas um subconjunto de pinos e barramentos GPIO expostos em cabeçalhos. Para preservar a estabilidade do sistema, é necessário especificar quais pinos e barramentos são seguros para modificação por aplicativos de modo do usuário.

O acesso usermode a barramentos de baixo nível no Windows é inserido nas estruturas e SpbCx existentesGpioClx. Um novo driver chamado RhProxy, disponível no Windows IoT Core e no Windows Enterprise, expõe GpioClx e SpbCx recursos ao usermode. Para habilitar as APIs, um nó de dispositivo para rhproxy deve ser declarado em suas tabelas ACPI com cada um dos recursos GPIO e SPB que devem ser expostos ao modo do usuário.

Documentação detalhada adicional sobre o acesso usermode via RhProxy pode ser encontrada aqui.

Provedores de barramento

A partir do Windows 10, o Windows tem APIs UWP in-box que fornecem acesso direto a barramentos Gpio, Spi ou I2c localizados no soc. Isso fornece acesso muito fácil a esse hardware de uma API de alto nível. No entanto, há muitas vezes em que um fabricante de dispositivos deseja usar um controlador off-soc para acessar um barramento. Pode ser tão simples quanto um chip barato que adiciona 16 pinos GPIO, ou tão rico quanto um MCU completo (como um Arduino) que não só adiciona pinos Gpio, SPI e I2C, mas também dá suporte a PWM e ADC. Com o modelo "Provedor de Barramento", damos aos desenvolvedores a capacidade de acessar esses barramentos off-soc usando as APIs in-box, usando um provedor de modo de usuário que faz a ponte entre as lacunas.

Alguém que cria um provedor implementa um conjunto de interfaces em uma biblioteca de classes UWP e, em seguida, qualquer desenvolvedor que queira falar com esse hardware simplesmente inclui o componente e informa as APIs in-box sobre ele. Se você examinar o código de exemplo do provedor Arduino Remoto , poderá ver como é fácil configurar o provedor e, uma vez definido como o provedor padrão para esse aplicativo, o restante do código no aplicativo cliente é idêntico ao código necessário para acessar um barramento no soc.

ArduinoProviders.ArduinoProvider.Configuration =
    new ArduinoProviders.ArduinoConnectionConfiguration("VID_2341", "PID_0043", 57600);
Windows.Devices.LowLevelDevicesController.DefaultProvider =  new ArduinoProviders.ArduinoProvider();

gpioController = await GpioController.GetDefaultAsync();
i2cController = await I2cController.GetDefaultAsync();
adcController = await AdcController.GetDefaultAsync();
pwmController = await PwmController.GetDefaultAsync();

GpioPin pin = gpioController.OpenPin(LED_PIN, GpioSharingMode.Exclusive);`

Provedores disponíveis

Atualmente, temos vários provedores disponíveis no repositório github de Provedores de Barramento . Além do código para o provedor, cada provedor tem uma solução VS de exemplo que demonstra como um cliente usaria esse provedor.

  • ADC

    • Ads1x15
    • Mcp3008
    • Arduino Remoto
  • PWM

    • PCA9685
    • Simulado com o Gpio
    • Arduino Remoto
  • Gpio, SPI, I2C

    • Arduino Remoto

Além dos provedores que lhe dão acesso ao hardware real, criamos um Provedor Simulado que atuará como se fosse um provedor infinitamente capaz e foi projetado para permitir que você escreva e depure seus aplicativos sem precisar implantá-los primeiro em um dispositivo de trabalho. Para uma experiência mais avançada, você pode personalizá-la para simular seu hardware real. Por exemplo: atualizando o provedor I2c para retornar o resultado "75" ao enviá-lo o comando para uma leitura de temperatura em um dispositivo com o endereço secundário designado.

Recursos adicionais

Ferramentas de barramento adicionais, códigos de exemplo e criação e teste em I2C, SPI, GPIO, MinComm/UART podem ser encontrados aqui.

Faça referência às APIs de Windows Runtime (WinRT) e veja como aproveitar as APIs de aplicativos Win32.