Closed tnishinaga closed 8 months ago
現実装だとadapter speed 1000
にしたときCPU側からのデータ送信が間に合わないことがわかったので、より高速化するならこのあたりに手を入れたほうが良さそうでした。
なにか良さそうな改善方法ないか考えてみます。
pio.rsに自分のクレジットを追加しても良いでしょうか?
pio.rs
は私は触ってないので、 @elfmimi さんが良ければ追加して構わないと思います。
今の実装だとPIOの処理速度に対してCPUからFIFOに入れる速度が遅すぎる問題がありますが、今後の課題として一旦マージするのを目標とします。
マージしたのでレビューReadyにします。
@elfmimi さん、pio.rs
のファイルを分けて pio/mod.rs
とpio/jtag.rs
に私のCopyrightを入れさせていただきました。
こちら問題ないか確認していただけないでしょうか?
@ciniml さん、SWDとJTAGの両方問題なく動きそうか軽くご確認いただけないでしょうか?
やっとメンションに気付いたところです。試してみますね。
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
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
ありがとうございます。修正します。
前から気になっていることが一つあるので書いておきます。以下に関して分かっていることがあれば情報提供願いたいです。 PIOを使ったJTAGの場合、ピン割り当てに制約はあるでしょうか? 連番にする必要があったりするでしょうか? 番号を飛ばして指定した場合に利用しないピンをUART等他の機能から使えないといったことはあるでしょうか?
PIOを使ったJTAGの場合、ピン割り当てに制約はあるでしょうか?
そうならないように作ったので、ピン割り当ての制約は無いはずです。
PIOではin・out・set・side-setごとにbaseピンを割り当てられるので、それぞれTDO・TDI・TMS・TCKピンと1対1対応されるよう割当をしています。 各命令で1ピンしか扱わない限りはピン割り当ての制約はできないので、今のところピン割り当ての制約はありません。
利用しないピンをUART等他の機能から使えないといったことはあるでしょうか?
その利用しないピンのfunctionをPIOに設定しない限り、使えないことはないと思います。
おお、素晴らしい。あまりに都合が良いのでPIOの設計者はJTAGも視野に置いていたんでしょうねって思えてきますね。解説ありがとうございます。
@ciniml こちらいかがでしょうか?
うーん、 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.
今夜確認します。 (エスパーになりますが、transportをswdにして動くなら、jtagのfeature使ってビルドされてないかもです)
さすがに jtag
にはしましたw
JTAGにしないと
Info : CMSIS-DAP: JTAG supported
ここでJTAG対応してないって怒られます。 masterブランチのbitbangでも動かないのでなんか別の要因かもしれない…
失礼しました。たしかにそうですね 今夜再確認して(なおせそうなら治して)また報告しますー。
対応遅くなってすみませんが、よろしくお願いします。
私も別PCでの挙動とか確認してみます。
私の方は問題なく動きました。
~ ❯❯❯ 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
別のRPi Picoにしたらつながった… 謎。
とはいえ結局まだLongan Nanoにつながらない。なんでだ。
RPi4で試したらいけたので、なんかLongan Nanoがぶっ壊れてるとかかな…
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
同じブランチでSWD版ビルドしたやつを書き込んだPicoを使ってJTAG版のPicoをデバッグしてたので、SWDの方も問題ないはず。
というわけで、マージしよう。
PIOでJTAG喋る機能を作りました。
https://github.com/ciniml/rust-dap/pull/55 と https://github.com/ciniml/rust-dap/pull/56 のコードを一部流用しているので、これらのPRが取り込まれてからconflict修正してdraftを外します。
動作確認方法
boards/rpi_pico
以下でcargo build --no-default-features --features jtag
を実行(set_clockを試すならそっちも追加)openocd -f interface/cmsis-dap.cfg -c 'transport select jtag' -c 'adapter srst delay 3000'
を実行するうまく行けば以下のようなログが出て、TAP IDが見つかるはずです。
レビュアにお願いしたいこと
未確認事項
確認したいこと