高度なアプリケーションで GPO を使用する

Azure Sphere では、GPO (汎用入出力) がサポートされています。 GPIOは、集積回路上のプログラミング可能なデジタルピンの一種です。 GPO には定義済みの機能がなく、アプリケーションによって動作をカスタマイズできます。 GPO の一般的な用途として、ハードウェア デバイスの状態の変更、LED の制御、スイッチの状態の読み取りなどがあります。

メモ

このトピックでは、高度なアプリケーションで GPO を使用する方法について説明します。 RTApps での GPIO の使用については、「リアルタイム対応アプリケーションで周辺機器を使用する」を参照してください。

Azure Sphere の高度なアプリケーションは、Applibs GPIO API を呼び出すことによって GPO と通信できます。 GPIO_HighLevelApp サンプルは、MT3620 デバイス上の GPO と通信する方法を示しています。

GPIO では、次の操作がサポートされています。

  • 読み取り入力
  • 出力を高または低に設定する
  • ポーリング/ソフトウェア割り込み

GPIO 要件

GPO と通信するアプリケーションには、GPIO の適切なヘッダー ファイルを含め、アプリケーション マニフェストに GPIO 設定を追加する必要があります。

すべてのアプリケーションで ターゲット ハードウェアを設定 し、対応するハードウェア定義ヘッダー ファイルを含める必要があります。

ヘッダー ファイル

 #include <applibs/gpio.h>
 #include "path-to-your-target-hardware.h"

"path-to-your-target-hardware.h" をハードウェアのヘッダー ファイルへのパスに置き換えます。

アプリケーション マニフェストの設定

アプリケーション マニフェストの GPIO 設定には、アプリケーションによってアクセスされる GPO が一覧表示されます。 一度に GPIO を使用できるアプリケーションは 1 つだけです。 これらの設定を構成するには、アプリケーション マニフェストに機能を追加 Gpio し、各 GPIO を機能に追加します。 Azure Sphere アプリケーション マニフェスト の詳細。

コードで、ハードウェア用に定義されている定数を使用して、GPO を識別します。 コンパイラは、アプリをビルドするときに、これらの値を生の値に変換します。

たとえば、 MT3620 参照開発ボード (RDB) を対象とし、3 つの GPO (1、8、12) を取得するアプリケーションのアプリケーション マニフェストからの抜粋を次に示します。

"Gpio": [ "$MT3620_RDB_HEADER1_PIN6_GPIO", "$MT3620_RDB_LED1_RED", "$MT3620_RDB_BUTTON_A" ]

次の抜粋は、 Avnet MT3620 Starter Kit を対象とするアプリケーションで同じ GPO を指定する方法を示しています。

"Gpio": [ "$AVNET_MT3620_SK_GPIO1", "$AVNET_MT3620_SK_USER_LED_RED", "$AVNET_MT3620_SK_USER_BUTTON_A" ]

入力として GPIO を開く

GPIO から読み取る必要があるが、それに書き込まない場合は、入力として開くことができます。 GPIO_OpenAsInputを呼び出して GPIO を開き、入力に設定します。 これにより、GPIO に対する操作のファイル記述子が取得されます。 入力に設定されている間は GPIO から読み取ることができますが、書き込みはできません。 GPIO が入力に設定されている場合は、出力に設定する前に 閉じる 必要があります。

出力として GPIO を開く

GPIO に書き込む必要がある場合は、出力として開く必要があります。 GPIO_OpenAsOutputを呼び出して GPIO を開き、出力に設定します。 これにより、GPIO に対する操作のファイル記述子が取得され、 出力モード初期値が設定されます。 GPIO が出力に設定されている場合は、それに書き込んでから読み取ることができます。 GPIO が出力に設定されている場合は、入力に設定する前に 閉じる 必要があります。

GPIO をポーリングする

GPIO が開いている場合は、ボタンを押すなどのイベントを監視できます。 そのためには、GPIO をポーリングするタイマーを設定する必要があります。 AZURE Sphere では GPO のハードウェア割り込みはサポートされていないため、ポーリングを使用する必要があります。 GPIO サンプルは、GPIO をポーリングする方法を示しています。

GPIO から読み取る

GPIO から読み取る場合は、 GPIO_GetValueを呼び出します。

GPIO への書き込み

GPIO に書き込むには、 GPIO_SetValueを呼び出します。

GPIO のドライブ強度を設定する

GPIO ピンのドライブ強度は、それを駆動するために使用される電流の量を指します。 通常、この量の現在の値は既定値に設定されます。 ただし、明るい LED やセンサーへの電力の増加など、一部のシナリオでは、ドライブの強度を特定の GPIO ピンにチューニングする必要があります。

ドライブの強度を設定するには、まず 、gpiopin_request 構造を使用して、1 つ以上の GPIO ピンのドライブ強度の構成を指定します。 次に、IOCTL 呼び出しでを渡 gpiopin_request して GPIO_SET_PIN_CONFIG_IOCTL します。

次のコード スニペットは、構造体の配列で指定されている 2 つの GPIO ピンのドライブ強度を設定する lineoffsets 方法を gpiopin_request 示しています。

//get chip file descriptor
int chipfd = __z_azsp_open("/dev/gpiochip0", O_CLOEXEC);

//set drive strength for the requested pins
struct gpiopin_request pinreq;
memset(&pinreq, 0, sizeof(pinreq));
pinreq.linecount = 2;
pinreq.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
pinreq.lineoffsets[1] = SAMPLE_RGBLED_RED;
pinreq.config_type = PIN_CONFIG_DRIVE_STRENGTH;
pinreq.config_arg = 16;

result = ioctl(chipfd, GPIO_SET_PIN_CONFIG_IOCTL, &pinreq);
if (result < 0) {
    close(chipfd);
    return -1;
}

//do other work like setting pins as output
struct gpiohandle_request request;
memset(&request, 0, sizeof(request));
request.flags = GPIOHANDLE_REQUEST_OUTPUT;
request.lines = 2;
request.lineoffsets[0] = SAMPLE_RGBLED_BLUE;
request.lineoffsets[1] = SAMPLE_RGBLED_RED;
request.default_values[0] = 1;
request.default_values[1] = 1;

result = ioctl(chipfd, GPIO_GET_LINEHANDLE_IOCTL, &request);
if (result < 0) {
    close(chipfd);
    return -1;
}

GPIO を閉じる

GPIO を閉じるには、POSIX 関数 close() を呼び出します。

MT3620 のサポート

MT3620 チップでサポートされている GPIO 機能は、 MT3620 のサポート状態に記載されています。 MT3620 開発ボードのユーザー ガイドでは、MT3620 RDB のピン レイアウトとピン機能について説明します。

Microsoft Azure Sphere SDK インストール ディレクトリの HardwareDefinitions フォルダーには、一般的な Azure Sphere 開発ボード、モジュール、チップの定義が含まれています。 これには、MT3620、MT3620 RDB、およびその他の MT3620 ハードウェアのマスター インターフェイスを定義するヘッダーファイルと JSON ファイルが含まれています。 HardwareDefinitions フォルダーの既定の場所は、 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows と /opt/azurespheresdk/HardwareDefinitions Linux 上にあります。