CMSIS-DAP インタフェースファームウェア

このノートブックは、cmsis dap interface firmware の翻訳版です。

mbed HDK(ツール+ライブラリ)のソースコードは、以下のリポジトリから参照可能です:

何が提供されるか

CMSIS-DAP インタフェースファームウェアは、以下を提供します:

  • ターゲットチップにドラッグ&ドロッププログラミングを行うための USB Mass Storage Device Class
  • ターゲットチップとシリアル通信を行う USB Communications Device Class
  • CMSIS-DAP デバックを行う USB HID
  • ファームウェア自身をアップデートする USB ブートローダー

ハードウェアインタフェース

下図は、評価ボード上で使用されるCMSIS-DAP インタフェースファームウェアが動作するオンボードインタフェースがどの様に使用されるかを示しています:

/media/uploads/emilmont/board.png

オンボードインタフェースがホスト PC と接続された時、コンポジットデバイスとして以下のインタフェースが列挙されます:

  • MSD, mass storage device class
  • CDC, communications device class
  • HID, human interface device class

ターゲットマイクロコントローラとは、以下のピンで接続されます:

  • SWD + Reset
  • UART
  • Sleep and Wake(現在は未実装ですが、今後のために予約されています)

/media/uploads/emilmont/interface.png

共有コード

全てのターゲットのブートローダーと CMSIS-DAP インタフェースファームウェアは、shared フォルダ内の共通のミドルウェアとコンポーネントを共有しています:

  • shared\cmsis: CMSIS-CORE ソフトウェアレイヤー
  • shared\rtos: RTX オペレーティングシステム
  • shared\USBStack: USB Device ミドルウェア

ブートローダー

ブートローダーにより、インタフェースチップのファームウェアをアップデートすることが出来ます。

現時点では、このプロジェクトは LPC11U35 のみをサポートしており、プロジェクトファイルは以下にあります: bootloader\mdk\lpc11u35\lpc11u35_bootloader.uvproj

スターアップ時に、デフォルトではプルアップレジスタでハイレベルにされた指定されたピンのステートがチェックされます:

  • ピンがハイレベルだった場合:CMSIS-DAP インタフェースファームウェアの割り込みハンドラが指し示すベクターテーブルに単純にリロケーションされ、スタートアドレスにジャンプします。
  • ピンがローレベルだった場合:マスストレージデバイスとして列挙され、In Application Programming (IAP) を使用して新しいファームウェアのイメージの書き込みを待機します。

/media/uploads/emilmont/bootloader.png

新しいチップへのポーティング

新しいチップへポーティングをおこなう場合は、最初に対応する CMSIS-CORE ファイルが shared\cmsis フォルダに含まれているかを確認してください。

新しいターゲットチップにこのブートローダーをポーティングする労力をシンプルにするために、我々はターゲット依存の多くのコードを bootloader\hal 配下にまとめました:

  • flash.c: In Application Programming (IAP) を提供する機能
  • gpio.c: オンボードの led/reset ボタン割り込みを初期化する機能
  • read_uid.c: チップのユニーク ID の読み込み
  • usbd_XXX.c: USB デバイスコントローラの低レベルドライバ。このファイルは、MDK USB デバイススタックが USB コントローラにアクセスするのに使用される全ての低レベル関数を含みます。
  • vector_table.c: 割り込みベクタテーブルのリロケーション

現在の実装では:

  • LPC11U35: bootloader\hal\TARGET_NXP\TARGET_LPC11U35

フラッシュアルゴリズム

CMSIS-DAP インタフェースファームウェアは、ターゲットマイクロコントローラに新しいイメージを書き込むことが可能で、ターゲットの RAM 上にロードされたフラッシュのアルゴリズム(バイナリ命令のシーケンス)が必要です。

フラッシュアルゴリズムは、*position independent* (位置非依存)コードとしてコンパイルされた小さなアプリケーションとして開発され、インタフェースコード内に "binary blob(バイナリのかたまり)” として配置されます。

以下の2種類のマイクロコントローラファミリ用のフラッシュアルゴリズムとして、2つの MDK プロジェクトファイルを用意してあります:

  • interface\flash_algo_mdk\LPC_IAP\LPC_IAP.uvproj: NXP LPC ファミリ用のフラッシュアルゴリズム
  • interface\flash_algo_mdk\MKXXX\MKXX.uvproj: Freescale MK ファミリ用のフラッシュアルゴリズム

これらのプロジェクトファイルは複数のコンフィグレーションを持ち、それぞれのマイクロコントローラファミリ向けに異なったサイズのフラッシュメモリをサポートしています。

位置非依存のフラッシュアルゴリズムを生成した後、新しいターゲット用のインタフェースプロジェクト内にコードを含めるための生成スクリプトを提供しています。

出力された elf バイナリ ".axf" を tools\tmp\flash_algo.axf にコピーし以下を実行します:

tools> python flash_algo_gen.py

これによって、 tools\tmp\flash_algo.txt という名称の以下のようなテキストファイルが生成されます:

const uint32_t flash_algo_blob[] = {
    0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA, 0x2A001E52, 0x4770D1F2,

    /*0x020*/ 0x28100b00, 0x210ed302, 0xd0eb01, 0x494f4770, 0x607af44f, 0x60084449, 0x2100484d, 0x21aa7001,
    /*0x040*/ 0x21557301, 0x21017301, 0x1c40f800, 0x47702000, 0x47702000, 0x41f0e92d, 0x20324c46, 0x2500444c,
    /*0x060*/ 0xe884261dL, 0xf1040061L, 0x4f430114, 0x46204688, 0x696047b8, 0x2034b960, 0x61e884, 0x4641483b,
    /*0x080*/ 0x68004448, 0x462060e0, 0x696047b8, 0xd0002800L, 0xe8bd2001L, 0xe92d81f0L, 0xf7ff41f0L, 0x4d35ffc1,
    /*0x0A0*/ 0x444d4604, 0xe9c52032L, 0xf1050400L, 0x4e320114, 0x4628460f, 0x47b060ac, 0xb9686968L, 0xe9c52034L,
    /*0x0C0*/ 0x482a0400, 0x444860ac, 0x68004639, 0x462860e8, 0x696847b0, 0xd0dc2800L, 0xe7da2001L, 0x41f0e92d,
    /*0x0E0*/ 0x64614, 0x4825d11d, 0x12fcf8d4, 0xd03a4281L, 0x42814823, 0x4823d037, 0xd0344281L, 0x4030ea4f,
    /*0x100*/ 0xd0304281L, 0x100e9d4, 0xe9d44408L, 0x44111202, 0x69214408, 0x69614408, 0x69a14408, 0x42404408,
    /*0x120*/ 0x463061e0, 0xff7cf7ffL, 0x21324d12, 0x4f12444d, 0x1000e9c5, 0x114f105, 0x468860a8, 0x47b84628,
    /*0x140*/ 0xb9806968L, 0xe9c52033L, 0xf44f0600L, 0xe9c57000L, 0x48064002, 0x44484641, 0x61286800, 0x47b84628,
    /*0x160*/ 0x28006968, 0x2001d095, 0xe793, 0x4, 0x400fc080, 0x8, 0x1fff1ff1, 0x4e697370,
    /*0x180*/ 0x12345678, 0x87654321L, 0x0, 0x0,
};

static const TARGET_FLASH flash = {
    0x1000002F, // Init
    0x10000051, // UnInit
    0x10000055, // EraseChip
    0x10000097, // EraseSector
    0x100000DD, // ProgramPage

インタフェース

現在は、2つのマイクロコントローラをサポートしています:

  • LPC11U35: interface\mdk\lpc11u35\lpc11u35_interface.uvproj
  • KL25Z: interface\mdk\kl25z\kl25z_interface.uvproj

それぞれのプロジェクトファイルは複数のコンフィグレーションを持っています:

  • 異なるターゲットのサポート:異なったフラッシュアルゴリズムと reset/unlock シーケンス
  • アドレス 0x0 からの(開発時にデバッグが行いやすい)スタンドアローンビルドと、ブートローダによってロードが可能なアドレス 0x5000 からのブートローダビルド

新しいターゲットのサポート

ターゲット依存のコードは以下の2つのファイルにあります:

  • target_flash.h: ターゲットのフラッシュメモリい新しいバイナリをロードするための API の実装、大部分は上記フラッシュアルゴリズムプロジェクトから生成される
  • target_reset.c: ターゲットの特殊なステートで unlock/set を行うための関数群

現在のターゲット実装では:

  • LPC812: interface\target\hal\DBG_NXP\DBG_LPC812
  • LPC1768: interface\target\hal\DBG_NXP\DBG_LPC1768
  • KL25Z: interface\target\hal\DBG_Freescale\DBG_KL25Z
  • KL46Z: interface\target\hal\DBG_Freescale\DBG_KL46Z
  • KL05Z: interface\target\hal\DBG_Freescale\DBG_KL05Z

新しいインタフェースチップへのポーティング

CMSIS-DAP インタフェースファームウェアを新しいチップにポーティングする場合には、最初に対応する CMSIS-CORE ファイルが shared\cmsis フォルダに含まれているかを確認してください。

新しいインタフェースチップにこのブートローダーをポーティングする労力をシンプルにするために、我々はターゲット依存の多くのコードを interface\hal 配下にまとめました:

  • DAP_config.h: ターゲットの SWD 信号をドライブするための gpio ドライバの実装
  • gpio.c: オンボードの led/reset ボタン割り込みを初期化する機能
  • read_uid.c: チップのユニーク ID の読み込み
  • usbd_XXX.c: USB デバイスコントローラの低レベルドライバ。このファイルは、MDK USB デバイススタックが USB コントローラにアクセスするのに使用される全ての低レベル関数を含みます。
  • uart.c: usb <-> uart パイプアクセスを提供する低レベルドライバ
  • usb_buf.h: usb_buffer 配列の宣言。これは、開発者がメモリの特定の位置に配列を配置したいかも知れないため、インターフェス依存です。

現在の実装では:

  • LPC11U35: interface\interface\hal\TARGET_NXP\TARGET_LPC11U35
  • MK20DX: interface\interface\hal\TARGET_Freescale\TARGET_MK20DX

プロダクションイメージの連結

最終製品の(バイナリ)イメージは、アドレス 0x0 から配置されるブートローダーコードとアドレス 0x5000 から配置されるインタフェースファームウェアを含んだ単一のバイナリになります。これらの2つの異なったプロジェクトから生成され、パスが分かっている elf ファイルのイメージを連結するシンプルなスクリプトファイルを提供しています。これは、入力オプションとしてマイクロコントローラのインタフェースとターゲット名を取得します。例えば、LPC11U35 インタフェースと LPC1768 ターゲットのイメージを生成する場合は、以下のようなコマンドラインになります:

tools> python concat.py -i LPC11U35 -t LPC1768

これによって、次のファイルが生成されます:tools\tmp\if_lpc11u35_target_lpc1768.bin


Please log in to post comments.