AN-2058: ADuCM355 ユーザ・ブートローダ

はじめに

カーネル・ブートローダがないため、消去されたADuCM355のフラッシュ・メモリは、最初にシリアル・ワイヤを介してユーザ・アプリケーションをプログラムする必要があります。

ユーザ・アプリケーションでは、フィールド内で自己更新するメカニズムを備えた独自のブートローダを実装することができます。独自のブートローダを実装するには、ユーザ・アプリケーションがユーザ・ブートローダに適した形で構成されている必要があります。

このアプリケーション・ノートでは、以後ユーザ・ブートローダと呼ぶ1つのアプローチについて説明します。このユーザ・ブートローダは、ユーザ・フラッシュを2つの別々の領域にパーティショニングし、1つの領域ではCrossCore®シリアル・フラッシュ・プログラマに対応できるブートローダを実装することで実現できます。

ADuCM355の概略

ADuCM355の次の機能が、ユーザ・ブートローダを実装するために使用されます。

ADuCM355には128kBのユーザ・フラッシュがあり、これは消去と書込み保護のために8kBのブロックごとにパーティショニングされています。

リセット後、内蔵カーネルによって、以下が直ちに実行されます。

  • 製造時のデータを使用してデバイスをブート。
  • ユーザ・フラッシュ・メタデータを調べ、ユーザ・アプリケーションを実行するよう切り替えるか、内蔵カーネルにとどまるかを判定。
  • ユーザ・フラッシュ・メタデータを調べ、ユーザ・フラッシュの容量内のフラッシュ・ブロックを書込み保護するかどうかを判定。ユーザ・アプリケーションが有効な場合、ブロックの書込み保護を適用して終了し、ユーザ・アプリケーションに移行します。ユーザ・アプリケーションが有効でないか、BM/P1.1ピンがアサートされている場合、ブロックの書込み保護は適用されず、内蔵カーネルにとどまります(カーネル実行のフローチャートについては図7を参照)。

内蔵カーネルにとどまる場合、次の利点があります。

  • 復元。デバイスへの必要なアクセスを妨げる可能性がある動作をユーザ・コードが実行することがなくなります。
  • 書込み保護の回避。ブロックが書込み保護されると消去できず、これは一括消去によっても不可能です。そのため、ユーザ・フラッシュへの書込み保護の適用は、それがユーザ・フラッシュ・メタデータ経由の間接的な方法であっても、ユーザ・アプリケーションの実行による直接的な方法であっても、回避されます。コード実行がカーネル内にとどまるため、ユーザ・フラッシュの一括消去が可能となります。

ユーザ・ブートローダの実装

ユーザ・ブートローダはユーザ・フラッシュの最初の8kBに配置されます。残りの120kBは、ユーザ・アプリケーションの開発用に使用できます(図1を参照)。

図1. メモリ・レイアウト
図1. メモリ・レイアウト

ユーザ・ブートローダは、ユーザ・フラッシュの最初の8kBにある、スタンドアロンのアプリケーションです。ユーザ・アプリケーションは、0x2000(つまり8kB)以降で実行するよう構築する必要があります。そのため、スタンドアロン・アプリケーションに多少の修正を加える必要があります。

この修正を行うため、カスタム・リンカ設定ファイルを使用してユーザ・アプリケーションをユーザ・フラッシュ内の適切な場所に配置することが必要です。

カスタム・リンカ・ファイルの読込みは、IAR Embedded Workbench®環境で、[Linker] > [Config]タブにアクセスして実行できます(図5を参照)。手順の全体については変換手順のセクションを参照してください。

.icfリンカ・スクリプト・ファイルをADuCM355用にGitHubで提供されている標準的なスクリプト・ファイルと比較すると、いくつかの違いが浮かび上がります。(図2を参照)。

図2. リンカ設定ファイルの修正
図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]をクリックします。

図3. CrossCore Serial Flash Programmerウィンドウ
図3. CrossCore Serial Flash Programmerウィンドウ

変換手順

ユーザ・ブートローダまたはユーザ・アプリケーションのモデルで使用できるように既存のアプリケーションを変換するには、次の手順が必要です。

  1. ADuCM355ソフトウェア開発キット(SDK)をGitHubからダウンロードまたは複製します。GitHubでADuCM355を検索し、aducm355-examples SDKファイルを見つけてください。
  2. SDKで、[examples] > [DigitalDie] > [M355_Bootloader]の順に移動します。BootloaderConstantArray.cファイルと、iarフォルダのuser-bootloader-sample-application.icfファイルを、ブートローダの実装先のアクティブなプロジェクト・ディレクトリにコピー&ペーストします。
  3. IAR Embedded Workbenchで目的のプロジェクトを開き、プロジェクト・エクスプローラのアプリケーション・フォルダを右クリックしてBootloaderConstantArray.cファイルをプロジェクトに追加します。次に、[Add] > [Add Files]の順に移動して、BootloaderConstantArray.cファイルを選択します。ユーザ・ブートローダはCファイルで提供されます。これには、ユーザ・ブートローダを実装するための命令コードのC配列が含まれています。カスタム・リンカ設定ファイルが備わっているため、この配列は確実に0x0000 0000の場所に正しく配置されます。
    図4. ブートローダの追加
    図4. ブートローダの追加
  4. 図5に示すように、IAR Embedded Workbenchで[Linker] > [Config]タブにアクセスして、カスタム・リンカ設定ファイルを選択します。[Override default]ボックスを選択して、user-bootloader-sample-application.icfファイルを探します

    この変更されたリンカ設定ファイルによって、ユーザ・ブートローダとユーザ・アプリケーションはユーザ・ブートローダまたはユーザ・アプリケーションのモデルに従って適切に配置されるようになります。
    図5. カスタム・リンカ設定ファイルの指定
    図5. カスタム・リンカ設定ファイルの指定
  5. ユーザ・アプリケーションのチェックサム計算の範囲は、変更されたメモリ・レイアウトに合わせて調整する必要があります。IAR Embedded Workbenchでチェックサム計算を調整するには、[Linker] > [Checksum]タブに移動します(図6を参照)。[Start address]ボックスに0x2000を、[End address]ボックスに0x27FBを入力します。

    標準のアプリケーションでは、この計算は内蔵カーネルを使用し、ユーザ・フラッシュ内のアプリケーションの整合性をチェックします。

    ユーザ・ブートローダまたはユーザ・アプリケーションのモデルでは、内蔵カーネルがユーザ・ブートローダの整合性をチェックした後にユーザ・ブートローダに切り替え、ユーザ・ブートローダがユーザ・アプリケーションの整合性をチェックした後にユーザ・アプリケーションに切り替えます。
    図6. チェックサム計算
    図6. チェックサム計算
  6. startup_ADuCM355.cファイルを変更します。

    1. 次のコード行を追加します。
      /* Linker provided symbols */
      extern uint32_t FINAL_CRC_PAGE;
    2. NumOfCRCPagesを検索し、次の行
      __root const uint32_t NumOfCRCPages=0;
      を次の行に置き換えます。
      __root const uint32_t NumOfCRCPages=(uint32_t)&FINAL_CRC_PAGE;
  7. 最終手順はメイン・プログラムに関数を追加することです。
    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を押して放す)と、ユーザ・ブートローダがブート・モードに設定されます。

 

図7. ブートローダのフロー図
図7. ブートローダのフロー図