ciniml / rust-dap

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

Initial support the nRESET pin for bitbang and PIO #55

Closed tnishinaga closed 1 year ago

tnishinaga commented 1 year ago

https://github.com/ciniml/rust-dap/pull/54 の続きです。

pioでもnRESETを使えるようにしてみました。

動作確認方法は #54 と同様です。

課題

ciniml commented 1 year ago

すばらしい。 今日はイベントがあって終わるまで見れないので、明日になると思います。

elfmimi commented 1 year ago

この件、コメントを求められているような気がしていて、そしてコメントしたいとも思っていたんですが、 なかなか出来ていませんでした。 Rust を深く理解したいのですが、まだ十分ではない気がして。

大きな点は PIO のプログラム複数を動的に差し替えて使うようになったという事ですね。 個人的には子細な動作の検証が難しそうだと思って避けていたんですが、 正しく動くのであればこういう方向に進んでいくしかないんでしょうね。 この流れで JTAG と SWD の両対応が視野に入って来ます。

リセット周りを動作確認することになるなら、この件(#40) も同時に対応してしまいたいです。

tnishinaga commented 1 year ago

正しく動くのであればこういう方向に進んでいくしかないんでしょうね。

今のところ正しく動いていそうです。 入れ替えのコストはわかりませんが、SWJ_Pinsが呼ばれるのはOpenOCD接続時くらいなので大丈夫そうと考えています。

リセット周りを動作確認することになるなら、https://github.com/ciniml/rust-dap/issues/40 も同時に対応してしまいたいです。

この点に関しては、未検証です。

ciniml commented 1 year ago

PIOはpinのdirectionを変更しない(こちらの方がDAP Linkのコードの挙動に近いはずですが、誤りがあれば教えてください)

bitbangのswj_pins、なんでこうなってるんだっけ?と思ったけど、よく考えたらこれ実装してくれたの @tnishinaga さんでしたっけ? DAPLinkは確かにピン方向変えるようになってないので、気になるなら変更してもいいと思います。 (あまりどちらでも実際のSWD/JTAGの通信に影響はなさそうですけども)

tnishinaga commented 1 year ago

bitbangのswj_pins、なんでこうなってるんだっけ?

これは実装当時の私がそういう挙動が正しいと思って実装したのですが、今回読み直したら間違っていたという感じです。 一旦こちらは取り込んだ後、Issueをたてるのはいかがでしょうか?

ciniml commented 1 year ago

とりあえずコード自体は確認しました。

PIOのプログラム入れ替えも実際はPIOの命令メモリへの高々32ワード分の書き込みで、PIO自体はCPUクロックと同じ速度でうごいていて、AHB Lite経由での同一クロックドメインでのアクセスなのでスループットはCPUのメモリバスと同等として、SRAMからの32ワード分のmemcpyするのと同じなので、まあたぶん最大でも100サイクルくらい?ですし、許容範囲かなと思います。 (測ってないけど)

tnishinaga commented 1 year ago

ありがとうございます。

まあたぶん最大でも100サイクルくらい?ですし、許容範囲かなと思います。

はい。あんまりコストでもないし、頻繁に入れ替えることもない(初回以外はずっと既存のSWDプログラムが動き続ける)ので多分大丈夫と考えています。

tnishinaga commented 1 year ago

問題なさそうでしたらマージお願いします 🙏

ciniml commented 1 year ago

RPi PicoでSWD構成だとなんかpanicしてますね。

ciniml commented 1 year ago
(HOST) INFO  success!
RTT logs not available; blocking until the device halts..
────────────────────────────────────────────────────────────────────────────────
^C────────────────────────────────────────────────────────────────────────────────
stack backtrace:
   0: rust_begin_unwind
        at /home/kenta/.cargo/registry/src/index.crates.io-6f17d22bba15001f/panic-halt-0.2.0/src/lib.rs:32:5
   1: core::panicking::panic_fmt
        at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/panicking.rs:67:14
   2: core::panicking::panic
        at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/panicking.rs:117:5
   3: rp2040_hal::pio::PIOBuilder<P>::set_pins
        at /home/kenta/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rp2040-hal-0.8.2/src/pio.rs:1948:9
   4: rust_dap_rp2040::pio::SwdIoSet<C,D,E>::build_pio
        at /home/kenta/repos/rust-dap/support_reset_pin_pio/rust-dap-rp2040/src/pio.rs:311:14
   5: rust_dap_rp2040::pio::SwdIoSet<rp2040_hal::gpio::pin::Pin<C,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>,rp2040_hal::gpio::pin::Pin<D,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>,rp2040_hal::gpio::pin::Pin<E,rp2040_hal::gpio::pin::Function<rp2040_pac::PIO0>>>::new
        at /home/kenta/repos/rust-dap/support_reset_pin_pio/rust-dap-rp2040/src/pio.rs:257:28
   6: rust_dap_raspberrypi_pico::app::init
        at src/main.rs:211:25
   7: rust_dap_raspberrypi_pico::app::rtic_ext::main::{{closure}}
        at src/main.rs:20:1
   8: rust_dap_raspberrypi_pico::app::rtic_ext::main::__rtic_init_resources
        at src/main.rs:20:1
   9: main
        at src/main.rs:20:1
  10: Reset
(HOST) WARN  call stack was corrupted; unwinding could not be completed
(HOST) INFO  device halted by user
ciniml commented 1 year ago

set_pin_count5 までなので、 Self::build_pio((0,32)Self::build_pio((0,5) にしないとダメそう

ciniml commented 1 year ago

修正確認しました。 SWDでのデバッグとnRESET の動作確認もOKです。マージします。