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 インタフェースファームウェアが動作するオンボードインタフェースがどの様に使用されるかを示しています:
オンボードインタフェースがホスト PC と接続された時、コンポジットデバイスとして以下のインタフェースが列挙されます:
- MSD, mass storage device class
- CDC, communications device class
- HID, human interface device class
ターゲットマイクロコントローラとは、以下のピンで接続されます:
- SWD + Reset
- UART
- Sleep and Wake(現在は未実装ですが、今後のために予約されています)
共有コード
全てのターゲットのブートローダーと 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) を使用して新しいファームウェアのイメージの書き込みを待機します。
新しいチップへのポーティング
新しいチップへポーティングをおこなう場合は、最初に対応する 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.