Platform Abstraction Layer API を実装する

GitHub でソースを見る

OpenThread は OS とプラットフォームに依存せず、プラットフォーム抽象化レイヤ(PAL)が狭くなっています。この PAL では、次のことを定義します。

移植アーキテクチャ
  • アラーム付きフリーランニング タイマーのアラーム インターフェース
  • CLI メッセージと Spinel メッセージを通信するためのバス インターフェース(UART、SPI)
  • IEEE 802.15.4-2006 通信用の無線インターフェース
  • GCC 固有の初期化ルーチン
  • 真性乱数の生成のためのエントロピー
  • 揮発性のない構成ストレージの設定サービス
  • OpenThread ログ メッセージを配信するためのロギング インターフェース
  • システム固有の初期化ルーチン

すべての API は、基盤となる Hardware Abstraction Layer(HAL)Build Support Package(BSP)に基づいて実装する必要があります。

API ファイルは次のディレクトリに配置する必要があります。

タイプ ディレクトリ
プラットフォーム固有の PAL の実装 /openthread/examples/platforms/platform-name
ヘッダー ファイル - 不揮発性ストレージ API /openthread/examples/platforms/utils
その他のすべてのヘッダー ファイル /openthread/include/openthread/platform
HAL BSP /openthread/third_party/platform-name

アラーム

API 宣言:

/openthread/include/openthread/platform/alarm-milli.h

Alarm API は、上位レイヤのタイマー実装に基本的なタイミングとアラーム サービスを提供します。

アラーム サービスには、ミリ秒マイクロ秒の 2 種類があります。新しいハードウェア プラットフォームにはミリ秒が必要です。マイクロ秒は省略可能です。

UART

API 宣言:

/openthread/examples/platforms/utils/uart.h

UART API は、UART インターフェースを介して基本的なシリアルポート通信を実装します。

OpenThread の CLINCP アドオンは、ホスト側とやり取りするために UART インターフェースに依存しますが、UART API のサポートは省略可能です。ただし、新しいハードウェア プラットフォームの例でこれらのアドオンを使用する予定がない場合でも、次の理由からサポートを追加することを強くおすすめします。

  • CLI は、ポートが正しく機能することを検証するのに役立ちます。
  • Harness Automation Tool は、UART インターフェースを使用して、テストと認定のために OpenThread を制御します。

ターゲット ハードウェア プラットフォームが UART ではなく USB CDC モジュールをサポートしている場合は、次の点に注意してください。

  • ホスト側に適切な USB CDC ドライバをインストールする
  • 同じ関数プロトタイプを使用して、OpenThread 側で UART API 実装を USB CDC ドライバ(BSP とともに)に置き換えます。

ラジオ

API 宣言:

/openthread/include/openthread/platform/radio.h

Radio API は、上位の IEEE 802.15.4 MAC レイヤによって呼び出される必要な関数をすべて定義します。無線チップは、2.4 GHz IEEE 802.15.4-2006 仕様に完全に準拠している必要があります。

低電力機能が強化されているため、OpenThread では、すべてのプラットフォームでデフォルトで自動フレーム保留(間接送信)を実装する必要があります。また、送信元アドレス一致テーブルも radio.h ソースファイルに実装する必要があります。

ただし、新しいハードウェア プラットフォームの例でリソースが制限されている場合は、ソースアドレス テーブルを長さゼロとして定義できます。詳細については、Auto Frame Pending をご覧ください。

その他/リセット

API 宣言:

/openthread/include/openthread/platform/misc.h

Misc/Reset API には、チップ上のソフトウェアをリセットし、前回のリセットの理由をクエリするメソッドが用意されています。

エントロピー

API 宣言:

/openthread/include/openthread/platform/entropy.h

Entropy API は、上位レイヤに真の乱数生成ツール(TRNG)を提供します。これは、OpenThread ネットワーク全体のセキュリティ アセットの維持に使用されます。API は、関数呼び出しごとに新しい乱数が生成されるようにする必要があります。TRNG の影響を受けるセキュリティ アセットには、次のようなものがあります。

  • AES CCM ノンス
  • ランダムな遅延ジッター
  • デバイスの拡張アドレス
  • トリクル タイマーの初期ランダム期間
  • CoAP トークン/メッセージ ID

多くのプラットフォームでは、乱数生成ツールがすでに統合されており、BSP パッケージで API が公開されています。ターゲット ハードウェア プラットフォームが TRNG をサポートしていない場合は、ADC モジュール サンプリングを利用して固定長の乱数を生成することを検討してください。TRNG 要件(uint32_t)を満たすために必要な場合は、複数のイテレーションでサンプリングします。

マクロ MBEDTLS_ENTROPY_HARDWARE_ALT1 に設定されている場合、この API は mbedTLS ライブラリで使用されるハードウェア エントロピーを生成するメソッドも提供する必要があります。

不揮発性ストレージ

API 宣言:

/openthread/include/openthread/platform/flash.h

または

/openthread/include/openthread/platform/settings.h

不揮発性ストレージの要件は、上記の 2 つの API のいずれかを実装することで満たすことができます。Flash API はフラッシュ ストレージ ドライバを実装し、Settings API は基盤となるフラッシュ オペレーションの実装機能を上位レイヤに提供します。

これらの API は、上位レイヤに公開されます。

  • アプリケーション データ(アクティブ/保留中の運用データセット、現在のネットワーク パラメータ、リセット後の再接続用のスレッドデバイスの認証情報など)の保存に使用できる不揮発性ストレージのサイズ
  • フラッシュ ステータスの読み取り、書き込み、消去、クエリ オペレーション

プラットフォームの例のコア構成ファイルで OPENTHREAD_CONFIG_PLATFORM_FLASH_API_ENABLE を使用して、プラットフォームで使用する API を指定します。1 に設定する場合は、Flash API を実装する必要があります。それ以外の場合は、Settings API を実装する必要があります。

このフラグは /openthread/examples/platforms/platform-name/openthread-core-platform-name-config.h ファイルで設定する必要があります。

ロギング

API 宣言:

/openthread/include/openthread/platform/logging.h

Logging API は、OpenThread のロギング機能とデバッグ機能を実装し、複数レベルのデバッグ出力を利用できます。新しいハードウェア プラットフォームの例で OpenThread のロギングを使用する予定がない場合は、この API は省略可能です。

最も詳細なレベルは OPENTHREAD_LOG_LEVEL_DEBG です。このレベルでは、すべての未加工パケット情報が出力され、シリアル ポートまたはターミナルにログが記録されます。ニーズに最適なデバッグレベルを選択します。

システム固有

API 宣言:

/openthread/examples/platforms/openthread-system.h

システム固有の API は、主に選択したハードウェア プラットフォームの初期化と初期化解除のオペレーションを提供します。この API は OpenThread ライブラリ自体からは呼び出されませんが、システムや RTOS には役立つ場合があります。このソースファイルで、他のモジュール(UART、無線、乱数、その他/リセットなど)の初期化を実装することもできます。

この API の実装はユースケースによって異なります。生成された CLI アプリケーションと NCP アプリケーションサンプル プラットフォームで使用する場合は、この API を実装する必要があります。それ以外の場合は、任意の API を実装して、サンプル プラットフォーム ドライバをシステム/RTOS に統合できます。