ciniml / rust-dap

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

bitbang版のswj_pinsコマンドの挙動がpio版と異なる #60

Open tnishinaga opened 11 months ago

tnishinaga commented 11 months ago

bitbangとpioでswj_pinsの挙動が異なる

  • bitbangはSWJ_PinsコマンドのPin Selectで指定されたpinのdirectionを変更する
  • PIOはpinのdirectionを変更しない(こちらの方がDAP Linkのコードの挙動に近いはずですが、誤りがあれば教えてください) https://github.com/ciniml/rust-dap/pull/55#issue-1943977934

DAP Linkの挙動にあわせるなら、bitbang側もpinのdirectionを変更しないように修正が必要です。 pio版ができた今bitbang版開発の優先度は下がったと考えているので、希望があれば治すくらいの気持ちでいます。

elfmimi commented 11 months ago

リセットの挙動を実際に見てみたのですが、pioの方もbitbangの方も想定される動作と異なる部分があるようです。 どちらも修正していきたいですね。

tnishinaga commented 11 months ago

リセットの挙動を実際に見てみたのですが、pioの方もbitbangの方も想定される動作と異なる部分があるようです。

確認ありがとうございます。 どのあたりが違っていそうでしたか?

elfmimi commented 11 months ago

まず、テスト環境として pyOCD を活用していることを述べておきます。 pyOCD に commander モードというのがあり、簡易なコマンド処理が出来るようになっています。 コマンドには以下のようなものがあります。 set nreset 1 RSTピンをHighにする set nreset 0 RSTピンをLowにする show nreset RSTピンの状態を表示する

PIOの場合 プローブの起動後・リセット後 ⇒ (一瞬だけLow のちHigh のち) Hi-Z set nreset 1 ⇒ (一瞬だけLow のち) High set nreset 0 ⇒ Low show nreset ⇒ Low

bitbangの場合 プローブの起動後・リセット後 ⇒ (一瞬だけLow のち) High set nreset 1 ⇒ 一瞬だけHi-Z のちHigh set nreset 0 ⇒ 一瞬だけLow のちHigh show nreset ⇒ 一瞬だけHi-Z のちHigh

というような挙動です。(細かく誤りがあるかもしれません)


リセット時の挙動 および PIOの場合 の set nreset 1 の項目を修正しました。 (2023/12/02)

tnishinaga commented 11 months ago

ありがとうございます。

bitbangの方はdelayをまともに作れてないせいもあるとおもうのですが、なんか変なことになっていますね。

PIOの方の挙動をまず整えたいのですが、こちらはARMの作った既存のCMSIS-DAP実装と比べて挙動の差異はありましたか?

elfmimi commented 11 months ago

何が正解かはじっくり調べるのがよいと思いますが、想定される挙動はこういう感じだと思っています。

案1 プローブの起動後・リセット後 ⇒ Hi-Z connect ⇒ High set nreset 1 ⇒ High set nreset 0 ⇒ Low show nreset ⇒ そのまま disconnect ⇒ Hi-Z

案2 プローブの起動後・リセット後 ⇒ Hi-Z connect ⇒ そのまま set nreset 1 ⇒ Hi-Z set nreset 0 ⇒ Low show nreset ⇒ そのまま disconnect ⇒ そのまま