Condividi tramite


Accesso usermode a GPIO, I2C e SPI

Windows 10 contiene nuove API per l'accesso a GPIO, I2C, SPI e UART direttamente da usermode. Le piattaforme di sviluppo come Raspberry Pi 2 espongono un sottoinsieme di queste connessioni che consentono agli utenti di estendere un modulo di calcolo di base con circuiti personalizzati per soddisfare i requisiti di un'applicazione specifica. Questi bus di basso livello sono in genere condivisi con altre funzioni di onboarding critiche, con solo un subset di pin GPIO e bus esposti sulle intestazioni. Per preservare la stabilità del sistema, è necessario specificare quali pin e bus possono essere modificati in sicurezza dalle applicazioni in modalità utente.

L'accesso di usermode agli autobus di basso livello in Windows viene scaricato attraverso i framework e SpbCx esistentiGpioClx. Un nuovo driver denominato RhProxy, disponibile in Windows IoT Core e Windows Enterprise, espone GpioClx e SpbCx risorse alla modalità utente. Per abilitare le API, è necessario dichiarare un nodo del dispositivo per rhproxy nelle tabelle ACPI con ognuna delle risorse GPIO e SPB che devono essere esposte in modalità utente.

Altre informazioni dettagliate sull'accesso a UserMode tramite RhProxy sono disponibili qui.

Provider di bus

A partire da Windows 10, Windows ha avuto API UWP in box che forniscono l'accesso diretto a bus Gpio, Spi o I2c che si trovano in soc. Ciò consente un accesso molto semplice a questo hardware da un'API di alto livello. Tuttavia, ci sono molte volte quando un produttore di dispositivi vuole usare un controller off-soc per accedere a un bus. Può essere semplice come un chip economico che aggiunge 16 pin GPIO o ricco come un MCU completo (come arduino) che non solo aggiunge pin Gpio, SPI e I2C, ma supporta anche PWM e ADC. Con il modello "Provider bus", gli sviluppatori possono accedere a questi bus off-soc usando le API in-box usando un provider in modalità utente che consente di colmare il divario.

Qualcuno che crea un provider implementa un set di interfacce in una libreria di classi UWP e quindi qualsiasi sviluppatore che vuole parlare con tale hardware include semplicemente il componente e indica le API in box su di esso. Se si esamina il codice di esempio del provider Remote Arduino , è possibile vedere come è facile configurare il provider e, una volta impostato come provider predefinito per tale app, il resto del codice nell'app client è identico al codice necessario per accedere a un bus on-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);`

Provider disponibili

Attualmente sono disponibili diversi provider nel repository github dei provider di bus . Oltre al codice per il provider, ogni provider ha una soluzione VS di esempio che illustra come un client userebbe tale provider.

  • ADC

    • Ads1x15
    • Mcp3008
    • Arduino remoto
  • PWM

    • PCA9685
    • Simulato con Gpio
    • Arduino remoto
  • Gpio, SPI, I2C

    • Arduino remoto

Oltre ai provider che consentono di accedere all'hardware reale, è stato creato un provider simulato che fungerà come se fosse un provider in grado infinito ed è progettato per scrivere ed eseguire il debug delle applicazioni senza dover prima distribuirli in un dispositivo funzionante. Per un'esperienza più ricca, è possibile personalizzarla per simulare l'hardware effettivo. Ad esempio, l'aggiornamento del provider I2c per restituire il risultato "75" quando si invia il comando per una lettura della temperatura in un dispositivo con l'indirizzo secondario designato.

Risorse aggiuntive

Sono disponibili qui altri strumenti di bus, codici di esempio e test su I2C, SPI, GPIO, MinComm/UART.

Fare riferimento alle API Windows Runtime (WinRT) e ecco come sfruttare le API dalle applicazioni Win32.