Partager via


Accès usermode à GPIO, I2C et SPI

Windows 10 contient de nouvelles API pour accéder à GPIO, I2C, SPI et UART directement à partir du mode utilisateur. Les cartes de développement comme Raspberry Pi 2 exposent un sous-ensemble de ces connexions, qui permettent aux utilisateurs d’étendre un module de calcul de base avec des circuits personnalisés pour l’adressage d’une application donnée. Ces bus de bas niveau sont généralement partagés avec d’autres fonctions d’intégration critiques, avec uniquement un sous-ensemble de broches GPIO et d’autobus exposés sur les en-têtes. Pour préserver la stabilité du système, il est nécessaire de spécifier les broches et les bus qui peuvent être modifiés en toute sécurité par les applications en mode utilisateur.

L’accès usermode aux bus de bas niveau sur Windows est plombé par les infrastructures existantesGpioClx.SpbCx Un nouveau pilote appelé RhProxy, disponible sur Windows IoT Core et Windows Enterprise, expose et SpbCx ressources GpioClx au mode utilisateur. Pour activer les API, vous devez avoir déclaré un nœud d’appareil pour rhproxy dans vos tables ACPI avec chacune des ressources GPIO et SPB qui doivent être exposées au mode utilisateur.

Vous trouverez ici une documentation détaillée sur l’accès UserMode via RhProxy.

Fournisseurs de bus

À compter de Windows 10, Windows a eu des API UWP en boîte qui fournissent un accès direct aux bus Gpio, Spi ou I2c situés sur soc. Cela offre un accès très facile à ce matériel à partir d’une API de haut niveau. Toutefois, il existe de nombreuses fois lorsqu’un fabricant d’appareils souhaite utiliser un contrôleur off-soc pour accéder à un bus. Il peut être aussi simple qu’une puce bon marché qui ajoute 16 broches GPIO, ou aussi riche qu’un MCU complet (comme un Arduino) qui ajoute non seulement des broches Gpio, SPI et I2C, mais également prend en charge PWM et ADC. Avec le modèle « Fournisseur de bus », nous proposons aux développeurs la possibilité d’accéder à ces bus off-soc à l’aide des API in-box, à l’aide d’un fournisseur en mode utilisateur qui ponte l’écart.

Quelqu’un qui crée un fournisseur implémente un ensemble d’interfaces dans une bibliothèque de classes UWP, puis tous les développeurs qui souhaitent parler à ce matériel incluent simplement le composant et indiquent aux API intégrées à son sujet. Si vous examinez l’exemple de code du fournisseur Remote Arduino , vous pouvez voir comment il est facile de configurer le fournisseur et, une fois défini comme fournisseur par défaut pour cette application, le reste du code de l’application cliente est identique au code requis pour accéder à un bus 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);`

Fournisseurs disponibles

Nous disposons actuellement d’un certain nombre de fournisseurs disponibles sur le dépôt github des fournisseurs de bus . Outre le code du fournisseur, chaque fournisseur dispose d’un exemple de solution VS qui montre comment un client utiliserait ce fournisseur.

  • ADC

    • Ads1x15
    • Mcp3008
    • Arduino distant
  • PWM

    • PCA9685
    • Simulé avec Gpio
    • Arduino distant
  • Gpio, SPI, I2C

    • Arduino distant

En plus des fournisseurs qui vous donnent accès à du matériel réel, nous avons créé un fournisseur simulé qui agit comme s’il s’agissait d’un fournisseur capable à l’infini et qui est conçu pour vous permettre d’écrire et de déboguer vos applications sans avoir à les déployer d’abord sur un appareil de travail. Pour une expérience plus riche, vous pouvez la personnaliser pour simuler votre matériel réel. Par exemple : mise à jour du fournisseur I2c pour renvoyer le résultat « 75 » lorsque vous l’envoyez pour une lecture de température sur un appareil avec l’adresse secondaire désignée.

Ressources supplémentaires

Des outils de bus supplémentaires, des exemples de codes et des tests sur I2C, SPI, GPIO, MinComm/UART sont disponibles ici.

Reportez-vous aux API Windows Runtime (WinRT) et voici comment tirer parti des API à partir d’applications Win32.