Closed ciniml closed 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);
}
PIOの実装は new
で PIOBuilder
で構築以降は分周器の設定できなさそうなのでどうしたものか…
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);
UninitStateMachine
じゃないと set_clock_divisor
呼べないので、初期化したsmを再初期化するようにしないといけなさそう。
とりあえず実装してみたので実験中
probe-run --probe raspberry-pi-pico --chip RP2040 --speed 1000
として 1000[kHz]
指定で書き込んだ時の挙動
--speed 20000
としたとき。 15.625[MHz] がハードウェアの上限なので、上限になっている。
100[kHz]設定。おそいw
デフォルトはとりあえず無効化。 rust-dap-rp2040
で pio_set_clock
featureつけると有効になる。
https://github.com/ciniml/rust-dap/tree/24-implement_clock_speed
probe-run
はデフォルトだと1[MHz]
になるっぽい。
JTAG実装版をマージして修正箇所を調整。 対応featureは set_clock
に変更。
とりあえずJTAG側もSWDに合わせて実装。TCKが adapter speed
で指定したクロック未満になることは確認 (あまり正確ではない)
遅いMCUにも対応できるように
swj_clock
設定できるようにする。https://github.com/ciniml/rust-dap/issues/24