wolfBoot ユーザマニュアル
v1.2

目次
更新履歴 ..................................................................................................................................................... 41.

はじめに ................................................................................................................... 5

1.1

wolfBoot の概要 ...................................................................................................... 5

1.2

wolfBoot の特長 ...................................................................................................... 5

1.3

wolfBoot のコンポーネント .......................................................................................... 5

1.4

wolfBoot ブートローダー ............................................................................................ 72.

既存プロジェクトへの wolfBoot の統合 ............................................................................ 82.1 手順 ......................................................................................................................... 8
2.2 使用例 ...................................................................................................................... 8
2.3 ファームウェアの 更 新 .................................................................................................. 93.

ファームウェアイメージ ................................................................................................ 10

3.1 ファームウェア・エントリポイント .................................................................................... 103.2 ファームウェア・イメージヘッダー ................................................................................... 103.3 イメージヘッダー：タグ ................................................................................................. 113.3 イメージ署名 ツール ................................................................................................... 123.4 ファームウェアイメージの 格 納 ....................................................................................... 124.

フラッシュ・パ ーティション ............................................................................................ 134.1 ファームメモリーの パ ーティション ................................................................................... 134.２ブートローダー・パ ーティション ....................................................................................... 144.3 ブート・パーティション .................................................................................................. 144.4 アップデート・パーティション ......................................................................................... 144.5 例：STM32-F407 の場合の 512KB パーティション .......................................................... 144.6 パーティション状態とセクターフラグ ............................................................................... 154.7 FLASH パーティションの概要 ...................................................................................... 175 ファームウェアの 更 新 ................................................................................................... 185.1 ファームウェア更 新 の 手 順 ........................................................................................... 19© 2004 – 2019 wolfSSL Inc.
2

6.

HAL (ハードウェア抽象化層 ) ...................................................................................... 21

7.

ブートローダーとの通信 API ........................................................................................ 24© 2004 – 2019 wolfSSL Inc.

3

更新履歴	  v1.0 (2018-12-04)
v1.1 (2019-02-19) 使用画像を翻訳版へ差し替え。脱字修正。
v1.2 (2019-03-11) 1.3 wolfBoot のコンポーネントに図追加	  © 2004 – 2019 wolfSSL Inc.

4

1. はじめに
1.1 wolfBoot の概要
このユーザマニュアルはwolfBoot組み込みライブラリのテクニカルガイドです。wolfBootは組み込みシステムのためのセキュアブートローダー機能を提供します。

wolfBootは32ビットマイクロコントローラ用の移植性があり、OSによらない、安全なブートローダーソリューションです。ファームウェア認証のためにwolfCryptを利用し、ファームウェアアップデートのメカニズムを提供します。

最小限に設計されたブートローダーと小さなHAL APIにより、wolfBootはどのOSや非RTOSアプリケーションからも完全に独立しており、安全なファームウェアアップデートのメカニズムを提供するために、既存の組込みソフトウェアプロジェクトに容易に移植、統合することができます。

1.2 wolfBoot の特長
wolfBootの特長は以下のようにまとめることができます。

-

フラッシュデバイスのマルチスロットパーティショニング-

ファームウェアイメージの整合性検証-

wolfCryptのデジタル署名アルゴリズム（DSA）を使ったファームウェアイメージの信頼性検証-

異なるベンダー/ MCU間での移植性を容易にするための、最小のハードウェア抽象化層（HAL）インターフェース-

確実なファームウェア更新操作を実現するための、セカンダリスロットからプライマリスロットにイメージをコピー/スワップ-

プライマリスロットのままでのファームウェアイメージのインプレースチェーンロード

1.3 wolfBoot のコンポーネント
wolfBoot には次のコンポーネントが含まれています。

1.

wolfBootブートローダー

2.

Ed25519鍵生成とファームウェアイメージへの署名ツール© 2004 – 2019 wolfSSL Inc.

5

3.

ベアメタルテストアプリケーション

下図に示すように、これらのコンポーネントとユーザのファームウェア開発環境を組み合わせることで、製品にセキュアなブートローダーを組み込むことができます。

© 2004 – 2019 wolfSSL Inc.

6

1.4 wolfBoot ブートローダー
woldBootは、動的なメモリ割り当てメカニズムや標準Cライブラリへのリンケージがない、汎用のマイクロコントローラ上で動作するように設計された、メモリに依存しないスタンドアローンのベアメタルアプリケーションです。

ブートローダーは以下のコンポーネントで構成されています。

-

ブートイメージのEd25519署名を検証するために使用されるwolfCrypt-

サポートされているターゲット用に実装された、最小のハードウェア抽象化層。特定のMCUのIAPフラッシュアクセスとクロック設定を実現します。

-

コアとなるブートローダー-

ブートローダー src/libwolfboot.c と対話するためにアプリケーションから使用される小さなアプリ
ケーションライブラリ

現段階では、ARM Cortex-Mブートメカニズムのみがサポートされています。より多くのアーキテクチ
ャとマイクロコントローラのサポートが順次追加される予定です。必要に応じて、割り込みベクタの再配置を無効にすることができます。

© 2004 – 2019 wolfSSL Inc.

7

2.

既存プロジェクトへの wolfBoot の統合

2.1 手順
既存プロジェクトにwolfBootを統合するためには、以下の手順で行います。

-

ターゲットプラットフォーム用のHAL実装を準備します（ハードウェア抽象化層を参照）。

-

フラッシュパーティション戦略を決定し、それに応じてinclude / target.hを変更します（フラッシュパーティションを参照）。

-

ブートローダーの存在を考慮してファームウェアイメージのエントリポイントを変更します。

-

ブートローダーと対話するためにwolfBootライブラリをアプリケーションに装備

2.2 使用例
次の手順は、デフォルトの Makefile ターゲットで自動化されています。ファクトリイメージを作成するための例としてベアメタルのテストアプリケーションを使用します。 make を実行すると、ビルドシス
テムは次の各ステップを実行します。

-

ed25519_keygen ツールを使用して Ed25519 鍵ペアを作成します。

-

ブートローダーをコンパイルします。上記のステップで生成された公開鍵はビルドに含まれています。

-

test_app でテストアプリケーションからファームウェアイメージをコンパイルします。

-

ファームウェアを再リンクして、エントリーポイントを 1 次区画の開始アドレスに変更します。

-

ed25519_sign ツールを使用してファームウェアイメージに署名します。

-

ブートローダーとファームウェアイメージを連結してファクトリイメージを作成します。

工場出荷時のイメージはターゲットデバイスに書込むことができます。フラッシュ上の指定アドレスにブートローダーと署名された初期ファームウェアが配置されます。

ed25519_sign ツールは、ブートローダーに必要なファームウェアイメージフォーマットに準拠するように、起動可能なファームウェアイメージを変換します。
© 2004 – 2019 wolfSSL Inc.

8

ファームウェアイメージ形式の詳細については、ファームウェアイメージのセクションを参照してください。

2.3 ファームウェアの更新
ファームウェアの更新は以下の手順で行います。
-

新しいファームウェアイメージをコンパイルし、そのエントリポイントがプライマリパーティションの開始アドレスになるようにリンクします。

-

ed25519_sign ツールとファクトリイメージ用に生成された秘密鍵を使用してファームウェアに署名します。

-

安全な接続を使用してイメージを転送し、それをセカンダリファームウェアスロットに保存します-libwolfboot wolfBoot_update（）関数を使用してイメージ交換を起動します。操作の説明について
は、wolfBoot ライブラリ API を参照してください。

-

ブートローダーにイメージスワップを開始させるために再起動します。

-

libwolfboot wolfBoot_success（）関数を使用してアップデートの成功を確認してください。操作の説明については、wolfBoot ライブラリ API を参照してください。

ファームウェアアップデート実装の詳細については、ファームウェアアップデートのセッションを参照してください。

© 2004 – 2019 wolfSSL Inc.

9

3. ファームウェアイメージ
本章では、wolfBoot の仮定するファームウェアイメージについて解説します。

3.1 ファームウェア・エントリポイント
wolfBoot はメモリ内の特定のエントリポイントからのみファームウェアイメージをチェーンロードして実行することができます。それは組み込みアプリケーションのリンカスクリプトでフラッシュメモリの起点として指定されなければなりません。これはフラッシュメモリの最初のパーティションに対応します。

この方法で複数のファームウェアイメージを作成し、2 つの異なるパーティションに保存することができます。ブートローダーは、イメージをチェーンロードする前に、選択したファームウェアを最初の（BOOT）パーティションに移動します。

イメージヘッダーのために、アプリケーションのエントリポイントには、フラッシュパーティションの先頭から 256 バイトの固定の追加オフセットがあります。

3.2 ファームウェア・イメージヘッダー（署名された）各ファームウェアイメージには、ファームウェアに関する有用な情報を含む固定サイズのイメージヘッダーが前に付加されています。実際のファームウェアのエントリポイントが 256 バイト境界で整列されたアドレスからフラッシュ上に格納されることを保証するために、イメージヘッダーは256B に収まるようにパディングされます。これによってブートローダーをチェーンロードする前にブートローダーがブートデータを再配置することができることを保証し、割り込みはブートが完了した後も正しく機能し続けることができます。

© 2004 – 2019 wolfSSL Inc.

10

イメージヘッダーはスロットの先頭に格納され、実際のファームウェアイメージはそれ以降 256 バイトで始まります。

3.3 イメージヘッダー：タグ
イメージヘッダーの先頭には 4 バイトのマジックナンバーが 1 つ続き、その後にファームウェアイメージを示す 4 バイトのフィールドが続きます（ヘッダーを除く）。ヘッダー内のすべての番号は、リトルエンディアン形式で格納されています。

2 つの固定フィールドの後には 1 つ以上のタグが続きます。各 TAG は次のように構成されています。

-

Type を示す 1 バイト-

1 type バイトと size バイトを除く、タグのサ イ ズ を示す 1 バイト-

N バイトのタグコンテンツ

次の 2 つの例外があります。

-

Type フィールドの「0」はタグの終わりを示します。ヘッダーの残りの部分には、これ以上タグがありません。 「タグの終了」タイプにはサイズフィールドがありません。

-

Type フィールドの '0xFF'は単純なパディングバイトを示します。 'padding'バイトはサイズフィールドを持たず、そして次のバイトは再び Type として処理される必要があります。

それぞれのタ イ プ は異なる意味を持ち、ファームウェアに関する情報を統合しています。以下のタグは、ファームウェアイメージを検証するために必須です。
© 2004 – 2019 wolfSSL Inc.

11-

イメージに格納されているファームウェアのバージョン番号を示す「version」タグ（タイプ：0x01、サイズ：4 バイト）-

ファームウェア作成用のタイムスタンプを unix 秒単位で示す「タイムスタンプ」タグ（タイプ：0x02、サイズ 8 バイト）-

ファームウェアの整合性チェックに使用される 'sha256 ダイジェスト'タグ（タイプ：0x03、サイズ：32 バイト）-

ファームウェアとともに保存されている署名を既知の公開鍵と照合するために使用される「ファームウェア署名」タグ（タイプ：0x20、サイズ：64 バイト）オプションで、「公開鍵ヒントダイジェスト」タグをヘッダーで送信できます（タイプ：0x10、サイズ：32 バイト）。このタグには、署名ツールで使用されている公開鍵の SHA256 ダイジェストが含まれています。利用可能な複数の鍵の場合、ブートローダーはこのフィールドを使用して正しい公開鍵を見つけることができます。

wolfBoot は、すべての場合において、内蔵のデジタル署名認証メカニズムを使って検証および認証することができないイメージの起動を拒否します。

3.3 イメージ署名ツール
イメージ署名ツールは、コンパイルされたイメージに必要なすべてのタグを含むヘッダーを生成し、それらを出力ファイルに追加します。これをデバイスのプライマリスロットに保存するか、後で安全なチャネルを通じて更新イメージをデバイスに送信します。

3.4 ファームウェアイメージの格納
ファームウェアイメージは、システム上のいずれかのパーティションの先頭にフルヘッダーで格納されています。wolfBoot は BOOT パーティションからのみイメージを起動できますが、UPDATE パーティションに 2 番目のファームウェアイメージを保存します。

別のイメージを起動するには、wolfBoot は 2 つのイメージの内容を交換する必要があります。

© 2004 – 2019 wolfSSL Inc.

12

ファームウェアイメージが 2 つのパーティション内でどのように格納および管理されるかについて詳し
くは、フラッシュパーティションを参照してください。

4. フラッシュ・パーティション
4.1 ファームメモリーのパーティション
wolfBoot を統合するには、フラッシュメモリのジオメトリを考慮して、フラッシュを別々の領域（パーティション）に分割する必要があります。

ブートローダーは新しいファームウェアイメージを保存する前にすべてのフラッシュセクタを消去し、2 つのパーティションの内容を一度に 1 セクタずつスワップするため、イメージの境界は物理セクタに合わせる必要があります。

このため、ターゲットシステムでパーティション分割を進める前に、次の点を考慮する必要があります。

-

BOOT パーティションと UPDATE パーティションは同じサイズで、実行中のシステムを含めることができる必要があります。

-

SWAP パーティションは、BOOT パーティションと UPDATE パーティションの両方で最大のセクターと同じ大きさである必要があります。

ターゲットのフラッシュメモリは、次の領域に分割されています。

-

フラッシュの最初のブートローダーパーティション、通常は非常に小さい（16〜32KB）-

アドレス WOLFBOOT_PARTITION_BOOT_ADDRESS から始まるプライマリスロット（BOOT パーティション）-アドレス WOLFBOOT_PARTITION_UPDATE_ADDRESS から始まるセカンダリスロット（UPDATE パーティション）Ø

両方のパーティションは、WOLFBOOT_PARTITION_SIZE として定義された同じサイズを共有します。

-アドレス WOLFBOOT_PARTITION_SWAP_ADDRESS から始まるスワップ空間（SWAP パーティション）Ø

スワップ領域のサイズは WOLFBOOT_SECTOR_SIZE として定義されており、BOOT /UPDATE パーティションで使用される最大セクタと同じ大きさである必要があります。
© 2004 – 2019 wolfSSL Inc.

13

include/target.h でオフセットとサイズの値を設定して、特定の用途に合わせて適切なパーティション構成を設定する必要があります。

4.２ブートローダー・パーティション
このパーティションは通常非常に小さく、ブートローダーのコードとデータのみを含みます。工場出荷時のイメージ作成中に事前承認された公開鍵は、ファームウェアイメージの一部として自動的に保存されます。

4.3 ブート・パーティション
これは、ファームウェアイメージをチェーンロードして実行できる唯一のパーティションです。ファームウェアイメージは、そのエントリポイントがアドレス WOLFBOOT_PARTITION_BOOT_ADDRESS +256 になるようにリンクする必要があります。

4.4 アップデート・パーティション
実行中のファームウェアは、安全なチャネルを通じて新しいファームウェアイメージを転送し、それをセカンダリスロットに格納します。アップデートが開始されると、ブートローダーは次回の再起動時にブートパーティション内のファームウェアを交換または交換します。

4.5 例：STM32-F407 の場合の 512KB パーティション
test-app で提供されているファームウェアの例は、アドレス 0x20000 から始まるプライマリパーティションから起動するように設定されています。フラッシュレイアウトは、target.h に次の設定を使用したデフォルトの例で提供されています。

#define WOLFBOOT_SECTOR_SIZE 0x20000#define WOLFBOOT_PARTITION_SIZE 0x20000#define WOLFBOOT_PARTITION_BOOT_ADDRESS 0x20000#define WOLFBOOT_PARTITION_UPDATE_ADDRESS 0x40000#define WOLFBOOT_PARTITION_SWAP_ADDRESS 0x60000© 2004 – 2019 wolfSSL Inc.

14これにより、以下のパーティション構成になります。

この設定は可能性のあるレイアウトの 1 つを示し、スロットはフラッシュの物理セクタの先頭に位置合わせされています。

このターゲット上のすべての実行可能ファームウェアイメージのエントリポイントは、最初のフラッシュパーティションの先頭から 0x20100、256 バイトになります。ファームウェアイメージで詳細に説明されているように、これはパーティションの先頭にファームウェアイメージヘッダーが存在するためです。

この場合、フラッシュジオメトリのため、2 つのイメージ間の適切なセクタスワップを考慮して、スワップスペースは最大 64KB である必要があります。

他のシステムでは、複数の小さいフラッシュブロックが使用されている場合、SWAP スペースは 512Bまで小さくなります。

フラッシュの形状とインアプリケーションプログラミング（IAP）の詳細については、各ターゲットデバイスの製造元のマニュアルを参照してください。

4.6 パーティション状態とセクターフラグ
パーティションは、現在使用中のファームウェアイメージ（BOOT）または入れ替える準備ができている（UPDATE）ファームウェアイメージを格納するために使用されます。各区画内のファームウェアの© 2004 – 2019 wolfSSL Inc.

15

状況を追跡するために、1 バイト状態フィールドが各区画スペースの終わりに保管されています。このバイトは、区画が消去されて初めてアクセスされたときに初期化されます。

可能な状態は次のとおりです。

-

STATE_NEW（0xFF）：イメージが起動用にステージングされていないか、更新用にトリガーされていない状態です。イメージが存在する場合、このフラグはアクティブになりません。

-

STATE_UPDATING（0x70）：UPDATE パーティションでのみ有効です。イメージは更新のマークが付けられており、BOOT 内の現在のイメージを置き換える必要があります。

-

STATE_TESTING（0x10）：BOOT パーティション内でのみ有効です。イメージは更新されたばかりで、まだ起動が完了したことはない状態を示します。再起動後に存在する場合、正しく検証されているにもかかわらず、更新されたイメージが起動に失敗したことを意味します。この特定の状況はロールバックを引き起こします。

-STATE_SUCCESS（0x00）：BOOT パーティション内でのみ有効です。 BOOT に保存されているイメージは少なくとも一度は正常にステージングされており、更新は完了していることを示します。

State バイトから始めて逆方向に大きくなると、ブートローダーは UPDATE パーティションの最後に 1セクターあたり 4 ビットを使用して、各セクターの状態を追跡します。更新が開始されるたびに、ファームウェアは一度に 1 セクタずつ UPDATE から BOOT に転送され、元のファームウェアのバックアップが BOOT から UPDATE に保存されます。各フラッシュアクセス動作はセクタフラグ領域内のセクタに対するフラグの異なる値に対応しているので、動作が中断された場合、それはリブート時に再開することができます。

© 2004 – 2019 wolfSSL Inc.

16

4.7 FLASH パーティションの概要© 2004 – 2019 wolfSSL Inc.

17

5 ファームウェアの更新
このセクションでは、既存の組み込みアプリケーションの安全な起動を可能にする、完全なファームウェアアップデート手順について説明します。

wolfBootを使ってファームウェアのアップデートを完了するための手順は次のとおりです。

-

正しいエントリーポイントでファームウェアをコンパイルする。

-

ファームウェアに署名する。

-

安全な接続を使用してイメージを転送し、それをセカンダリファームウェアスロットに保存します。

-

イメージ交換をトリガーする。

-

ブートローダーにイメージスワップを開始させるために再起動します。

いつでも、wolfBootシステム上で走っているアプリケーションまたはOSはそれ自身の更新されたバージ
ョンを受け取ることができて、そしてフラッシュメモリの第2パーティションに更新されたイメージを格納することができます。

© 2004 – 2019 wolfSSL Inc.

18

アプリケーションまたはOSスレッドをlibwolfbootライブラリにリンクすることができます。これは、次回の再起動時に更新をトリガーするためのAPIをエクスポートし、ターゲット固有のHALを介して消去/書き込み用のフラッシュパーティションにアクセスするためのヘルパー関数です。

5.1 ファームウェア更新の手順
アプリケーションに提供されているAPIを使用して、wolfBootは更新を開始、確認、またはロールバックする可能性を提供します。

新しいファームウェアイメージをUPDATEパーティションに格納した後、アプリケーションはwolfBoot_update（）を呼び出して更新を開始する必要があります。そうすることによって、UPDATEパーティションは更新のためにマークされます。次回の再起動時に、wolfBootは次のことを行います。

-

UPDATEパーティションに保存されている新しいファームウェアイメージを検証します。

-

ブートローダーイメージに格納されている既知の公開鍵に対して添付されている署名を確認します。

-

BOOTパーティションとUPDATEパーティションの内容を入れ替えます。

-

BOOTパーティション内の新しいファームウェアをSTATE_TESTING状態にします。

-

新しく受け取ったファームウェアで起動します。

１）	  ブートの成功
起動が成功すると、アプリケーションはシステムが再起動したことを確認した後、wolfBoot_success（）を呼び出してブートローダーに通知します。この操作は新しいファームウェアへのアップデートを確認します。

次回の再起動の前にBOOTパーティションをSTATE_SUCCESSに設定しないと、ロールバック操作がトリガされます。ロールバックは新しい更新を起動することによってブートローダーによって開始されます。今回は元の（更新前の）ファームウェアのバックアップコピーから開始されます。このファームウェアは、スワップが早く発生したためにUPDATEパーティションに格納されます。

２）	 新しいファームウェアイメージのビルド
ファームウェアイメージは位置に依存し、FLASHのBOOTパーティションの起点からしか起動できません。この設計上の制約は、選択されたファームウェアが常にBOOTパーティションに格納されているこ© 2004 – 2019 wolfSSL Inc.

19

とを意味します。そして、wolfBootは更新イメージを事前検証し、それを正しいアドレスにコピーする責任があります。

したがって、すべてのファームウェアイメージのエントリポイントは、BOOTパーティションの先頭に対応するアドレスに、イメージヘッダーを考慮して256バイトのオフセットを加えた値に設定する必要があります。

ファームウェアをコンパイルしてリンクしたら、ed25519_signツールを使用して署名する必要があります。このツールは、現在検証に使用されている公開鍵に対応する同じ鍵を使用して、安全な接続を使用してターゲットに転送できる署名付きイメージを生成します。

このツールは、署名とファームウェアのSHA256ハッシュを含む、必要なすべてのタグをイメージヘッダーに追加します。

© 2004 – 2019 wolfSSL Inc.

20

6. HAL (ハードウェア抽象化層)
ターゲットマイクロコントローラ上で wolfBoot を実行するためには、HAL の実装が提供されなければなりません。

HAL の目的は、ブートローダーおよびアプリケーションライブラリからのファームウェアアップグレードを開始するアプリケーションからの書き込み/消去操作を許可し、起動時に MCU がフルスピードで動作していることを確認して署名の検証を最適化することです。

各プラットフォームに対するハードウェア固有の呼び出しの実装は、hal ディレクトリ内の単一の c ファイルにまとめられています。

このディレクトリには、サポートされている各 MCU 用のプラットフォーム固有のリンカスクリプトも含まれています。
同じ名前と.ld 拡張子を持ちます。これはブートローダーのファームウェアを特定のハードウエア上で結び付け、フラッシュと RAM 境界に必要な全ての記号を書き出すのに使用されます。

サポートプラットフォーム
現在のバージョンでは、次のプラットフォームがサポートされています。

-STM32F4-nRF52-

ATMEL Sam R21

API
ハードウェア抽象化層（HAL）は、サポートされている各ターゲットに対して実装される 6 つの関数呼び出しで構成されています。

void hal_init（void）© 2004 – 2019 wolfSSL Inc.

21

この関数は実行の最初にブートローダーによって呼び出されます。理想的には、提供される実装はターゲットマイクロコントローラのクロック設定を構成し、暗号プリミティブがファームウェアイメージを検証するのに必要な時間を短縮するために必要な速度で動作するようにします。

void hal_flash_unlock（void）

ターゲットのフラッシュメモリの IAP インターフェイスが必要とする場合、この関数はフラッシュへの書き込みアクセスをロック解除するためにすべての書き込みおよび消去操作の前に呼び出されます。一部のターゲットでは、この関数は空の場合があります。

int hal_flash_write（uint32_t アドレス、const uint8_t *データ、int len）

この関数は、ターゲットの IAP インタフェースを使用してフラッシュ書き込み機能の実装を提供します。
address はフラッシュ領域の先頭からのオフセット、data は IAP インターフェイスを使用してフラッシュに格納されるペイロード、len はペイロードのサイズです。 hal_flash_write は成功すると 0 を返し、失敗すると負の値を返します。

void hal_flash_lock（void）

フラッシュメモリの IAP インタフェースでロック／ロック解除が必要な場合は、ライトアクセスを除外することでフラッシュのライトプロテクトを解除します。この関数は全ての書き込みと消去操作の最後でブートローダーによって呼び出されます。

int hal_flash_erase（uint32_t アドレス、int len）

ブートローダーによって呼び出され、その後の起動を可能にするためにフラッシュメモリの一部を消去します。消去操作は、ターゲットマイクロコントローラの特定の IAP インターフェイスを介して実行する必要があります。 address はブートローダーが消去したい領域の開始をマークし、len は消去する領域のサイズを指定します。この機能はフラッシュセクタのジオメトリを考慮に入れ、その間のすべてのセクタを消去しなければなりません。

void hal_prepare_boot（void）© 2004 – 2019 wolfSSL Inc.

22

この関数は、非常に遅い段階でブートローダーによって呼び出され、次の段階でファームウェアをチェーンロードします。これはクロック設定に行われた全ての変更を元に戻してマイクロコントローラの状態が元の設定に確実に復元されるのに使用することができます。

© 2004 – 2019 wolfSSL Inc.

23

7. ブートローダーとの通信 API
wolfBoot はパーティションに保存されているファームウェアイメージと対話し、明示的に更新を開始し、以前にスケジュールされた更新の成功を確認するための最小のインターフェースを提供します。

libwolfboot のコンパイルとリンク
wolfBoot とのやり取りを必要とするアプリケーションはヘッダーファイルをインクルードしなければなりません：#include <wolfboot/wolfboot.h>

API 関数の宣言と、2 つのパーティションにファームウェアイメージとともに格納されているフラグおよびタグの定義済みの値がエクスポートされます。

フラッシュパーティション、フラグ、および状態の詳細については、フラッシュパーティションを参照してください。

APIlibwolfboot はフラッシュパーティションの状態への低レベルアクセスインターフェースを提供します。
各パーティションの状態は、アプリケーションによって取得および変更できます。

アプリケーションからの基本的な対話は、2 つの高水準関数呼び出しによって提供されます。

void wolfBoot_update（void）

そして

void wolfBoot_success（void）

更新の起動
-

wolfBoot_update（）は、次回の再起動時にファームウエアアップデートするために使用します。
通常、実行中のファームウェアの新しいバージョンを取得し、それをフラッシュの UPDATE パー© 2004 – 2019 wolfSSL Inc.

24

ティションに格納しているアップデートアプリケーションによって使用されます。この関数はUPDATE パーティションの状態を STATE_UPDATING に設定し、次回の実行時（再起動後）に更新を実行するようにブートローダーに指示します。
wolfBoot 更新プロセスは、一時的なシングルブロックの SWAP スペースを使って、UPDATE と BOOTパーティションの内容を交換することから成ります。

現在のイメージの確認-

wolfBoot_success（）は新しいファームウェアの起動が成功したことを示します。これはアプリケーションからいつでも呼び出すことができますが、ロールバックが不要であることを示す状態
STATE_SUCCESS で現在のファームウェア（BOOT パーティション内）をマークする場合のみ意味があります。アプリケーションは通常、次回のアップグレードのために新しいファームウェアを取得する可能性も含めて、基本的なシステム機能が起動して実行中であることを確認した後にのみ、wolfBoot_success（）を呼び出す必要があります。

アップグレード後に wolfBoot がアクティブなファームウェアがまだ STATE_TESTING 状態にあることを検出した場合、それはアプリケーションの起動が成功したことを確認できていないことを意味し、2つのイメージを交換して更新を元に戻そうとします。

アップデートプロセスの詳細については、ファームウェアアップデートのセクションを参照してください。

イメージフォーマットについては、ファームウェアイメージのセクションを参照してください。

© 2004 – 2019 wolfSSL Inc.

25