ZYNQ UltraScale+ MPSoCのJTAGのしくみ
ZYNQ UltraScale+ MPSoC(以下、ZU)の仕組みを完全に理解しました。
ZUの中にあるJTAGの構造をかみ砕いて描くと、こうなります。
ZUの内部には、PS TAP、PL TAP、ARM DAPという3つのJTAGコンポーネントが入っています。
- PS TAPはPSの制御に使われるもので、JTAGステータスを見たりPMU(実体はMicroblaze)のデバッグポート(MDM)に接続されています。
- PL TAPはPLのバウンダリスキャンやFPGA部分のコンフィグに使われます。
- ARM DAPはCortex CPUのデバッグに使われます。
PL TAPとARM DAPは、デフォルトではDummyのほうを選択されていて、本体は無効になっています。また、PMU MDMとPL TAPとARM DAPにはセキュリティゲートというのがあって、勝手にデバッグをさせないようになっています。
セキュリティゲートは電源ON時やセキュアブートの時、eFUSEが切られているときには有効になっていて、JTAGが突破できません。
しかし、非セキュアブート(つまり普通のブート)するときには、CSUのROMのコードにってセキュリティゲートは無効になり、JTAGアクセスできるようになります。したがって、普通に起動した場合にはJTAGは使えるので、セキュリティゲートを気にする必要はありません。
ZYNQ UltraScale+ MPSoCのJTAG命令レジスタの構造は次の図のようになっています。
ただし、PSとPLのIRは合わせて12bitという扱いなので、個別にコマンドを与えることはありません。PLのDRの長さは0bitになることもあります。
あまりPSとPL TAPを分離して考える必要はありませんが、ZUのJTAGのコマンドを解読していくときに、6bitごとに切って考えると理解しやすいところがあります。
ただし、PL TAPも一人前にIDCODEを持っていて、XCZU3EGのPSのIDCODEが0x14710093なのに対して、PLのIDCODEは0x14A42093でした。
このPL IDCODEは特別な命令IDCODE_PL(0x925)やIDCODE_PSPL(0x265)を発行すると読めます。
JTAGのTDIから入ってきた信号はPS TAPを通った後、PL TAPかDummy TAPを通ります。その後、ARM DAPかDummy DAPを通ります。どちらを通るかというのは、PS TAPに対して発行するJTAG_CTRLコマンドで指定します。
具体的には、JTAG_CTRLコマンド(0x83F)をPS-PLに発行して、そのあと、0x00000003をDRに書き込みます。
SVF形式で書くなら、
STATE RESET; TDR 0; HDR 1 TDO (1); // ARMのDAPを無視するため SIR 16 TDI (83FF) ; // JTAG_CTRL SDR 32 TDI (00000003) ; // ARM DAPとPL TAPを有効化 RUNTEST RESET 16 TCK; // 切り替えた後は、Test-Logic-Resetステートで5回以上 TCKをトグルする
となります。
こうすることで、PL TAPとARM DAPが有効になって、MITOUJTAGの自動認識でも2個のデバイスが見つかるようになりました。
そして、ARMのDAPも認識されるようになり、正常にバウンダリスキャンができるようになります。
まとめると
- ZYNQ UltraScale+ MPSoCのIRの長さは常に16bit
- 非セキュアブートではセキュリティゲートは無効になっていて、突破できる
- リセット後は、PL TAPとARM DAPはDummyが選択されているので、バウンダリスキャンやコンフィギュレーションをするなら、JTAG_CTRLコマンドで有効にしなければならない
- PMUがJTAGでデバッグできそうだ
となります。
| 固定リンク
コメント