ファームウェア Hex ファイル

MicroPythonをビルドすると、コンパイラは MicroPython ファームウェアを含む Intel Hex ファイルを生成します。このファイルにデータを追加して、MicroPython バージョン情報、または起動時に実行する Python コードを含められます。

一般的なメモリレイアウトは次のとおりです:

  • 0x00000000: MicroPython ファームウェアの先頭 - 最大 248 KB
  • 0x0003e000: 追加スクリプトの先頭(オプション) - 最大 8 KB
  • 0x100010c0: UICR カスタマー[16]レジスター, MicroPython 情報の先頭 - 28バイト

注釈

Intel Hex ファイルにデータを追加したり変更したりする場合は、データのアドレスが増分順に格納されていることを確認してください。後方にアドレスジャンプがある場合、DAPLink はファイルをフラッシュできません。

追加スクリプトの形式

MicroPython はアドレス 0x0003e000 の先頭2バイトをチェックします。これは、追加スクリプトがあるかを示すマジック文字列です。マジック文字列が見つかった場合、MicroPython ファイルシステム に main.py ファイルが格納されていない限り、追加されている Python コードが自動的に実行されます。

  • 0x0003e000: 2 バイト "MP"
  • 0x0003e002: 2バイト、追加されたスクリプトの長さ(バイト単位)のリトルエンディアン整数(この長さにヘッダ4バイト分は含まない)
  • 0x0003e004: バイト列として格納したスクリプト。MicroPython で使う際には utf-8 でデコードする。

UICR フォーマット

ユーザー情報構成レジスター (UICR: User Information Configuration Registers)は、不揮発性メモリーの領域で、ユーザー固有の設定を保管できます。最初の128バイトは予約されていますが、残りの128バイトを使用して任意のデータを格納できます。

MicroPython は、UICR カスタマー[16]レジスターから開始して、リトルエンディアンで次の情報を格納します。

  • 0x100010c0: 4バイト整数のマジック値 0x17eeb07c
  • 0x100010c4: 4バイト整数値 0xffffffff
  • 0x100010c8: 4バイト整数値 0x0000000a (フラッシュページサイズ 1024 の2進対数)
  • 0x100010ca: 2バイト整数値 0x0000 (ファームウェアの開始ページ)
  • 0x100010cc: ファームウェアのページ数の2バイト整数値
  • 0x100010d0: 4バイト整数値 0xffffffff
  • 0x100010d4: ファームウェア内のバージョン文字列のあるアドレスを示す4バイト整数値
  • 0x100010d8: 4バイト整数値 0x00000000

firmware.hex ファイルを作成する手順

MicroPython をビルドするには yotta ツールを使いますが、その前にビルドの準備として Makefile で追加のファイルを生成しなければなりません。追加のデータは後で hex ファイルに追加されます。

make all コマンドを実行すると、以下の順序で処理されます:

  • tools/makeversionhdr.py スクリプトが microbitversion.h ファイルを作成します。このファイルはビルド情報をもったマクロを定義しています。
  • yotta がソースをビルドし、ファームウェアだけの生の hex ファイルを作成します
  • tools/adduicr.py スクリプトが生の hex ファイルに UICR を追加します
  • 完成した hex ファイルを build/firmware.hex に置きます
  • ユーザは、オプションで tools/makecombinedhex.py (または他のツール)を使ってスクリプトを追加できます