Ultra96ボードのJTAGバウンダリスキャンができた
Ultra96ボードを使ってZYNQ UltraScale+ MPSoC(以下、ZUと略)のJTAGの仕組みを解明しています。
まず、ZUは本体のPLのJTAGのほか、ARMのDAPや、ダミーのDAPが付いたりして、JTAGチェーンの構成が変わります。JTAGチェーンの構成はおそらくFSBLの中からCSUレジスタを操作することで行われますが、デフォルトのFSBLでは以下のようになります。
ここで厄介なことが3つあります。JTAGチェーンの構成が変わるたびに、JTAGのTMSを1にして何回かのTCKを与えてTAPをRESETしないといけないことと、JTAGチェーンの構成はソフトで変わることです。そのため、ハードウェアリセットが行われて、PMU→CSU→FSBLと起動のステップが進んだあたりでJTAGをリセットしなければなりません。
また、ZUのARM TAPはJTAGの規格に反してTAP RESET後にDRにIDCODEが現れません。そのため、自動で認識することができないことです。
![]()
JTAGを使う汎用的なツールに「MITOUJTAG(みとうジェイタグ)」というのがあります。MITOUJTAGを使うとバウンダリスキャンで端子の状態が見えます。
Ultra96ボードでは以下のように見えます。
Ultra96ボードでチカチカ光っているLEDのあたりのピンを見てみます。
AB4、AA4、Y5、AA3、AB5番ピンにこれらの端子があります。
ZUでは、普通にバウンダリスキャンでSAMPLEしても、これらの端子の状態は正しく見ることができません。
前の記事で書いたとおり、SAMPLEするときには入力セルから値を読むのが普通なのですが、

ZUではなぜか出力セルから入力値が読み込まれるからです。

これは、はっきり言って、ZUのバグだと思います。
しかも、この入力ピンの値が出力セルから読み出される現象は、SAMPLE時のみ発生し、EXTEST時には発生しません。したがって、BSDLファイルの変更では対処できません。
そこで、MITOUJTAGでは、「ZYNQUltraScale+ MPSoCならば、SAMPLE状態のときに、入力セルと出力セルの読み出した値を入れ替える」という方法でこの問題に対処することにしました。
このようにすることで、端子から出力している値と、端子から入力している値を正しく読み出すことに成功しました。
![]()
以上の問題を解決し、Ultra96ボードでLinuxが起動する時の波形を見ることに成功しました。
まずは下の波形をご覧ください。
UART0_TXに間欠的に動く波形が出ています。これはコンソールへの文字出力です。
起動してから5秒と8秒付近で、それぞれLinuxの起動と、BlueToothとWLANの起動が起こります。このときにMIOのピンの出力状態が変わるのが見てとれます。
起動後8秒後くらいというのは、コンソールにこのような文字列が出力されているあたりです。
LED0(緑のLED)がチカチカを開始するのが見えています。
あと、見て面白いのは起動後8秒付近でUSB1が起動することと、SD1に一瞬だけアクセスすることかなと思います。
![]()
UltraScale+のJTAGの仕組みがだいたい解明できました。
ポイントは、
- CSUやFSBLによってソフト的にJTAGチェーンの構成が変わるので、それに合わせてTAP RESETをしなければならない
- SAMPLE時の入力セルと出力セルが逆になっている
- DDR4メモリの端子は見えない(これもチップのバグかもしれない)
MITOUJTAGでは、このような問題に対処するためのUltraScale+用のパッチを提供する用意があります。
| 固定リンク











コメント