Platform Abstraction Layer API を実装する

GitHub でソースを見る

OpenThread は、OS やプラットフォームに依存せず、狭い Platform Abstraction Layer(PAL)を備えています。この PAL では次のことを定義しています。

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

すべての API は、基盤となるハードウェア抽象化レイヤ(HAL)のビルド サポート パッケージ(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 ドライバをインストールする
  • 同じ関数のプロトタイプを使用して、UART API 実装を OpenThread 側の 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 ソースファイルに実装する必要があります。

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

その他/リセット

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 は、上位のレイヤに公開します。

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

プラットフォームの例のコア構成ファイルで 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 ライブラリ自体では呼び出されませんが、システム/RTO に役立つ可能性があります。このソースファイルに、他のモジュールの初期化(UART、Radio、ランダム、その他/リセットなど)を実装することもできます。

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