5#include "libxr_def.hpp"
6#include "swd_protocol.hpp"
44 Swd& operator=(
const Swd&) =
delete;
115 uint32_t retries = 0;
120 if (ec != ErrorCode::OK)
122 resp.
ack = SwdProtocol::Ack::PROTOCOL;
134 if (resp.
ack != SwdProtocol::Ack::WAIT)
145 if (resp.
ack != SwdProtocol::Ack::OK)
155 return ErrorCode::OK;
169 ErrorCode
DpRead(SwdProtocol::DpReadReg reg, uint32_t& val, SwdProtocol::Ack& ack)
172 const ErrorCode EC =
Transfer(SwdProtocol::make_dp_read_req(reg), resp);
173 if (EC != ErrorCode::OK)
175 ack = SwdProtocol::Ack::PROTOCOL;
181 if (resp.
ack != SwdProtocol::Ack::OK || !resp.
parity_ok)
183 return ErrorCode::FAILED;
187 return ErrorCode::OK;
197 ErrorCode
DpWrite(SwdProtocol::DpWriteReg reg, uint32_t val, SwdProtocol::Ack& ack)
200 const ErrorCode EC =
Transfer(SwdProtocol::make_dp_write_req(reg, val), resp);
201 if (EC != ErrorCode::OK)
203 ack = SwdProtocol::Ack::PROTOCOL;
208 return (resp.
ack == SwdProtocol::Ack::OK) ? ErrorCode::OK : ErrorCode::FAILED;
218 ErrorCode
DpReadTxn(SwdProtocol::DpReadReg reg, uint32_t& val, SwdProtocol::Ack& ack)
221 const ErrorCode EC =
TransferWithRetry(SwdProtocol::make_dp_read_req(reg), resp);
224 if (EC != ErrorCode::OK)
229 if (resp.
ack != SwdProtocol::Ack::OK || !resp.
parity_ok)
231 return ErrorCode::FAILED;
235 return ErrorCode::OK;
245 ErrorCode
DpWriteTxn(SwdProtocol::DpWriteReg reg, uint32_t val, SwdProtocol::Ack& ack)
252 if (EC != ErrorCode::OK)
257 return (resp.
ack == SwdProtocol::Ack::OK) ? ErrorCode::OK : ErrorCode::FAILED;
274 ErrorCode
ApReadTxn(uint8_t addr2b, uint32_t& val, SwdProtocol::Ack& ack)
277 const ErrorCode EC =
TransferWithRetry(SwdProtocol::make_ap_read_req(addr2b), resp);
280 if (EC != ErrorCode::OK)
284 if (resp.
ack != SwdProtocol::Ack::OK)
286 return ErrorCode::FAILED;
289 return DpReadTxn(SwdProtocol::DpReadReg::RDBUFF, val, ack);
306 ErrorCode
ApReadPostedTxn(uint8_t addr2b, uint32_t& posted_val, SwdProtocol::Ack& ack)
309 const ErrorCode EC =
TransferWithRetry(SwdProtocol::make_ap_read_req(addr2b), resp);
312 if (EC != ErrorCode::OK)
316 if (resp.
ack != SwdProtocol::Ack::OK || !resp.
parity_ok)
318 return ErrorCode::FAILED;
321 posted_val = resp.
rdata;
322 return ErrorCode::OK;
333 return DpReadTxn(SwdProtocol::DpReadReg::RDBUFF, val, ack);
343 ErrorCode
ApWriteTxn(uint8_t addr2b, uint32_t val, SwdProtocol::Ack& ack)
350 if (EC != ErrorCode::OK)
355 return (resp.
ack == SwdProtocol::Ack::OK) ? ErrorCode::OK : ErrorCode::FAILED;
364 ErrorCode
ReadIdCode(uint32_t& idcode, SwdProtocol::Ack& ack)
366 return DpRead(SwdProtocol::DpReadReg::IDCODE, idcode, ack);
377 return DpWrite(SwdProtocol::DpWriteReg::ABORT, flags, ack);
388 return DpWriteTxn(SwdProtocol::DpWriteReg::ABORT, flags, ack);
406 ack = SwdProtocol::Ack::OK;
407 return ErrorCode::OK;
410 const ErrorCode EC =
DpWriteTxn(SwdProtocol::DpWriteReg::SELECT, select, ack);
411 if (EC == ErrorCode::OK && ack == SwdProtocol::Ack::OK)
442 virtual ErrorCode SeqWriteBits(uint32_t cycles,
const uint8_t* data_lsb_first) = 0;
446 virtual ErrorCode SeqReadBits(uint32_t cycles, uint8_t* out_lsb_first) = 0;
455 resp.
ack = SwdProtocol::Ack::PROTOCOL;
466 SwdProtocol::Ack ack = SwdProtocol::Ack::NO_ACK;
467 const uint32_t FLAGS =
468 SwdProtocol::DP_ABORT_STKCMPCLR | SwdProtocol::DP_ABORT_STKERRCLR |
469 SwdProtocol::DP_ABORT_WDERRCLR | SwdProtocol::DP_ABORT_ORUNERRCLR;
470 return DpWrite(SwdProtocol::DpWriteReg::ABORT, FLAGS, ack);
SWD 探针抽象基类,提供链路控制、传输与 DP/AP 辅助接口。 Abstract SWD probe base class providing link control,...
ErrorCode DpReadRdbuffTxn(uint32_t &val, SwdProtocol::Ack &ack)
读取 DP RDBUFF(带重试)。Read DP RDBUFF (with retry).
virtual ErrorCode SetClockHz(uint32_t hz)=0
设置 SWCLK 频率(可选)。Set SWCLK frequency (optional).
ErrorCode TransferWithRetry(const SwdProtocol::Request &req, SwdProtocol::Response &resp)
带重试的 SWD 传输封装(WAIT 重试 + IdleCycles 插入)。 SWD transfer wrapper with retry (WAIT retry + IdleCycles inse...
virtual ErrorCode LineReset()=0
执行 SWD 线复位。Perform SWD line reset.
ErrorCode WriteAbort(uint32_t flags, SwdProtocol::Ack &ack)
写入 DP ABORT(无重试)。Write DP ABORT (no retry).
ErrorCode WriteAbortTxn(uint32_t flags, SwdProtocol::Ack &ack)
写入 DP ABORT(带重试)。Write DP ABORT (with retry).
ErrorCode ReadIdCode(uint32_t &idcode, SwdProtocol::Ack &ack)
读取 DP IDCODE。Read DP IDCODE.
const TransferPolicy & GetTransferPolicy() const
获取传输策略。Get transfer policy.
Swd()=default
构造函数。Constructor.
ErrorCode ApReadTxn(uint8_t addr2b, uint32_t &val, SwdProtocol::Ack &ack)
AP 读事务(带重试,包含 RDBUFF 回读)。AP read transaction (with retry, with RDBUFF readback).
ErrorCode ClearStickyErrors()
清除 DP sticky 错误(尽力而为)。Clear DP sticky errors (best-effort).
virtual ~Swd()=default
虚析构函数。Virtual destructor.
ErrorCode ApWriteTxn(uint8_t addr2b, uint32_t val, SwdProtocol::Ack &ack)
AP 写事务(带重试)。AP write transaction (with retry).
void InvalidateSelectCache()
失效 SELECT 缓存。Invalidate SELECT cache.
ErrorCode DpWriteTxn(SwdProtocol::DpWriteReg reg, uint32_t val, SwdProtocol::Ack &ack)
DP 写事务(带重试)。DP write transaction (with retry).
static void ResetResponse(SwdProtocol::Response &resp)
重置响应结构体为默认值。Reset response to defaults.
virtual ErrorCode Transfer(const SwdProtocol::Request &req, SwdProtocol::Response &resp)=0
执行一次 SWD 传输(不含重试)。Perform one SWD transfer (no retry).
virtual ErrorCode EnterSwd()=0
进入 SWD 模式(如需从 JTAG 切换)。Enter SWD mode (e.g., switch from JTAG if needed).
ErrorCode DpWrite(SwdProtocol::DpWriteReg reg, uint32_t val, SwdProtocol::Ack &ack)
DP 寄存器写入(无重试)。DP register write (no retry).
virtual void Close()=0
关闭探针并释放资源。Close probe and release resources.
uint32_t select_cache_
SELECT 缓存值。SELECT cached value.
ErrorCode SetSelectCached(uint32_t select, SwdProtocol::Ack &ack)
写 SELECT(带缓存;命中则跳过写入)。Write SELECT with cache (skip write on hit).
ErrorCode DpRead(SwdProtocol::DpReadReg reg, uint32_t &val, SwdProtocol::Ack &ack)
DP 寄存器读取(无重试)。DP register read (no retry).
ErrorCode ApReadPostedTxn(uint8_t addr2b, uint32_t &posted_val, SwdProtocol::Ack &ack)
AP 读事务(带重试,不读 RDBUFF;返回 posted 数据)。 AP read transaction (with retry, no RDBUFF; returns posted data).
void SetTransferPolicy(const TransferPolicy &policy)
设置传输策略。Set transfer policy.
ErrorCode DpReadTxn(SwdProtocol::DpReadReg reg, uint32_t &val, SwdProtocol::Ack &ack)
DP 读事务(带重试)。DP read transaction (with retry).
TransferPolicy policy_
传输策略。Transfer policy.
virtual void IdleClocks(uint32_t cycles)=0
插入空闲时钟周期。Insert idle clock cycles.
bool select_valid_
SELECT 缓存是否有效。SELECT cache valid.
传输策略(WAIT 重试与空闲周期插入)。Transfer policy (WAIT retry & idle insertion).
uint8_t idle_cycles
空闲周期数。Idle cycles.
bool clear_sticky_on_fault
FAULT 时清除 sticky 错误。Clear sticky errors on FAULT.
uint16_t wait_retry
WAIT 最大重试次数。Maximum WAIT retries.
SWD 传输请求 / SWD transfer request.
SWD 传输响应 / SWD transfer response.
bool parity_ok
奇偶校验是否正确 / Whether parity is OK
uint32_t rdata
读数据(仅读响应有效)/ Read data (valid for read responses)