Share via


GPIO、I2C、SPI へのユーザーモード アクセス

Windows 10 には、GPIO、I2C、SPI、UART にユーザー モードから直接アクセスするための新しい API が含まれています。 Raspberry Pi 2 のような開発ボードは、特定のアプリケーションに対処するためにユーザーがカスタム回路を使って基本計算モジュールを拡張できるようにする、これらの接続のサブセットを公開しています。 これらの低レベルのバスは、通常、ヘッダーで公開されている GPIO ピンとバスのサブセットのみを使用して、他の重要なオンボード機能と共有されます。 システムの安定性を維持するために、どのピンとバスの変更が安全かをユーザー モード アプリケーションで指定する必要があります。

Windows の低レベル バスへのユーザーモード アクセスは、既存の GpioClx および SpbCx フレームワークを介して組み込まれます。 Windows 10 IoT Core と Windows Enterprise で使用可能な RhProxy という新しいドライバーでは、GpioClx および SpbCx リソースがユーザーモードに公開されています。 API を有効にするには、ユーザー モードに公開する GPIO リソースと SPB リソースのそれぞれで、ACPI テーブル内で rhproxy 用のデバイス ノードが宣言されている必要があります。

RhProxy 経由のユーザーモード アクセスに関する詳細なドキュメントについては、こちらをご覧ください。

バス プロバイダー

Windows 10 以降の Windows には、SoC に配置された GPIO、SPI、または I2C バスへの直接アクセスを提供するインボックス UWP API が用意されています。これにより、高レベルの API からこのハードウェアに非常に簡単にアクセスできます。 ただし、デバイス メーカーがオフ SoC コントローラーを使用してバスにアクセスする必要がある場合も少なくありません。 これは、16 個の GPIO ピンを追加した安価なチップと同じくらいシンプルな場合もあれば、GPIO、SPI、I2C ピンを追加するだけでなく、PWM と ADC もサポートする (Arduino のような) 完全な MCU と同じくらい高機能な場合もあります。 "バス プロバイダー" モデルでは、開発者がこのギャップを埋めるユーザーモード プロバイダーを使用することで、インボックス API を使用してこれらのオフ SoC バスにアクセスできるようになります。

プロバイダーをビルドするユーザーは、UWP クラス ライブラリに一連のインターフェイスを実装します。その後、そのハードウェアと通信する必要がある開発者は、コンポーネントを組み込み、その情報をインボックス API に伝えるだけで済みます。 Remote Arduino プロバイダーのサンプル コードを見ると、プロバイダーの構成がいかに簡単であるかが分かります。また、そのアプリの既定のプロバイダーとして設定した後、クライアント アプリの残りのコードは、オン 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);`

利用可能なプロバイダー

現在、バス プロバイダーの GitHub リポジトリでいくつかのプロバイダーが利用可能になっています。 各プロバイダーには、プロバイダーのコードに加えて、クライアントでそのプロバイダーを使用する方法を示すサンプル VS ソリューションがあります。

  • ADC

    • Ads1x15
    • Mcp3008
    • Remote Arduino
  • PWM

    • PCA9685
    • GPIO でシミュレート
    • Remote Arduino
  • GPIO、SPI、I2C

    • Remote Arduino

実際のハードウェアへのアクセスを提供するプロバイダーに加えて、シミュレートされたプロバイダーをビルドしました。これは、機能的な制限がないプロバイダーのように動作し、あらかじめ機能するデバイスにデプロイしなくても、アプリケーションを作成してデバッグできるように設計されています。 より優れたエクスペリエンスを提供するため、実際のハードウェアをシミュレートするようにカスタマイズできます。 たとえば、指定されたセカンダリ アドレスを持つデバイスの温度読み取り用のコマンドが送信されたときに結果 "75" を返すように I2C プロバイダーを更新します。

その他のリソース

その他のバス ツール、サンプル コード、および I2C、SPI、GPIO、MinComm/UART でのビルドとテストについては、こちらを参照ください。

Windows ランタイム (WinRT) API を参照してください。また、Win32 アプリケーションから API を活用する方法をご確認ください。