はじめに
U-Boot v2019.xx や v2020.xx など、比較的最近のバージョンの U-Boot を Arm® DS(旧 DS-5)デバッガーに接続した状態で実行すると、JTAG 関連のエラーが表示されてデバッガーからの操作が効かない状態となってしまうケースがあります。
この記事では発生するエラーと原因&対策について説明します。
1. エラーの内容
- エラーメッセージ
ERROR 87 returned when flushing to JTAG server
ERROR 35 unlocking DAP, OpenID 0xXXXXXXXX
- エラー発生時の画面イメージ
【図 1】JTAG 関連エラーの表示
2. エラーの原因
U-Boot のコードに実装される以下のレジスターを書き換える処理がエラーの原因となっています。
参考: Cyclone V HPS Register Address Map and Definitions - sysmgr.ctrl レジスター
【図 2】System Mangaer 配下の Scan Manager Group レジスター(sysmgr.ctrl)
System Mangaer 配下の Scan Manager Group レジスター(sysmgr.ctrl)の fpgajtagen フィールドを 0x1 にセットすることにより、JTAG の制御権が、FPGA JTAG ピンから Scan Manager へ切り替わってしまいます。
その結果、JTAG ピン経由で接続されるデバッガーからは制御が効かなくなってしまいます。
例として U-Boot 2020.10 に実装される該当処理は arch/arm/mach-socfpga/scan_manager.c ファイルの以下の部分となります。
- 対象ファイル
| arch/arm/mach-socfpga/scan_manager.c |
- 原因となる処理(赤枠内)
【図 3】scan_manager.c ファイル内の該当処理部分
3. 対策
原因の処理がビルド対象とならないように、U-Boot のコンフィグレーションを変更することで対策可能でした。
以下は U-Boot 2020.10 での対策の例です。下記 (1)、(2) の 2 箇所を変更します。
(1)
U-Boot ソースツリーの configs/socfpga_xxx_defconfig ファイルにおいて CONFIG_DISPLAY_CPUINFO を無効 に設定します。
ご使用の socfpga_xxx_defconfig ファイル内に CONFIG_DISPLAY_CPUINFO の記述がある場合は、先頭に # を追記してコメントアウトすることで無効化します。
ご使用の socfpga_xxx_defconfig ファイル内に CONFIG_DISPLAY_CPUINFO の記述が無い場合でも、明示的に CONFIG_DISPLAY_CPUINFO=n を追記して無効化します。
注記:下図は socfpga_cyclone5_defconfig の例です。
【図 4】socfpga_xxx_defconfig ファイルに CONFIG_DISPLAY_CPUINFO=n を追記
(2)
U-Boot ソースツリーの arch/arm/Kconfig ファイルにおいて、DISPLAY_CPUINFO 無効時は ARCH_MISC_INIT を有効化しないように記述を変更します。
注記:下図は cyclone5 の例です。
(変更前) select ARCH_MISC_INIT if !TARGET_SOCFPGA_ARRIA10
(変更後) select ARCH_MISC_INIT if DISPLAY_CPUINFO && !TARGET_SOCFPGA_ARRIA10
【図 5】Kconfig ファイルに DISPLAY_CPUINFO 無効時は ARCH_MISC_INIT を有効化しないように記述変更
(3)
上記 (1)、(2) の対策実施後は、変更した socfpga_xxx_defconfig ファイルを使用して、以下のコマンドを実行して U-Boot を再度ビルドします。
$ make socfpga_xxx_defconfig
$ make -j 24
Arm® DS(DS-5)デバッガーでエラーが出なくなると下図のようになるはずです。
【図 6】対策実施後 Arm® DS(DS-5)デバッガーでエラーが出なくなった場合の表示
おわりに
今回紹介した方法によりエラーの回避が可能なことは確認できておりますが、こちらは暫定の対策方法とお考え下さい。
今後の U-Boot バージョンで対策が行われる可能性もありますので、その場合は新しい U-Boot バージョンに適用された対策に合わせてご対応ください。