AN-2058: ADuCM355 ユーザ・ブートローダ
はじめに
カーネル・ブートローダがないため、消去されたADuCM355のフラッシュ・メモリは、最初にシリアル・ワイヤを介してユーザ・アプリケーションをプログラムする必要があります。
ユーザ・アプリケーションでは、フィールド内で自己更新するメカニズムを備えた独自のブートローダを実装することができます。独自のブートローダを実装するには、ユーザ・アプリケーションがユーザ・ブートローダに適した形で構成されている必要があります。
このアプリケーション・ノートでは、以後ユーザ・ブートローダと呼ぶ1つのアプローチについて説明します。このユーザ・ブートローダは、ユーザ・フラッシュを2つの別々の領域にパーティショニングし、1つの領域ではCrossCore®シリアル・フラッシュ・プログラマに対応できるブートローダを実装することで実現できます。
ADuCM355の概略
ADuCM355の次の機能が、ユーザ・ブートローダを実装するために使用されます。
ADuCM355には128kBのユーザ・フラッシュがあり、これは消去と書込み保護のために8kBのブロックごとにパーティショニングされています。
リセット後、内蔵カーネルによって、以下が直ちに実行されます。
- 製造時のデータを使用してデバイスをブート。
- ユーザ・フラッシュ・メタデータを調べ、ユーザ・アプリケーションを実行するよう切り替えるか、内蔵カーネルにとどまるかを判定。
- ユーザ・フラッシュ・メタデータを調べ、ユーザ・フラッシュの容量内のフラッシュ・ブロックを書込み保護するかどうかを判定。ユーザ・アプリケーションが有効な場合、ブロックの書込み保護を適用して終了し、ユーザ・アプリケーションに移行します。ユーザ・アプリケーションが有効でないか、BM/P1.1ピンがアサートされている場合、ブロックの書込み保護は適用されず、内蔵カーネルにとどまります(カーネル実行のフローチャートについては図7を参照)。
内蔵カーネルにとどまる場合、次の利点があります。
- 復元。デバイスへの必要なアクセスを妨げる可能性がある動作をユーザ・コードが実行することがなくなります。
- 書込み保護の回避。ブロックが書込み保護されると消去できず、これは一括消去によっても不可能です。そのため、ユーザ・フラッシュへの書込み保護の適用は、それがユーザ・フラッシュ・メタデータ経由の間接的な方法であっても、ユーザ・アプリケーションの実行による直接的な方法であっても、回避されます。コード実行がカーネル内にとどまるため、ユーザ・フラッシュの一括消去が可能となります。
ユーザ・ブートローダの実装
ユーザ・ブートローダはユーザ・フラッシュの最初の8kBに配置されます。残りの120kBは、ユーザ・アプリケーションの開発用に使用できます(図1を参照)。
ユーザ・ブートローダは、ユーザ・フラッシュの最初の8kBにある、スタンドアロンのアプリケーションです。ユーザ・アプリケーションは、0x2000(つまり8kB)以降で実行するよう構築する必要があります。そのため、スタンドアロン・アプリケーションに多少の修正を加える必要があります。
この修正を行うため、カスタム・リンカ設定ファイルを使用してユーザ・アプリケーションをユーザ・フラッシュ内の適切な場所に配置することが必要です。
カスタム・リンカ・ファイルの読込みは、IAR Embedded Workbench®環境で、[Linker] > [Config]タブにアクセスして実行できます(図5を参照)。手順の全体については変換手順のセクションを参照してください。
.icfリンカ・スクリプト・ファイルをADuCM355用にGitHubで提供されている標準的なスクリプト・ファイルと比較すると、いくつかの違いが浮かび上がります。(図2を参照)。
ブートローダの配置
ユーザ・ブートローダはユーザ・フラッシュの最初の8kBに配置されます。これは、例外ベクタ・テーブル、チェックサムの配置、ユーザ・フラッシュ・メタデータを備える他のADuCM355アプリケーションと同様に構築されています。
ユーザ・アプリケーションの配置
ユーザ・アプリケーションは0x2000以降に配置され、使用可能なアプリケーション容量は、0x2000だけ減少します。Cortex®-M3割込みベクタ・テーブルは0x2000に配置されます。ユーザ・ブートローダは、この配置に一致するよう、Cortex-M3ベクタ・テーブル・オフセット・レジスタ(VTOR)を更新します。
ユーザ・フラッシュ・メタデータは0x2000だけオフセットされます。
ユーザ・ブートローダ・メタデータ
ユーザ・ブートローダ・メタデータは、内蔵カーネルによってチェックと処理が行われます。内蔵カーネルは、ユーザ・ブートローダ領域の有効性を検証してから、ユーザ・フラッシュのユーザ・ブートローダ領域に制御を移し、任意のユーザ・フラッシュ書込み保護を適用します。
ユーザ・アプリケーション・メタデータ
ユーザ・アプリケーション・メタデータは、ユーザ・ブートローダによってチェックと処理が行われます。ユーザ・ブートローダは、ユーザ・アプリケーション領域の有効性を検証してから、ユーザ・フラッシュのユーザ・アプリケーション領域に制御を移し、任意のユーザ・フラッシュ書込み保護を適用します。
ユーザ・ブートローダは、内蔵カーネルがユーザ・ブートローダ・メタデータ(または標準的なアプリケーション・メタデータ)に対し実行するのと同じタイプのチェックと動作をユーザ・アプリケーション・メタデータに対し行いますが、使用するアドレスと範囲だけが異なります。したがって、標準アプリケーションは0x2000だけオフセットすることで、ユーザ・ブートローダで動作するよう容易に変換できます。
デスクトップ・アプリケーション
プロトコルは、www.analog.com/jp/crosscore-utilitiesでダウンロード可能な、アナログ・デバイセズのCrossCore Serial Flash Programmerツールで使用できます。
このCrossCore Serial Flash Programmerツールは、いくつかの異なるプロトコルの変種に対応しています。ユーザ・ブートローダのこの実装は、ADuCM3027およびADuCM3029によって実装されるバージョンをサポートしています。図3に示すように、[Target]で[ADuCM302x]オプションを選択してください。
[Action]がサポートするオプションは、[Program]と[Erase]です。
[Browse]ボタンをクリックして[File to download]からユーザ・アプリケーションのIntel Hexadecimalファイルをロードし、[Start]をクリックします。
変換手順
ユーザ・ブートローダまたはユーザ・アプリケーションのモデルで使用できるように既存のアプリケーションを変換するには、次の手順が必要です。
- ADuCM355ソフトウェア開発キット(SDK)をGitHubからダウンロードまたは複製します。GitHubでADuCM355を検索し、aducm355-examples SDKファイルを見つけてください。
- SDKで、[examples] > [DigitalDie] > [M355_Bootloader]の順に移動します。BootloaderConstantArray.cファイルと、iarフォルダのuser-bootloader-sample-application.icfファイルを、ブートローダの実装先のアクティブなプロジェクト・ディレクトリにコピー&ペーストします。
- IAR Embedded Workbenchで目的のプロジェクトを開き、プロジェクト・エクスプローラのアプリケーション・フォルダを右クリックしてBootloaderConstantArray.cファイルをプロジェクトに追加します。次に、[Add] > [Add Files]の順に移動して、BootloaderConstantArray.cファイルを選択します。ユーザ・ブートローダはCファイルで提供されます。これには、ユーザ・ブートローダを実装するための命令コードのC配列が含まれています。カスタム・リンカ設定ファイルが備わっているため、この配列は確実に0x0000 0000の場所に正しく配置されます。
図4. ブートローダの追加 - 図5に示すように、IAR Embedded Workbenchで[Linker] > [Config]タブにアクセスして、カスタム・リンカ設定ファイルを選択します。[Override default]ボックスを選択して、user-bootloader-sample-application.icfファイルを探します
この変更されたリンカ設定ファイルによって、ユーザ・ブートローダとユーザ・アプリケーションはユーザ・ブートローダまたはユーザ・アプリケーションのモデルに従って適切に配置されるようになります。
図5. カスタム・リンカ設定ファイルの指定 - ユーザ・アプリケーションのチェックサム計算の範囲は、変更されたメモリ・レイアウトに合わせて調整する必要があります。IAR Embedded Workbenchでチェックサム計算を調整するには、[Linker] > [Checksum]タブに移動します(図6を参照)。[Start address]ボックスに0x2000を、[End address]ボックスに0x27FBを入力します。
標準のアプリケーションでは、この計算は内蔵カーネルを使用し、ユーザ・フラッシュ内のアプリケーションの整合性をチェックします。
ユーザ・ブートローダまたはユーザ・アプリケーションのモデルでは、内蔵カーネルがユーザ・ブートローダの整合性をチェックした後にユーザ・ブートローダに切り替え、ユーザ・ブートローダがユーザ・アプリケーションの整合性をチェックした後にユーザ・アプリケーションに切り替えます。
図6. チェックサム計算 - startup_ADuCM355.cファイルを変更します。
- 次のコード行を追加します。
/* Linker provided symbols */
extern uint32_t FINAL_CRC_PAGE; - NumOfCRCPagesを検索し、次の行
__root const uint32_t NumOfCRCPages=0;
を次の行に置き換えます。
__root const uint32_t NumOfCRCPages=(uint32_t)&FINAL_CRC_PAGE;
- 次のコード行を追加します。
- 最終手順はメイン・プログラムに関数を追加することです。
void __iar_init_core (void)
{
SCB->VTOR = (uint32_t)
&__vector_table;
}
この関数の目的は、VTORがユーザ・ファームウェアの例外テーブルをポイントするようにすることです。ブートローダは既にこの手順を実行していますが、デバッグ・モードの場合、IAR Embedded Workbenchはブートローダの実行をバイパスします。IAR Embedded Workbenchのデバッガは、PCにタイプ0のリセット(ハードウェア・リセット)を実行してから、リセット・ベクタであると考えられる状態にリセットします。そのため、デバッグ・モードで割込みが機能するためには、この関数が必要になります。
以上で、このアプリケーションは通常どおりにダウンロードとデバッグができます。
ブート・モード・ピン
内蔵カーネルとユーザ・ブートローダには、それぞれの実行フローを変更する個別のブート・モード・ピンがあります。
内蔵カーネルのブート・モード・ピンの優先度の方がユーザ・ブートローダのブート・モード・ピンより高くなっています。
内蔵カーネルBM/P1.1ピン
BM/P1.1は、ユーザ・フラッシュ内のすべてのソフトウェアの実行をバイパスします。
BM/P1.1ピンは、EVAL-ADucM355QSPZ評価用ボードのスイッチS3に接続します。スイッチS3を押し続けながらリセットを実行する(スイッチS1を押して放す)と、内蔵カーネルがブート・モードに設定されます。
ユーザ・ブートローダ・ブート・モードP1.0/SYS_WAKEピン
P1.0/SYS_WAKEピンは、ユーザ・フラッシュにあるユーザ・アプリケーションの実行をバイパスします。これがアサートされている場合、ユーザ・ブートローダは有効なユーザ・アプリケーションの存在をチェックせずに、直ちにダウンロード・モードに入ります。
P1.0/SYS_WAKEピンは、EVAL-ADucM355QSPZ評価用ボードのスイッチS2に接続します。スイッチS2を押し続けながらリセットを実行する(スイッチS1を押して放す)と、ユーザ・ブートローダがブート・モードに設定されます。