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.MXRT1060SDPHOSTとは?
SDPHOSTは、PCと接続させてPC側からi.MXRTの内蔵RAMやレジスタの読み書きを可能にするコマンドラインツールです。
このSDPHOSTを利用することで、ブータブルイメージの書き込みや製品量産時のファンクションテスト、ブータブルイメージ(今回はbootloader)へのアドレスジャンプなどが容易にできるようになっています。
BLHOSTとは?
BLHOSTも同様にコマンドラインツールでbootloaderと通信し、フラッシュROMへのファームウェアの書き込み、RAMの読み書き、eFuseの読み書きが行えます。SPDHOSTではeFuseにはアクセスできないのに対し、BLHOST(bootloaderを介して)では、eFuseにアクセスできるようになります。
eFuseの書き換え手順
それでは、eFuseの書き換え、読み込みの手順を順を追って見ていきます。以下手順はWin10でのコマンドになります。
- Flashloaderのダウンロードとインストール
- PCでSDPHOST接続の確認
$ sdphost -p COMxx — read-register 0x0000 - bootloaderを内蔵RAMに書き込む
$ sdphost -p COMxx — write-file 0x20000000 “../../mfgtools-rel/Profiles/MXRT106X/OS Firmware/ivt_flashloader.bin” - 指定メモリアドレス(bootloader)にジャンプし、bootloaderを実行
$ sdphost -p COMxx — jump-adress 0x20000400 - BLHOSTのフォルダーに移動後、PCでBLHOSTを起動、動作確認
$ blhost -p COMxx — get-property 1 - eFuseデータの書き込み、または読み込み(下記コマンドは例)
$ blhost -p COMxx — efuse-program-once 0x2F 0000005A
具体的なeFuse書き換え、読み込み方法は、これから説明していきます。
SDPHOSTというコマンドラインツールで、eFuseにアクセスできれば早いんですが、どういう訳かSDPHOSTではeFuseにアクセスできない仕様になっています。
セキュリティの仕様なんだと思いますが、ちょっと面倒臭いです。
詳細な手順
1)FlashLoaderのダウンロードと解凍
ダウンロードしたFlashloaderは圧縮されているので、任意の場所に解凍します。
2)SDPHOST接続の確認
まず、SDPHOSTを起動し、i.MXRTのシリアル通信を確認していきます。
SDPHOSTは、UARTもしくはUSBでの接続が可能です。
シリアルダウンローダーモードの設定
SDPHOSTと通信するために、i.MXRTのBOOT MODEをシリアルダウンローダーモードに設定します。これで、電源起動時に内蔵BOOT ROMで起動し、シリアルダウンローダーモード(SDPHOST)に入ります。
SW7を0001bに設定します。
具体的には、SW7のディップスイッチを左からLOW, LOW, LOW, HIGHに設定します。下の写真のディップスイッチは使い込んでいるため少し汚れていて見づらいですが、一番右端のスイッチがHIGHになっていることろです。

a)シリアル通信(UART)を使う場合:
USB上のバーチャルCOMを使用して接続します。
電源設定のジャンパ(J1)を、5−6に接続する。
USBケーブルをPC(ここではMacOSを使用します)に接続し、i.MXRT1060-EVKのJ41のUSBコネクタに接続します。
以下MacOSの場合の手順は、動作を確認出来ていません。参考程度に読んでください。
次に、Mac側のシリアルポート番号の確認をします。
MacOS では、Macのターミナル を開き、次のようにコマンドを実行してみる。
$ ls /dev/{tty,cu}.*

この場合、「cu.usbmodem14202」と「tty.usbmodem14202」が認識されているけど、cu.usbmodem14202の方でないと上手くいきません。
また、usbmodemの後ろの番号は、環境によって異なりますので注意です。
ポートが確認できたら、以下のようにコマンドを実行して、SDPHOSTの動作を確認します。
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バイトの数字が表示されます。

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番地をリードするコマンドです。
Windowsの場合(i.MXRT16xの場合):<install-path>/Tools/sdphost/win$ sdphost.exe -u 0x1fc9,0x135 — read-register 0x0000 注意:上記コマンドの–について、フォントの関係でread-register 前のハイフンは、一つのダッシュ(ハイフン)に見えますが、実際にはハイフンが二つ連続(- -)しています。
実行結果は、以下のようになります。

上記結果では、Flashloaderは、RT1050用の物を使用していますが、RT1060にも使用可能です。気になる方は、きちんとi.MXRT1060専用のFlashloaderを使いましょう。
3)bootloaderを内蔵RAMに書き込む
次に、bootloaderをi.MXRTのRAMに書き込んでいきます。
実行例は、4)指定メモリへのジャンプ↓の画像を参照ください。
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を使用することをおすすめします。
Windowsの場合:<install-path>/Tools/sdphost/win$ sdphost.exe -p COMxx — jump-address 0x20000400

5)BLHOSTを起動、動作確認
書き込んだbootloaderの動作確認を行います。
bootloaderのコマンドをインジェクトして、そのレスポンスを確認してみます。
まず、前準備として、ターミナル (コマンドライン)で、blhostファイルまでカレントディレクトリを移動します。
MacOSの場合:$cd ../../blhost/mac
Windowsの場合:$cd ../../blhost/win
$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ドライバがセグメンテーションフォルトを起こしてしまうようです。
私の環境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”が指定されたビットフィールドは無視されます。

読み込みの時は、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のシャドウレジスタにリロードをしてくれるので、書き込み後すぐにシャドウレジスタをリードして正しくヒューズが切れたか確認することが出来ます。

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

7. eFuseのデータリード

無事、書き込みが出来ました。めでたし、めでたし!
まとめ
i.MXRTのeFuseの書き換え、読み込みは、Flashloaderツールを使用することで可能です。
SDPHOST、BLHOST、Flashloader(bootloader)の3つのツールを使用します。
SDPHOSTでbootloaderを内部SRAMにダウンロードし、BLHOSTでbootloaderと通信し外部からeFuseを読み書きが可能になります。
eFuseは、ブートコンフィグ、外部メモリアクセスのコンフィグ、キャッシュ設定など様々な設定を固定的に与えることが可能です。一度変更したビットは変更不可となりますが、eFuseマップ内の設定機能によってはソフトウェアでレジスタから上書き(eFuseを上書きする訳ではない)して動作を変更することも可能な機能もあります。