ciniml / rust-dap

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

swj_clockでクロック設定できるようにする。 #31

Closed ciniml closed 2 years ago

ciniml commented 2 years ago

遅いMCUにも対応できるように swj_clock 設定できるようにする。

https://github.com/ciniml/rust-dap/issues/24

ciniml commented 2 years ago

swj_clock を追加する。 &mut SwdIoConfig を渡すので、そのあたりで設定変更が可能。 &mut self なのでいろいろできる…はず。


pub trait SwdIo {
    fn connect(&mut self);
    fn disconnect(&mut self);
    fn swj_clock(&mut self, config: &mut SwdIoConfig, frequency_hz: u32) -> core::result::Result<(), DapError>;
    fn swj_sequence(&mut self, config: &SwdIoConfig, count: usize, data: &[u8]);
    fn swd_read_sequence(&mut self, config: &SwdIoConfig, count: usize, data: &mut [u8]);
    fn swd_write_sequence(&mut self, config: &SwdIoConfig, count: usize, data: &[u8]);
    fn swd_transfer(
        &mut self,
        config: &SwdIoConfig,
        request: SwdRequest,
        data: u32,
    ) -> core::result::Result<u32, DapError>;
    fn enable_output(&mut self);
    fn disable_output(&mut self);
}
ciniml commented 2 years ago

PIOの実装は newPIOBuilder で構築以降は分周器の設定できなさそうなのでどうしたものか…

        let (sm, rx, tx) = hal::pio::PIOBuilder::from_program(installed)
            .set_pins(clk_pin_id, 1)
            .side_set_pin_base(clk_pin_id)
            .out_pins(dat_pin_id, 1)
            .out_shift_direction(hal::pio::ShiftDirection::Right)
            .in_pin_base(dat_pin_id)
            .in_shift_direction(hal::pio::ShiftDirection::Right)
            .clock_divisor(div)
            .build(sm0);
ciniml commented 2 years ago

UninitStateMachine じゃないと set_clock_divisor 呼べないので、初期化したsmを再初期化するようにしないといけなさそう。

ciniml commented 2 years ago

とりあえず実装してみたので実験中

ciniml commented 2 years ago

probe-run --probe raspberry-pi-pico --chip RP2040 --speed 1000 として 1000[kHz] 指定で書き込んだ時の挙動

image
ciniml commented 2 years ago

--speed 20000 としたとき。 15.625[MHz] がハードウェアの上限なので、上限になっている。

image
ciniml commented 2 years ago

100[kHz]設定。おそいw

image
ciniml commented 2 years ago

デフォルトはとりあえず無効化。 rust-dap-rp2040pio_set_clock featureつけると有効になる。

https://github.com/ciniml/rust-dap/tree/24-implement_clock_speed

ciniml commented 2 years ago

probe-run はデフォルトだと1[MHz] になるっぽい。

ciniml commented 2 years ago

JTAG実装版をマージして修正箇所を調整。 対応featureは set_clock に変更。

とりあえずJTAG側もSWDに合わせて実装。TCKが adapter speed で指定したクロック未満になることは確認 (あまり正確ではない)

image