ciniml / rust-dap

CMSIS-DAP Rust implementation
Apache License 2.0
88 stars 10 forks source link

initial support for JTAG using PIO #57

Closed tnishinaga closed 8 months ago

tnishinaga commented 1 year ago

PIOでJTAG喋る機能を作りました。

https://github.com/ciniml/rust-dap/pull/55https://github.com/ciniml/rust-dap/pull/56 のコードを一部流用しているので、これらのPRが取り込まれてからconflict修正してdraftを外します。

動作確認方法

  1. boards/rpi_pico 以下で cargo build --no-default-features --features jtag を実行(set_clockを試すならそっちも追加)
  2. rpi_picoに書き込む
  3. GPIOをターゲットのJTAG端子に接続する
  4. openocd -f interface/cmsis-dap.cfg -c 'transport select jtag' -c 'adapter srst delay 3000' を実行する

うまく行けば以下のようなログが出て、TAP IDが見つかるはずです。

~/t/r/b/rpi_pico ❯❯❯ openocd -f interface/cmsis-dap.cfg -c 'transport select jtag' -c 'cmsis_dap_usb interface 2' -c 'adapter srst delay 3000'                                                                                                                                                                                                                                                                                     ✘ 130
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
jtag
adapter srst delay: 3000

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : An adapter speed is not selected in the init scripts. OpenOCD will try to run the adapter at the low speed (100 kHz)
Warn : To remove this warnings and achieve reasonable communication speed with the target, set "adapter speed" or "jtag_rclk" in the init scripts.
Info : Using CMSIS-DAPv2 interface with VID:PID=0x6666:0x4444, serial=raspberry-pi-pico-jtag
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 2.00
Info : CMSIS-DAP: Serial# = Piyo
Info : CMSIS-DAP: Interface Initialised (JTAG)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 100 kHz
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Info : cmsis-dap JTAG TLR_RESET
Info : cmsis-dap JTAG TLR_RESET
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : gdb services need one or more targets defined
^Cshutdown command invoked
Screenshot 2023-11-11 at 13 02 23

レビュアにお願いしたいこと

未確認事項

確認したいこと

tnishinaga commented 1 year ago

現実装だとadapter speed 1000 にしたときCPU側からのデータ送信が間に合わないことがわかったので、より高速化するならこのあたりに手を入れたほうが良さそうでした。 なにか良さそうな改善方法ないか考えてみます。

Screenshot 2023-11-12 at 3 30 55 Screenshot 2023-11-12 at 3 31 07
ciniml commented 11 months ago

pio.rsに自分のクレジットを追加しても良いでしょうか?

pio.rs は私は触ってないので、 @elfmimi さんが良ければ追加して構わないと思います。

tnishinaga commented 11 months ago

今の実装だとPIOの処理速度に対してCPUからFIFOに入れる速度が遅すぎる問題がありますが、今後の課題として一旦マージするのを目標とします。

tnishinaga commented 11 months ago

マージしたのでレビューReadyにします。

@elfmimi さん、pio.rs のファイルを分けて pio/mod.rspio/jtag.rs に私のCopyrightを入れさせていただきました。 こちら問題ないか確認していただけないでしょうか?

@ciniml さん、SWDとJTAGの両方問題なく動きそうか軽くご確認いただけないでしょうか?

elfmimi commented 11 months ago

やっとメンションに気付いたところです。試してみますね。

elfmimi commented 11 months ago

Longan Nano の GD32VF103 で動作確認しました。動いてますねー すごい。

こんな感じで1つのチップの中に2つtapがあります。

Info : JTAG tap: riscv.cpu tap/device found: 0x1000563d (mfg: 0x31e (Andes Technology Corporation), part: 0x0005, ver: 0x1)
Info : JTAG tap: gd32v.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing) Inc), part: 0x9000, ver: 0x7)

jtag.rs に関してこの部分はいらないと思います!

// original author(this code is based on swd.rs):
//      Copyright 2022 Ein Terakawa
tnishinaga commented 11 months ago

Longan Nano の GD32VF103 で動作確認しました。動いてますねー すごい。

こんな感じで1つのチップの中に2つtapがあります。

Info : JTAG tap: riscv.cpu tap/device found: 0x1000563d (mfg: 0x31e (Andes Technology Corporation), part: 0x0005, ver: 0x1)
Info : JTAG tap: gd32v.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing) Inc), part: 0x9000, ver: 0x7)

良かったです! 複数TAPでの動作が怪しいのはjtag_transferコマンドを使う辺りなのですが、pyocdもjtag_sequenceコマンドしか使ってないようなので検証方法から考えないと難しそうです。 https://github.com/ciniml/rust-dap/issues/59 で今後進めていければと思います。

jtag.rs に関してこの部分はいらないと思います!

// original author(this code is based on swd.rs):
//      Copyright 2022 Ein Terakawa

ありがとうございます。修正します。

elfmimi commented 11 months ago

前から気になっていることが一つあるので書いておきます。以下に関して分かっていることがあれば情報提供願いたいです。 PIOを使ったJTAGの場合、ピン割り当てに制約はあるでしょうか? 連番にする必要があったりするでしょうか? 番号を飛ばして指定した場合に利用しないピンをUART等他の機能から使えないといったことはあるでしょうか?

tnishinaga commented 11 months ago

PIOを使ったJTAGの場合、ピン割り当てに制約はあるでしょうか?

そうならないように作ったので、ピン割り当ての制約は無いはずです。

PIOではin・out・set・side-setごとにbaseピンを割り当てられるので、それぞれTDO・TDI・TMS・TCKピンと1対1対応されるよう割当をしています。 各命令で1ピンしか扱わない限りはピン割り当ての制約はできないので、今のところピン割り当ての制約はありません。

利用しないピンをUART等他の機能から使えないといったことはあるでしょうか?

その利用しないピンのfunctionをPIOに設定しない限り、使えないことはないと思います。

elfmimi commented 11 months ago

おお、素晴らしい。あまりに都合が良いのでPIOの設計者はJTAGも視野に置いていたんでしょうねって思えてきますね。解説ありがとうございます。

tnishinaga commented 8 months ago

@ciniml こちらいかがでしょうか?

ciniml commented 8 months ago

うーん、 CMD_CONNECT 失敗するな…

$ openocd -f interface/cmsis-dap.cfg -c 'transport select jtag' -c 'adapter srst delay 3000' -c 'adapter speed 1000'
Open On-Chip Debugger 0.11.0+dev-00662-g2fa3e2489-dirty (2022-05-08-00:38)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
jtag
adapter srst delay: 3000

adapter speed: 1000 kHz

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : Using CMSIS-DAPv2 interface with VID:PID=0x6666:0x4444, serial=raspberry-pi-pico-jtag
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 2.00
Info : CMSIS-DAP: Serial# = Piyo
Error: CMSIS-DAP command CMD_CONNECT failed.
tnishinaga commented 8 months ago

今夜確認します。 (エスパーになりますが、transportをswdにして動くなら、jtagのfeature使ってビルドされてないかもです)

ciniml commented 8 months ago

さすがに jtag にはしましたw

JTAGにしないと

Info : CMSIS-DAP: JTAG supported

ここでJTAG対応してないって怒られます。 masterブランチのbitbangでも動かないのでなんか別の要因かもしれない…

tnishinaga commented 8 months ago

失礼しました。たしかにそうですね 今夜再確認して(なおせそうなら治して)また報告しますー。

ciniml commented 8 months ago

対応遅くなってすみませんが、よろしくお願いします。

私も別PCでの挙動とか確認してみます。

tnishinaga commented 8 months ago

私の方は問題なく動きました。

~ ❯❯❯ openocd -f interface/cmsis-dap.cfg -c 'transport select jtag'                                                                                                                                    ✘ 1
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
jtag
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Warn : An adapter speed is not selected in the init scripts. OpenOCD will try to run the adapter at the low speed (100 kHz)
Warn : To remove this warnings and achieve reasonable communication speed with the target, set "adapter speed" or "jtag_rclk" in the init scripts.
Info : Using CMSIS-DAPv2 interface with VID:PID=0x6666:0x4444, serial=raspberry-pi-pico-jtag
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 2.00
Info : CMSIS-DAP: Serial# = Piyo
Info : CMSIS-DAP: Interface Initialised (JTAG)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 1 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 100 kHz
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Info : cmsis-dap JTAG TLR_RESET
Info : cmsis-dap JTAG TLR_RESET
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : gdb services need one or more targets defined
ciniml commented 8 months ago

別のRPi Picoにしたらつながった… 謎。

とはいえ結局まだLongan Nanoにつながらない。なんでだ。

ciniml commented 8 months ago

RPi4で試したらいけたので、なんかLongan Nanoがぶっ壊れてるとかかな…

image
openocd -f interface/cmsis-dap.cfg -c 'transport select jtag' -c 'adapter srst delay 3000' -c 'adapter speed 1000'
Open On-Chip Debugger 0.11.0+dev-00662-g2fa3e2489-dirty (2022-05-08-00:38)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
jtag
adapter srst delay: 3000

adapter speed: 1000 kHz

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : Using CMSIS-DAPv2 interface with VID:PID=0x6666:0x4444, serial=raspberry-pi-pico-jtag
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 2.00
Info : CMSIS-DAP: Serial# = Piyo
Info : CMSIS-DAP: Interface Initialised (JTAG)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 1 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Info : cmsis-dap JTAG TLR_RESET
Info : cmsis-dap JTAG TLR_RESET
Info : JTAG tap: auto0.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 4 -expected-id 0x4ba00477"
Warn : gdb services need one or more targets defined
ciniml commented 8 months ago

同じブランチでSWD版ビルドしたやつを書き込んだPicoを使ってJTAG版のPicoをデバッグしてたので、SWDの方も問題ないはず。

ciniml commented 8 months ago

というわけで、マージしよう。