[i.MXRT10xx] eFuseの書き換え方法


i.MXRTシリーズには、eFuseというデバイスの外部メモリのブートコンフィグレーションやキャッシュ設定等格納するメモリがあります。

今回は、そのeFuseの書き換え方法を紹介します。

eFuseの書き換え方法

ここで紹介するeFuse書き換え、読み込み方法は、NXPから提供されている「Flash loader」を使用することで、書き換えまたは読み込みが可能です。Flash loader には今回使用するツール類全てが含まれています。

使用するツールは、

  • SDPHOST(PCから起動して、i.MXRTとシリアル接続して使用します)
  • bootloader(i.MXRTのRAMに書き込んで使用します)
  • BLHOST(PCから起動して、シリアル接続してRAMに書き込んだbootloaderと通信して使用します)

この3つです。

この「Flash loader」は、こちらからダウンロードが可能です。

Flash Loader i.MXRT1060

SDPHOSTとは?

SDPHOSTは、PCと接続させてPC側からi.MXRTの内蔵RAMやレジスタの読み書きを可能にするコマンドラインツールです。

このSDPHOSTを利用することで、ブータブルイメージの書き込みや製品量産時のファンクションテスト、ブータブルイメージ(今回はbootloader)へのアドレスジャンプなどが容易にできるようになっています。

BLHOSTとは?

BLHOSTも同様にコマンドラインツールでbootloaderと通信し、フラッシュROMへのファームウェアの書き込み、RAMの読み書き、eFuseの読み書きが行えます。SPDHOSTではeFuseにはアクセスできないのに対し、BLHOST(bootloaderを介して)では、eFuseにアクセスできるようになります。

eFuseの書き換え手順

それでは、eFuseの書き換え、読み込みの手順を順を追って見ていきます。以下手順はWin10でのコマンドになります。

  1. Flashloaderのダウンロードとインストール
  2. PCでSDPHOST接続の確認
    $ sdphost -p COMxx — read-register 0x0000
  3. bootloaderを内蔵RAMに書き込む
    $ sdphost -p COMxx — write-file 0x20000000 “../../mfgtools-rel/Profiles/MXRT106X/OS Firmware/ivt_flashloader.bin”
  4. 指定メモリアドレス(bootloader)にジャンプし、bootloaderを実行
    $ sdphost -p COMxx — jump-adress 0x20000400
  5. BLHOSTのフォルダーに移動後、PCでBLHOSTを起動、動作確認
    $ blhost -p COMxx — get-property 1
  6. eFuseデータの書き込み、または読み込み(下記コマンドは例)
    $ blhost -p COMxx — efuse-program-once 0x2F 0000005A

具体的なeFuse書き換え、読み込み方法は、これから説明していきます。

SDPHOSTというコマンドラインツールで、eFuseにアクセスできれば早いんですが、どういう訳かSDPHOSTではeFuseにアクセスできない仕様になっています。

セキュリティの仕様なんだと思いますが、ちょっと面倒臭いです。

詳細な手順

1)FlashLoaderのダウンロードと解凍

ダウンロードしたFlashloaderは圧縮されているので、任意の場所に解凍します。

注意点
解凍先フォルダには、日本語の文字、スペースが含まれたパスに指定すると、うまく動作しない時があります。 できればホーム(winであればc:/)に近いところに、日本語文字が含まれないフォルダを作成して解凍することをおすすめします。
Flash Loader i.MXRT1060

2)SDPHOST接続の確認

まず、SDPHOSTを起動し、i.MXRTのシリアル通信を確認していきます。

SDPHOSTは、UARTもしくはUSBでの接続が可能です。

注意点
この記事を執筆している現在(2019年12月)、Windowsでは、UART及びUSBでの通信が可能ですが、MacOSだとOSバージョンによってUSBでは通信できず、UARTでの通信のみになります。  USB通信を利用する場合は、WIN/MacOSともにHIDデバイスとして認識されます。Windows10だと問題なく通信可能ですが、MacOSだとOSバージョンによってうまく行きません。この後で、詳しく説明しています。時期バージョンアップデートでバグの修正を期待しましょう

シリアルダウンローダーモードの設定

SDPHOSTと通信するために、i.MXRTのBOOT MODEをシリアルダウンローダーモードに設定します。これで、電源起動時に内蔵BOOT ROMで起動し、シリアルダウンローダーモード(SDPHOST)に入ります。

SW7を0001bに設定します。

具体的には、SW7のディップスイッチを左からLOW, LOW, LOW, HIGHに設定します。下の写真のディップスイッチは使い込んでいるため少し汚れていて見づらいですが、一番右端のスイッチがHIGHになっていることろです。

SW7 BOOT MODE設定(シリアルダウンロードモード)
SW7 BOOT MODE設定(シリアルダウンロードモード)

a)シリアル通信(UART)を使う場合:

2019年12月現在、MacOSでバーチャルCOMを使用したシリアル通信では、bootloader(flashloader)を正しく起動させることができません。bootloaderをRAMにダウンロード及びそのエントリーポイントにジャンプさせることは可能(これが出来てない可能性も)なんですが、実際BLHOSTで通信を行うと上手く通信できないようです。現在、原因調査中です。 何か分かり次第、この記事をアップデートします。

USB上のバーチャルCOMを使用して接続します。

電源設定のジャンパ(J1)を、5−6に接続する。

USBケーブルをPC(ここではMacOSを使用します)に接続し、i.MXRT1060-EVKのJ41のUSBコネクタに接続します。

以下MacOSの場合の手順は、動作を確認出来ていません。参考程度に読んでください。

次に、Mac側のシリアルポート番号の確認をします。

Windowsでは、デバイスマネージャからCOMポート番号を確認しましょう

MacOS では、Macのターミナル を開き、次のようにコマンドを実行してみる。

$ ls /dev/{tty,cu}.*

MacOS ポート確認方法
MacOS ポート確認方法

この場合、「cu.usbmodem14202」と「tty.usbmodem14202」が認識されているけど、cu.usbmodem14202の方でないと上手くいきません。

また、usbmodemの後ろの番号は、環境によって異なりますので注意です。

ポートが確認できたら、以下のようにコマンドを実行して、SDPHOSTの動作を確認します。

MacOSの場合:<install-path>/Tools/sdphost/mac$ ./sdphost -p /dev/cu.usbmodem14202 — read-register 0x0000

Windowsの場合:<install-path>/Tools/sdphost/win$ sdphost.exe -p COMxx — read-register  0x0000
注意:MacOSやLinuxの場合には、sdphostの実行権を与えておくことをおすすめします。上記COMポート番号は環境によって異なります。MacOSは便宜的に私の環境で認識されている番号を使用しています。

上記コマンドの–について、フォントの関係でread-register 前のハイフンは、一つのダッシュ(ハイフン)に見えますが、実際にはハイフンが二つ連続(- -)しています。

実行権の設定:

$chmod a+x sdphost

成功すると、以下のように4バイトの数字が表示されます。

SDPHOST起動確認
SDPHOST起動確認

b)USB HID接続を使う場合:

電源設定のジャンパ(J1)を、3−4に接続します。シリアル通信接続で使う場合と異なります。

USBケーブルをPC(ここではMacOSを使用します)に接続し、i.MXRT1060-EVKのJ9のUSBコネクタに接続します。

次に、USBのVIDとPIDを確認します。

i.MXRT10xxのデバイスによって、PIDが異なります。現在、わかっている範囲で下記に列挙します。

デバイス VID PID
i.MXRT102x 0x1fc9 0x0130
i.MXRT105x 0x1fc9 0x0130
i.MXRT106x 0x1fc9 0x0135

SDPHOSTコマンドを実行します。

下記コマンドは、i.MXRTの内部レジスタ0x0番地をリードするコマンドです。

MacOSの場合:<install-path>/Tools/sdphost/mac$ ./sdphost -u 0x1fc9,0x0135 — read-register 0x0000

Windowsの場合(i.MXRT16xの場合):<install-path>/Tools/sdphost/win$ sdphost.exe -u 0x1fc9,0x135 — read-register  0x0000

注意:上記コマンドの–について、フォントの関係でread-register 前のハイフンは、一つのダッシュ(ハイフン)に見えますが、実際にはハイフンが二つ連続(- -)しています。

実行結果は、以下のようになります。

Windows USB HID接続で実行した時
Windows USB HID接続で実行した時

上記結果では、Flashloaderは、RT1050用の物を使用していますが、RT1060にも使用可能です。気になる方は、きちんとi.MXRT1060専用のFlashloaderを使いましょう。

 

3)bootloaderを内蔵RAMに書き込む

次に、bootloaderをi.MXRTのRAMに書き込んでいきます。

実行例は、4)指定メモリへのジャンプ↓の画像を参照ください。

MacOSの場合: <install-path>/Tools/sdphost/mac$ ./sdphost -p /dev/cu.usbmodem14202 — write-file 0x20000000 “../../mfgtools-rel/Profiles/MXRT106X/OS Firmware/ivt_flashloader.bin”

Windowsの場合:<install-path>/Tools/sdphost/win$ sdphost.exe -p COMxx — write-file 0x20000000 “../../mfgtools-rel/Profiles/MXRT106X/OS Firmware/ivt_flashloader.bin”

注意:上記コマンドの–について、フォントの関係でread-register 前のハイフンは、一つのダッシュ(ハイフン)に見えますが、実際にはハイフンが二つ連続(- -)しています。

4)指定メモリアドレス(bootloader)にジャンプし、bootloaderを実行

次に、書き込んだbootloaderにジャンプして、実行します。

この記事の下の方でも説明していますが、MacOSではbootloaderが動作しません。Windows10を使用することをおすすめします。

ジャンプアドレス
ジャンプするアドレスは、オフセット0x400を加えてジャンプする必要があります。
MacOSの場合:<install-path>/Tools/sdphost/mac$ ./sdphost -p /dev/cu.usbmodem14202 — jump-address 0x20000400

Windowsの場合:<install-path>/Tools/sdphost/win$ sdphost.exe -p COMxx — jump-address 0x20000400

アドレスジャンプ
アドレスジャンプ

5)BLHOSTを起動、動作確認

MacOSでシリアル通信を利用してRAMにダウンロードし、エントリーポイントにジャンプさせた場合、BLHOSTの動作を確認できません。

書き込んだbootloaderの動作確認を行います。

bootloaderのコマンドをインジェクトして、そのレスポンスを確認してみます。

まず、前準備として、ターミナル (コマンドライン)で、blhostファイルまでカレントディレクトリを移動します。

MacOSの場合:$cd ../../blhost/mac
Windowsの場合:$cd ../../blhost/win

注意
MacOSの場合、これから実行するblhostの実行権を与えておく必要があります。

$chmod a+x blhost

下記のコマンド(シリアルポートを使用)は、WINDOWSの場合は上手くいきますが、MacOSの場合はエラーとなります。

シリアルポートの場合:
MacOSの場合:<install-path>/Tools/blhost/mac$ ./blhost -p /dev/cu.usbmodem14202 — get-property 1

Windowsの場合:<install-path>/Tools/blhost/win$ blhost.exe -p COMxx — get-property 1

USB HIDの場合:
MacOSの場合:<install-path>/Tools/blhost/mac$ ./blhost -u 0x15a2,0x0073 — get-property 1

Windowsの場合(i.MXRT16xの場合):<install-path>/Tools/blhost/win$ blhost.exe -u 0x15a2,0x0073 — get-property 1

実行結果は、下記を参考にしてください。

MacOSでは動作しない!

下記情報は、2019年12月現在の情報です。

MacOSバージョンによって動作しない!?
USB HIDで接続する場合は、Windowsでは上手く動作しますが、MacOSの場合は、MacOSのバージョンによっては動作しないことが確認されています。
MacOSのバージョンによってUSBドライバがセグメンテーションフォルトを起こしてしまうようです。

私の環境MacOS Catalinaではとにかく動作しませんでした。Catalinaでは、シリアルポートでも、USB HIDでも動作しないため、Catalinaにはアップグレードしないことをおすすめします。

下記2つのバージョンで試した結果です。

MacOS Mojave/High Siera MacOS Catalina Win10
シリアルポート

BLHOST起動せず

BLHOST起動せず

⭕️

問題なく動作

USB HID

⭕️

問題なく動作

セグメンテーションフォルトが発生

⭕️

問題なく動作

6)eFuseデータの書き込み、または読み込み

ようやくここまで来ました。これで最後です。

ここで注意が必要なのは、指定するアドレスがOTPメモリアドレスになると言うことです。

このアドレスは、下図にあるOTPメモリフットプリントに記載されていて、各Fuse機能毎にグループ化されているんです。そして、目的のOTPアドレス(fuseアドレス)のビットフィールドが”1”の時、1ビットずつヒューズを切ってくれます。”0”が指定されたビットフィールドは無視されます。

OTPメモリフットプリント
OTPメモリフットプリント

読み込みの時は、1回で1バイト、1度に4回読み込み出され、4バイトが読み出されます。

下記コマンドが書き込み例です。eFuseの書き込みが可能です。下記コマンドは、OTPメモリアドレス0x2Fに0x0000_005Aの値を書き込む例です。

シリアルポートの場合:
MacOSの場合:<install-path>/Tools/blhost/mac$ ./blhost -p /dev/cu.usbmodem14202 — efuse-program-once 0x2F 0000005A

Windowsの場合:<install-path>/Tools/blhost/win$ blhost.exe -p COMxx — efuse-program-once 0x2F 0000005A

USB HIDの場合:
MacOSの場合:<install-path>/Tools/blhost/mac$ ./blhost -u 0x15a2,0x0073 — efuse-program-once 0x2F 0000005A

Windowsの場合(i.MXRT16xの場合):<install-path>/Tools/blhost/win$ blhost.exe -u 0x15a2,0x0073 — efuse-program-once 0x2F 0000005A

実際に書いてみる

では、実際にi.MXRT1060-EVKに書き込んでみます。使用した環境は、MacOS HighSieraのマックを使用しました。

書き込むアドレスとデータは、先ほどとは異なりますが、以下のようなデータをGeneral Purposeレジスタに書き込みます。

Fuseアドレス:0x880  GP3(General Purpose Fuse 3)
OTPメモリアドレス:0x38
データ: 0x00000055

GP3のFuseは128ビットのヒューズが用意されています。そのうち、LSB1バイト分を使用して、0x55と言うデータを書き込んでみたいと思います。

BLHOSTでeFuseに書き込みを行うと、自動的にeFuseのシャドウレジスタにリロードをしてくれるので、書き込み後すぐにシャドウレジスタをリードして正しくヒューズが切れたか確認することが出来ます。

SDPHOSTコマンド 1. SDPHOST接続確認 2. Flashloaderの書き込み 3. Flashloaderへのエントリポイントへのアドレスジャンプ 4. BLHOSTフォルダへのフォルダ移動 5. BLHOSTの起動確認
SDPHOSTコマンド
1. SDPHOST接続確認
2. Flashloaderの書き込み
3. Flashloaderへのエントリポイントへのアドレスジャンプ
4. BLHOSTフォルダへのフォルダ移動
5. BLHOSTの起動確認(USB HIDが再エニュメレーションされる)
6. eFuseへの書き込み 7. eFuseのデータリード
6. eFuseへの書き込み
7. eFuseのデータリード
5. BLHOSTの起動確認 6. eFuseへの書き込み 7. eFuseのデータリード 8. シャドウレジスタのリード確認
8. シャドウレジスタのリード確認

無事、書き込みが出来ました。めでたし、めでたし!

まとめ

i.MXRTのeFuseの書き換え、読み込みは、Flashloaderツールを使用することで可能です。

SDPHOST、BLHOST、Flashloader(bootloader)の3つのツールを使用します。

SDPHOSTでbootloaderを内部SRAMにダウンロードし、BLHOSTでbootloaderと通信し外部からeFuseを読み書きが可能になります。

eFuseは、ブートコンフィグ、外部メモリアクセスのコンフィグ、キャッシュ設定など様々な設定を固定的に与えることが可能です。一度変更したビットは変更不可となりますが、eFuseマップ内の設定機能によってはソフトウェアでレジスタから上書き(eFuseを上書きする訳ではない)して動作を変更することも可能な機能もあります。