57 SwdPort& swd_link,
LibXR::GPIO* nreset_gpio =
nullptr,
69 InitWinUsbDescriptors();
137 UpdateWinUsbInterfaceFields();
142 ASSERT(ans == ErrorCode::OK);
145 ASSERT(ans == ErrorCode::OK);
160 desc_block_.
intf = {9,
161 static_cast<uint8_t
>(DescriptorType::INTERFACE),
171 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
177 desc_block_.
ep_in = {7,
178 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
184 SetData(
RawData{
reinterpret_cast<uint8_t*
>(&desc_block_),
sizeof(desc_block_)});
196 swj_shadow_ =
static_cast<uint8_t
>(DapLinkV2Def::DAP_SWJ_SWDIO_TMS |
197 DapLinkV2Def::DAP_SWJ_NRESET);
199 ResetResponseQueue();
203 ArmOutTransferIfIdle();
214 ResetResponseQueue();
239 swj_shadow_ =
static_cast<uint8_t
>(DapLinkV2Def::DAP_SWJ_SWDIO_TMS |
240 DapLinkV2Def::DAP_SWJ_NRESET);
282 return ConstRawData{
reinterpret_cast<const uint8_t*
>(&winusb_msos20_),
283 sizeof(winusb_msos20_)};
312 template <
typename E>
313 static constexpr uint8_t ToU8(E e)
315 return static_cast<uint8_t
>(e);
323 static inline ErrorCode BuildUnknowCmdResponse(uint8_t* resp, uint16_t cap,
326 if (!resp || cap < 1u)
329 return ErrorCode::NOT_FOUND;
333 return ErrorCode::OK;
337 static inline ErrorCode BuildCmdStatusResponse(uint8_t cmd, uint8_t status,
338 uint8_t* resp, uint16_t cap,
341 if (!resp || cap < 2u)
344 return ErrorCode::NOT_FOUND;
349 return ErrorCode::OK;
357 void InitWinUsbDescriptors()
359 winusb_msos20_.
set.wLength =
static_cast<uint16_t
>(
sizeof(winusb_msos20_.
set));
360 winusb_msos20_.
set.wDescriptorType =
361 LibXR::USB::WinUsbMsOs20::MS_OS_20_SET_HEADER_DESCRIPTOR;
362 winusb_msos20_.
set.dwWindowsVersion = 0x06030000;
363 winusb_msos20_.
set.wTotalLength =
static_cast<uint16_t
>(
sizeof(winusb_msos20_));
365 winusb_msos20_.
cfg.wLength =
static_cast<uint16_t
>(
sizeof(winusb_msos20_.
cfg));
366 winusb_msos20_.
cfg.wDescriptorType =
367 LibXR::USB::WinUsbMsOs20::MS_OS_20_SUBSET_HEADER_CONFIGURATION;
369 winusb_msos20_.
cfg.bConfigurationValue = 0;
370 winusb_msos20_.
cfg.bReserved = 0;
371 winusb_msos20_.
cfg.wTotalLength =
static_cast<uint16_t
>(
372 sizeof(winusb_msos20_) - offsetof(WinUsbMsOs20DescSet, cfg));
374 winusb_msos20_.
func.wLength =
static_cast<uint16_t
>(
sizeof(winusb_msos20_.
func));
375 winusb_msos20_.
func.wDescriptorType =
376 LibXR::USB::WinUsbMsOs20::MS_OS_20_SUBSET_HEADER_FUNCTION;
377 winusb_msos20_.
func.bReserved = 0;
378 winusb_msos20_.
func.wTotalLength =
static_cast<uint16_t
>(
379 sizeof(winusb_msos20_) - offsetof(WinUsbMsOs20DescSet, func));
381 winusb_msos20_.
compat.wLength =
static_cast<uint16_t
>(
sizeof(winusb_msos20_.
compat));
382 winusb_msos20_.
compat.wDescriptorType =
383 LibXR::USB::WinUsbMsOs20::MS_OS_20_FEATURE_COMPATIBLE_ID;
385 winusb_msos20_.prop.
header.wDescriptorType =
386 LibXR::USB::WinUsbMsOs20::MS_OS_20_FEATURE_REG_PROPERTY;
387 winusb_msos20_.prop.
header.wPropertyDataType = LibXR::USB::WinUsbMsOs20::REG_MULTI_SZ;
388 winusb_msos20_.prop.
header.wPropertyNameLength =
389 LibXR::USB::WinUsbMsOs20::PROP_NAME_DEVICE_INTERFACE_GUIDS_BYTES;
392 LibXR::USB::WinUsbMsOs20::PROP_NAME_DEVICE_INTERFACE_GUIDS_UTF16,
393 LibXR::USB::WinUsbMsOs20::PROP_NAME_DEVICE_INTERFACE_GUIDS_BYTES);
397 const char GUID_STR[] =
"{CDB3B5AD-293B-4663-AA36-1AAE46463776}";
398 const size_t GUID_LEN =
sizeof(GUID_STR) - 1;
400 for (
size_t i = 0; i < GUID_LEN; ++i)
402 winusb_msos20_.prop.
data[i * 2] =
static_cast<uint8_t
>(GUID_STR[i]);
403 winusb_msos20_.prop.
data[i * 2 + 1] = 0x00;
407 winusb_msos20_.prop.
data[GUID_LEN * 2 + 0] = 0x00;
408 winusb_msos20_.prop.
data[GUID_LEN * 2 + 1] = 0x00;
409 winusb_msos20_.prop.
data[GUID_LEN * 2 + 2] = 0x00;
410 winusb_msos20_.prop.
data[GUID_LEN * 2 + 3] = 0x00;
413 winusb_msos20_.prop.
header.wLength =
414 static_cast<uint16_t
>(
sizeof(winusb_msos20_.prop));
421 void UpdateWinUsbInterfaceFields()
473 ArmOutTransferIfIdle();
475 const auto* req =
static_cast<const uint8_t*
>(data.
addr_);
476 const uint16_t REQ_LEN =
static_cast<uint16_t
>(data.
size_);
480 if (!HasDeferredResponseInEpBuffer() && IsResponseQueueEmpty() &&
484 if (tx_buff.addr_ && tx_buff.size_ > 0u)
486 auto* tx_buf =
static_cast<uint8_t*
>(tx_buff.addr_);
487 uint16_t out_len = 0u;
489 static_cast<uint16_t
>(tx_buff.size_), out_len);
498 if (!EnqueueResponse(tx_buf, out_len))
500 (void)SubmitNextQueuedResponseIfIdle();
501 (void)EnqueueResponse(tx_buf, out_len);
504 (void)SubmitNextQueuedResponseIfIdle();
505 ArmOutTransferIfIdle();
512 if (!HasDeferredResponseInEpBuffer() && IsResponseQueueEmpty() &&
516 if (tx_buff.addr_ && tx_buff.size_ > 0u)
518 auto* tx_buf =
static_cast<uint8_t*
>(tx_buff.addr_);
519 uint16_t out_len = 0u;
521 static_cast<uint16_t
>(tx_buff.size_), out_len);
525 SetDeferredResponseInEpBuffer(out_len);
526 ArmOutTransferIfIdle();
531 if (TryBuildAndEnqueueResponse(in_isr, req, REQ_LEN))
533 (void)SubmitDeferredResponseIfIdle();
534 (void)SubmitNextQueuedResponseIfIdle();
535 ArmOutTransferIfIdle();
541 (void)SubmitNextQueuedResponseIfIdle();
542 (void)TryBuildAndEnqueueResponse(in_isr, req, REQ_LEN);
544 (void)SubmitDeferredResponseIfIdle();
545 (void)SubmitNextQueuedResponseIfIdle();
546 ArmOutTransferIfIdle();
554 (void)SubmitDeferredResponseIfIdle();
555 (void)SubmitNextQueuedResponseIfIdle();
556 ArmOutTransferIfIdle();
567 uint16_t dap_ps = 0u;
569 if (IN_PS > 0u && OUT_PS > 0u)
571 dap_ps = (IN_PS < OUT_PS) ? IN_PS : OUT_PS;
575 dap_ps = (IN_PS > 0u) ? IN_PS : OUT_PS;
580 dap_ps = DEFAULT_DAP_PACKET_SIZE;
582 if (dap_ps > MAX_DAP_PACKET_SIZE)
584 dap_ps = MAX_DAP_PACKET_SIZE;
599 if (len > RESP_SLOT_SIZE)
601 len = RESP_SLOT_SIZE;
610 static constexpr uint8_t NextRespQueueIndex(uint8_t idx)
612 return static_cast<uint8_t
>((idx + 1u) & (RESP_QUEUE_DEPTH - 1u));
615 void ResetResponseQueue()
620 deferred_in_resp_valid_ =
false;
621 deferred_in_resp_len_ = 0u;
624 bool HasDeferredResponseInEpBuffer()
const {
return deferred_in_resp_valid_; }
626 void SetDeferredResponseInEpBuffer(uint16_t len)
628 deferred_in_resp_len_ = len;
629 deferred_in_resp_valid_ =
true;
632 bool SubmitDeferredResponseIfIdle()
640 const uint16_t TX_LEN = deferred_in_resp_len_;
646 deferred_in_resp_valid_ =
false;
647 deferred_in_resp_len_ = 0u;
651 bool IsResponseQueueEmpty()
const {
return resp_q_count_ == 0u; }
653 bool IsResponseQueueFull()
const {
return resp_q_count_ >= RESP_QUEUE_DEPTH; }
655 bool TryBuildAndEnqueueResponse(
bool in_isr,
const uint8_t* req, uint16_t req_len)
657 if (!req || IsResponseQueueFull())
662 auto& slot = resp_q_[resp_q_tail_];
663 uint16_t out_len = 0u;
669 resp_q_tail_ = NextRespQueueIndex(resp_q_tail_);
674 uint8_t OutstandingResponseCount()
const
676 const uint8_t IN_FLIGHT =
678 const uint8_t DEFERRED = deferred_in_resp_valid_ ? 1u : 0u;
679 return static_cast<uint8_t
>(resp_q_count_ + IN_FLIGHT + DEFERRED);
682 bool EnqueueResponse(
const uint8_t* data, uint16_t len)
684 if (!data || IsResponseQueueFull())
689 auto& slot = resp_q_[resp_q_tail_];
697 resp_q_tail_ = NextRespQueueIndex(resp_q_tail_);
702 bool SubmitNextQueuedResponseIfIdle()
705 IsResponseQueueEmpty())
711 if (!tx_buff.addr_ || tx_buff.size_ == 0u)
716 auto& slot = resp_q_[resp_q_head_];
717 uint16_t tx_len = slot.len;
718 if (tx_len > tx_buff.size_)
720 tx_len =
static_cast<uint16_t
>(tx_buff.size_);
733 resp_q_head_ = NextRespQueueIndex(resp_q_head_);
738 void ArmOutTransferIfIdle()
752 if (OutstandingResponseCount() >= MAX_OUTSTANDING_RESPONSES)
758 if (out_rx_len == 0u)
782 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
786 if (!req || !resp || req_len < 1u || resp_cap < 1u)
788 if (resp && resp_cap >= 1u)
792 return ErrorCode::ARG_ERR;
795 const uint8_t CMD = req[0];
799 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::INFO):
800 return HandleInfo(in_isr, req, req_len, resp, resp_cap, out_len);
801 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::HOST_STATUS):
802 return HandleHostStatus(in_isr, req, req_len, resp, resp_cap, out_len);
803 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::CONNECT):
804 return HandleConnect(in_isr, req, req_len, resp, resp_cap, out_len);
805 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::DISCONNECT):
806 return HandleDisconnect(in_isr, req, req_len, resp, resp_cap, out_len);
807 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_CONFIGURE):
808 return HandleTransferConfigure(in_isr, req, req_len, resp, resp_cap, out_len);
809 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER):
810 return HandleTransfer(in_isr, req, req_len, resp, resp_cap, out_len);
811 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_BLOCK):
812 return HandleTransferBlock(in_isr, req, req_len, resp, resp_cap, out_len);
813 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_ABORT):
814 return HandleTransferAbort(in_isr, req, req_len, resp, resp_cap, out_len);
815 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::WRITE_ABORT):
816 return HandleWriteABORT(in_isr, req, req_len, resp, resp_cap, out_len);
817 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::DELAY):
818 return HandleDelay(in_isr, req, req_len, resp, resp_cap, out_len);
819 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::RESET_TARGET):
820 return HandleResetTarget(in_isr, req, req_len, resp, resp_cap, out_len);
822 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_PINS):
823 return HandleSWJPins(in_isr, req, req_len, resp, resp_cap, out_len);
824 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_CLOCK):
825 return HandleSWJClock(in_isr, req, req_len, resp, resp_cap, out_len);
826 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_SEQUENCE):
827 return HandleSWJSequence(in_isr, req, req_len, resp, resp_cap, out_len);
828 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWD_CONFIGURE):
829 return HandleSWDConfigure(in_isr, req, req_len, resp, resp_cap, out_len);
830 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWD_SEQUENCE):
831 return HandleSWDSequence(in_isr, req, req_len, resp, resp_cap, out_len);
833 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::QUEUE_COMMANDS):
834 return HandleQueueCommands(in_isr, req, req_len, resp, resp_cap, out_len);
835 case ToU8(LibXR::USB::DapLinkV2Def::CommandId::EXECUTE_COMMANDS):
836 return HandleExecuteCommands(in_isr, req, req_len, resp, resp_cap, out_len);
839 (void)BuildUnknowCmdResponse(resp, resp_cap, out_len);
840 return ErrorCode::NOT_SUPPORT;
853 if (!resp || resp_cap < 1u)
867 ErrorCode HandleInfo(
bool ,
const uint8_t* req, uint16_t req_len,
868 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
872 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::INFO);
875 return ErrorCode::ARG_ERR;
878 const uint8_t INFO_ID = req[1];
880 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::INFO);
884 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::VENDOR):
885 return BuildInfoStringResponse(resp[0],
info_.vendor, resp, resp_cap, out_len);
886 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::PRODUCT):
887 return BuildInfoStringResponse(resp[0],
info_.product, resp, resp_cap, out_len);
888 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::SERIAL_NUMBER):
889 return BuildInfoStringResponse(resp[0],
info_.serial, resp, resp_cap, out_len);
890 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::FIRMWARE_VERSION):
891 return BuildInfoStringResponse(resp[0],
info_.firmware_ver, resp, resp_cap,
894 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::DEVICE_VENDOR):
895 return BuildInfoStringResponse(resp[0],
info_.device_vendor, resp, resp_cap,
897 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::DEVICE_NAME):
898 return BuildInfoStringResponse(resp[0],
info_.device_name, resp, resp_cap,
900 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::BOARD_VENDOR):
901 return BuildInfoStringResponse(resp[0],
info_.board_vendor, resp, resp_cap,
903 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::BOARD_NAME):
904 return BuildInfoStringResponse(resp[0],
info_.board_name, resp, resp_cap,
906 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::PRODUCT_FIRMWARE_VERSION):
907 return BuildInfoStringResponse(resp[0],
info_.product_fw_ver, resp, resp_cap,
910 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::CAPABILITIES):
911 return BuildInfoU8Response(resp[0],
LibXR::USB::DapLinkV2Def::DAP_CAP_SWD, resp,
913 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::PACKET_COUNT):
914 return BuildInfoU8Response(resp[0], PACKET_COUNT_ADVERTISED, resp, resp_cap,
916 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::PACKET_SIZE):
919 return BuildInfoU16Response(resp[0], DAP_PS, resp, resp_cap, out_len);
921 case ToU8(LibXR::USB::DapLinkV2Def::InfoId::TIMESTAMP_CLOCK):
922 return BuildInfoU32Response(resp[0], 1000000U, resp, resp_cap, out_len);
927 return ErrorCode::OK;
931 ErrorCode BuildInfoStringResponse(uint8_t cmd,
const char* str, uint8_t* resp,
932 uint16_t resp_cap, uint16_t& out_len)
940 return ErrorCode::OK;
943 const size_t N_WITH_NUL = std::strlen(str) + 1;
944 const size_t MAX_PAYLOAD = (resp_cap >= 2u) ? (resp_cap - 2u) : 0u;
945 if (MAX_PAYLOAD == 0u)
948 return ErrorCode::OK;
951 const size_t COPY_N = (N_WITH_NUL > MAX_PAYLOAD) ? MAX_PAYLOAD : N_WITH_NUL;
955 resp[2 + COPY_N - 1] = 0x00;
957 resp[1] =
static_cast<uint8_t
>(COPY_N);
958 out_len =
static_cast<uint16_t
>(2u + COPY_N);
959 return ErrorCode::OK;
962 ErrorCode BuildInfoU8Response(uint8_t cmd, uint8_t val, uint8_t* resp,
963 uint16_t resp_cap, uint16_t& out_len)
968 return ErrorCode::NOT_FOUND;
974 return ErrorCode::OK;
977 ErrorCode BuildInfoU16Response(uint8_t cmd, uint16_t val, uint8_t* resp,
978 uint16_t resp_cap, uint16_t& out_len)
983 return ErrorCode::NOT_FOUND;
992 return ErrorCode::OK;
995 ErrorCode BuildInfoU32Response(uint8_t cmd, uint32_t val, uint8_t* resp,
996 uint16_t resp_cap, uint16_t& out_len)
1001 return ErrorCode::NOT_FOUND;
1010 return ErrorCode::OK;
1018 ErrorCode HandleHostStatus(
bool ,
const uint8_t* ,
1019 uint16_t , uint8_t* resp, uint16_t resp_cap,
1025 return ErrorCode::NOT_FOUND;
1027 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::HOST_STATUS);
1028 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1030 return ErrorCode::OK;
1033 ErrorCode HandleConnect(
bool ,
const uint8_t* req, uint16_t req_len,
1034 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1039 return ErrorCode::NOT_FOUND;
1042 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::CONNECT);
1051 if (port == 0u || port == ToU8(LibXR::USB::DapLinkV2Def::Port::SWD))
1053 (void)
swd_.EnterSwd();
1059 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Port::SWD);
1063 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Port::DISABLED);
1067 return ErrorCode::OK;
1070 ErrorCode HandleDisconnect(
bool ,
const uint8_t* ,
1071 uint16_t , uint8_t* resp, uint16_t resp_cap,
1077 return ErrorCode::NOT_FOUND;
1084 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::DISCONNECT);
1085 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1087 return ErrorCode::OK;
1090 ErrorCode HandleTransferConfigure(
bool ,
const uint8_t* req, uint16_t req_len,
1091 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1096 return ErrorCode::NOT_FOUND;
1099 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_CONFIGURE);
1104 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1106 return ErrorCode::ARG_ERR;
1109 const uint8_t IDLE = req[1];
1111 uint16_t wait_retry = 0u;
1112 uint16_t match_retry = 0u;
1121 Debug::Swd::TransferPolicy pol =
swd_.GetTransferPolicy();
1122 pol.idle_cycles = IDLE;
1123 pol.wait_retry = wait_retry;
1124 swd_.SetTransferPolicy(pol);
1126 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1128 return ErrorCode::OK;
1131 ErrorCode HandleTransferAbort(
bool ,
const uint8_t* ,
1132 uint16_t , uint8_t* resp, uint16_t resp_cap,
1138 return ErrorCode::NOT_FOUND;
1141 SetTransferAbortFlag(
true);
1143 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_ABORT);
1144 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1146 return ErrorCode::OK;
1149 ErrorCode HandleWriteABORT(
bool ,
const uint8_t* req, uint16_t req_len,
1150 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1155 return ErrorCode::NOT_FOUND;
1158 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::WRITE_ABORT);
1162 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1164 return ErrorCode::ARG_ERR;
1167 uint32_t flags = 0u;
1170 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
1172 const ErrorCode EC =
swd_.WriteAbortTxn(flags, ack);
1173 resp[1] = (EC == ErrorCode::OK && ack == LibXR::Debug::SwdProtocol::Ack::OK)
1174 ? ToU8(LibXR::USB::DapLinkV2Def::Status::OK)
1175 : ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1178 return ErrorCode::OK;
1181 ErrorCode HandleDelay(
bool ,
const uint8_t* req, uint16_t req_len,
1182 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1187 return ErrorCode::NOT_FOUND;
1190 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::DELAY);
1194 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1196 return ErrorCode::ARG_ERR;
1204 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1206 return ErrorCode::OK;
1209 ErrorCode HandleResetTarget(
bool in_isr,
const uint8_t* , uint16_t ,
1210 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1212 if (!resp || resp_cap < 3u)
1215 return ErrorCode::NOT_FOUND;
1218 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::RESET_TARGET);
1220 uint8_t execute = 0u;
1225 DelayUsIfAllowed(in_isr, 1000u);
1227 DelayUsIfAllowed(in_isr, 1000u);
1236 return ErrorCode::OK;
1243 ErrorCode HandleSWJPins(
bool ,
const uint8_t* req, uint16_t req_len,
1244 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1246 if (!resp || resp_cap < 2u)
1249 return ErrorCode::NOT_FOUND;
1252 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_PINS);
1255 if (!req || req_len < 7u)
1259 return ErrorCode::ARG_ERR;
1262 const uint8_t PIN_OUT = req[1];
1263 const uint8_t PIN_SEL = req[2];
1265 uint32_t wait_us = 0u;
1270 (PIN_OUT & PIN_SEL));
1273 if ((PIN_SEL & LibXR::USB::DapLinkV2Def::DAP_SWJ_NRESET) != 0u)
1275 const bool LEVEL_HIGH =
1276 ((PIN_OUT & LibXR::USB::DapLinkV2Def::DAP_SWJ_NRESET) != 0u);
1279 DriveReset(LEVEL_HIGH);
1283 auto read_pins = [&]() -> uint8_t
1291 pin_in |= LibXR::USB::DapLinkV2Def::DAP_SWJ_NRESET;
1295 pin_in =
static_cast<uint8_t
>(
1296 pin_in &
static_cast<uint8_t
>(
~LibXR::USB::DapLinkV2Def::DAP_SWJ_NRESET));
1306 uint8_t pin_in = 0u;
1308 if (wait_us == 0u || PIN_SEL == 0u)
1310 pin_in = read_pins();
1315 const uint8_t EXPECT =
static_cast<uint8_t
>(PIN_OUT & PIN_SEL);
1319 pin_in = read_pins();
1320 if ((pin_in & PIN_SEL) == EXPECT)
1330 return ErrorCode::OK;
1333 ErrorCode HandleSWJClock(
bool ,
const uint8_t* req, uint16_t req_len,
1334 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1339 return ErrorCode::NOT_FOUND;
1342 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_CLOCK);
1346 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1348 return ErrorCode::ARG_ERR;
1355 (void)
swd_.SetClockHz(hz);
1357 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1359 return ErrorCode::OK;
1362 ErrorCode HandleSWJSequence(
bool ,
const uint8_t* req, uint16_t req_len,
1363 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1365 if (!resp || resp_cap < 2u)
1368 return ErrorCode::NOT_FOUND;
1371 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWJ_SEQUENCE);
1372 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1376 if (!req || req_len < 2u)
1378 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1379 return ErrorCode::ARG_ERR;
1382 const uint8_t RAW_COUNT = req[1];
1383 const uint32_t BIT_COUNT =
1384 (RAW_COUNT == 0u) ? 256u : static_cast<uint32_t>(RAW_COUNT);
1385 const uint32_t BYTE_COUNT = (BIT_COUNT + 7u) / 8u;
1387 if (2u + BYTE_COUNT > req_len)
1389 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1390 return ErrorCode::ARG_ERR;
1393 const uint8_t* data = &req[2];
1396 const ErrorCode EC =
swd_.SeqWriteBits(BIT_COUNT, data);
1397 if (EC != ErrorCode::OK)
1399 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::ERROR);
1401 return ErrorCode::OK;
1406 swj_shadow_ &
static_cast<uint8_t
>(
~LibXR::USB::DapLinkV2Def::DAP_SWJ_SWCLK_TCK));
1408 bool last_swdio =
false;
1409 if (BIT_COUNT != 0u)
1411 const uint32_t LAST_I = BIT_COUNT - 1u;
1412 last_swdio = (((data[LAST_I / 8u] >> (LAST_I & 7u)) & 0x01u) != 0u);
1417 swj_shadow_ |= LibXR::USB::DapLinkV2Def::DAP_SWJ_SWDIO_TMS;
1423 static_cast<uint8_t
>(
~LibXR::USB::DapLinkV2Def::DAP_SWJ_SWDIO_TMS));
1426 return ErrorCode::OK;
1429 ErrorCode HandleSWDConfigure(
bool ,
const uint8_t* ,
1430 uint16_t , uint8_t* resp, uint16_t resp_cap,
1436 return ErrorCode::NOT_FOUND;
1439 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWD_CONFIGURE);
1442 resp[1] = ToU8(LibXR::USB::DapLinkV2Def::Status::OK);
1444 return ErrorCode::OK;
1447 ErrorCode HandleSWDSequence(
bool ,
const uint8_t* req, uint16_t req_len,
1448 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1450 if (!req || !resp || resp_cap < 2u)
1453 return ErrorCode::ARG_ERR;
1456 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::SWD_SEQUENCE);
1470 return ErrorCode::ARG_ERR;
1473 const uint8_t SEQ_CNT = req[1];
1474 uint16_t req_off = 2u;
1475 uint16_t resp_off = 2u;
1477 for (uint32_t s = 0; s < SEQ_CNT; ++s)
1479 if (req_off >= req_len)
1483 return ErrorCode::ARG_ERR;
1486 const uint8_t INFO = req[req_off++];
1488 uint32_t cycles =
static_cast<uint32_t
>(INFO & 0x3Fu);
1494 const bool MODE_IN = ((INFO & 0x80u) != 0u);
1495 const uint16_t BYTES =
static_cast<uint16_t
>((cycles + 7u) / 8u);
1500 if (req_off + BYTES > req_len)
1504 return ErrorCode::ARG_ERR;
1507 const uint8_t* data = &req[req_off];
1508 req_off =
static_cast<uint16_t
>(req_off + BYTES);
1510 const ErrorCode EC =
swd_.SeqWriteBits(cycles, data);
1511 if (EC != ErrorCode::OK)
1516 return ErrorCode::OK;
1522 if (resp_off + BYTES > resp_cap)
1526 return ErrorCode::NOT_FOUND;
1531 const ErrorCode EC =
swd_.SeqReadBits(cycles, &resp[resp_off]);
1532 if (EC != ErrorCode::OK)
1536 return ErrorCode::OK;
1539 resp_off =
static_cast<uint16_t
>(resp_off + BYTES);
1544 return ErrorCode::OK;
1547 ErrorCode HandleQueueCommands(
bool ,
const uint8_t* ,
1548 uint16_t , uint8_t* resp, uint16_t resp_cap,
1551 return BuildCmdStatusResponse(
1552 ToU8(LibXR::USB::DapLinkV2Def::CommandId::QUEUE_COMMANDS),
DAP_ERROR, resp,
1556 ErrorCode HandleExecuteCommands(
bool ,
const uint8_t* ,
1557 uint16_t , uint8_t* resp, uint16_t resp_cap,
1560 return BuildCmdStatusResponse(
1561 ToU8(LibXR::USB::DapLinkV2Def::CommandId::EXECUTE_COMMANDS),
DAP_ERROR, resp,
1570 uint8_t MapAckToDapResp(LibXR::Debug::SwdProtocol::Ack ack)
const
1572 static constexpr uint8_t ACK_MAP[8] = {7u, 1u, 2u, 7u, 4u, 7u, 7u, 7u};
1573 return ACK_MAP[
static_cast<uint8_t
>(ack) & 0x07u];
1587 ErrorCode HandleTransfer(
bool ,
const uint8_t* req, uint16_t req_len,
1588 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
1591 if (!req || !resp || resp_cap < 3u)
1593 return ErrorCode::ARG_ERR;
1596 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER);
1599 uint16_t resp_off = 3u;
1604 resp[2] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1606 return ErrorCode::ARG_ERR;
1612 resp[2] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1614 return ErrorCode::OK;
1617 const uint8_t COUNT = req[2];
1618 uint16_t req_off = 3u;
1620 auto push_u32 = [&](uint32_t v) ->
bool
1622 if (resp_off + 4u > resp_cap)
1627 resp_off =
static_cast<uint16_t
>(resp_off + 4u);
1631 auto push_timestamp = [&]() ->
bool
1637 auto ensure_space = [&](uint16_t bytes) ->
bool
1638 {
return (resp_off + bytes) <= resp_cap; };
1640 auto bytes_for_read = [&](
bool need_ts) -> uint16_t
1641 {
return static_cast<uint16_t
>(need_ts ? 8u : 4u); };
1643 uint8_t response_count = 0u;
1644 uint8_t response_value = 0u;
1646 bool check_write =
false;
1649 struct PendingApRead
1652 bool need_ts =
false;
1655 auto emit_read_with_ts = [&](
bool need_ts, uint32_t data) ->
bool
1659 if (!push_timestamp())
1664 if (!push_u32(data))
1673 auto complete_pending_by_rdbuff = [&]() ->
bool
1680 if (!ensure_space(bytes_for_read(pending.need_ts)))
1682 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1686 uint32_t rdata = 0u;
1687 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
1688 const ErrorCode EC =
swd_.DpReadRdbuffTxn(rdata, ack);
1690 const uint8_t V = MapAckToDapResp(ack);
1691 if (V != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1696 if (EC != ErrorCode::OK)
1698 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1702 if (!emit_read_with_ts(pending.need_ts, rdata))
1704 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1708 pending.valid =
false;
1709 pending.need_ts =
false;
1712 check_write =
false;
1715 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
1721 auto flush_pending_if_any = [&]() ->
bool
1722 {
return pending.valid ? complete_pending_by_rdbuff() : true; };
1725 for (uint32_t i = 0; i < COUNT; ++i)
1727 if (req_off >= req_len)
1729 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1733 const uint8_t RQ = req[req_off++];
1740 const bool MATCH_VALUE =
1741 ((RQ & LibXR::USB::DapLinkV2Def::DAP_TRANSFER_MATCH_VALUE) != 0u);
1742 const bool MATCH_MASK =
1743 ((RQ & LibXR::USB::DapLinkV2Def::DAP_TRANSFER_MATCH_MASK) != 0u);
1746 if (TS && (MATCH_VALUE || MATCH_MASK))
1748 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1752 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
1753 ErrorCode ec = ErrorCode::OK;
1759 if (!flush_pending_if_any())
1764 if (req_off + 4u > req_len)
1766 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1770 uint32_t wdata = 0u;
1772 req_off =
static_cast<uint16_t
>(req_off + 4u);
1777 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
1784 ec =
swd_.ApWriteTxn(ADDR2B, wdata, ack);
1788 ec =
swd_.DpWriteTxn(
static_cast<LibXR::Debug::SwdProtocol::DpWriteReg
>(ADDR2B),
1792 response_value = MapAckToDapResp(ack);
1793 if (response_value != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1797 if (ec != ErrorCode::OK)
1799 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1805 if (!push_timestamp())
1807 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1823 if (!flush_pending_if_any())
1828 if (req_off + 4u > req_len)
1830 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1834 uint32_t match_val = 0u;
1836 req_off =
static_cast<uint16_t
>(req_off + 4u);
1838 uint32_t rdata = 0u;
1840 bool matched =
false;
1846 ec =
swd_.ApReadTxn(ADDR2B, rdata, ack);
1847 if (ec == ErrorCode::OK && ack == LibXR::Debug::SwdProtocol::Ack::OK)
1850 check_write =
false;
1855 ec =
swd_.DpReadTxn(
1856 static_cast<LibXR::Debug::SwdProtocol::DpReadReg
>(ADDR2B), rdata, ack);
1859 response_value = MapAckToDapResp(ack);
1860 if (response_value != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1864 if (ec != ErrorCode::OK)
1866 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1883 if (response_value != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1891 static_cast<uint8_t
>(LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK |
1892 LibXR::USB::DapLinkV2Def::DAP_TRANSFER_MISMATCH);
1897 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
1906 if (!flush_pending_if_any())
1911 uint32_t rdata = 0u;
1912 ec =
swd_.DpReadTxn(
static_cast<LibXR::Debug::SwdProtocol::DpReadReg
>(ADDR2B),
1915 response_value = MapAckToDapResp(ack);
1916 if (response_value != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1920 if (ec != ErrorCode::OK)
1922 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1926 if (!ensure_space(bytes_for_read(TS)))
1928 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1932 if (!emit_read_with_ts(TS, rdata))
1934 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1938 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
1947 uint32_t dummy_posted = 0u;
1948 ec =
swd_.ApReadPostedTxn(ADDR2B, dummy_posted, ack);
1950 response_value = MapAckToDapResp(ack);
1951 if (response_value != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1955 if (ec != ErrorCode::OK)
1957 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1963 pending.valid =
true;
1964 pending.need_ts = TS;
1967 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
1972 if (!ensure_space(bytes_for_read(pending.need_ts)))
1974 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1978 uint32_t posted_prev = 0u;
1979 ec =
swd_.ApReadPostedTxn(ADDR2B, posted_prev, ack);
1981 const uint8_t CUR_V = MapAckToDapResp(ack);
1982 if (CUR_V != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK || ec != ErrorCode::OK)
1986 const uint8_t PROOR_FAIL =
1987 (CUR_V != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
1989 :
LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
1991 if (!complete_pending_by_rdbuff())
1999 response_value = PROOR_FAIL;
2005 if (!emit_read_with_ts(pending.need_ts, posted_prev))
2007 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2011 pending.valid =
true;
2012 pending.need_ts = TS;
2014 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
2031 const uint8_t PRIOR_FAIL = response_value;
2033 if (!complete_pending_by_rdbuff())
2040 if (PRIOR_FAIL != 0u && PRIOR_FAIL != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
2042 response_value = PRIOR_FAIL;
2049 if (response_value == LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK && check_write)
2051 uint32_t dummy = 0u;
2052 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2053 const ErrorCode EC =
swd_.DpReadRdbuffTxn(dummy, ack);
2054 const uint8_t V = MapAckToDapResp(ack);
2056 if (V != LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK)
2060 else if (EC != ErrorCode::OK)
2062 response_value = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2066 resp[1] = response_count;
2067 resp[2] = response_value;
2069 return ErrorCode::OK;
2072 ErrorCode HandleTransferBlock(
bool ,
const uint8_t* req, uint16_t req_len,
2073 uint8_t* resp, uint16_t resp_cap, uint16_t& out_len)
2077 if (!resp || resp_cap < 4u)
2080 return ErrorCode::NOT_FOUND;
2083 resp[0] = ToU8(LibXR::USB::DapLinkV2Def::CommandId::TRANSFER_BLOCK);
2089 if (!req || req_len < 5u)
2091 resp[3] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2092 return ErrorCode::ARG_ERR;
2098 resp[3] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2099 return ErrorCode::OK;
2102 uint16_t count = 0u;
2105 const uint8_t DAP_RQ = req[4];
2108 if ((DAP_RQ & (LibXR::USB::DapLinkV2Def::DAP_TRANSFER_MATCH_VALUE |
2109 LibXR::USB::DapLinkV2Def::DAP_TRANSFER_MATCH_MASK)) != 0u)
2111 resp[3] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2112 return ErrorCode::NOT_SUPPORT;
2116 resp[3] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2117 return ErrorCode::NOT_SUPPORT;
2123 const uint16_t DONE0 = 0u;
2125 resp[3] = LibXR::USB::DapLinkV2Def::DAP_TRANSFER_OK;
2127 return ErrorCode::OK;
2137 uint16_t req_off = 5u;
2138 uint16_t resp_off = 4u;
2143 const uint32_t REQ_NEED =
2144 static_cast<uint32_t
>(req_off) + (
static_cast<uint32_t
>(count) * 4u);
2145 if (REQ_NEED > req_len)
2147 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2151 return ErrorCode::OK;
2154 for (uint32_t i = 0; i < count; ++i)
2156 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2157 ErrorCode ec = ErrorCode::OK;
2159 uint32_t wdata = 0u;
2161 req_off =
static_cast<uint16_t
>(req_off + 4u);
2165 ec =
swd_.ApWriteTxn(ADDR2B, wdata, ack);
2169 ec =
swd_.DpWriteTxn(
static_cast<LibXR::Debug::SwdProtocol::DpWriteReg
>(ADDR2B),
2173 xresp = MapAckToDapResp(ack);
2174 if (ack != LibXR::Debug::SwdProtocol::Ack::OK)
2178 if (ec != ErrorCode::OK)
2180 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2184 done =
static_cast<uint16_t
>(i + 1u);
2190 return ErrorCode::OK;
2196 const uint32_t RESP_NEED =
2197 static_cast<uint32_t
>(resp_off) + (
static_cast<uint32_t
>(count) * 4u);
2198 if (RESP_NEED > resp_cap)
2200 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2204 return ErrorCode::OK;
2208 for (uint32_t i = 0; i < count; ++i)
2210 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2211 ErrorCode ec = ErrorCode::OK;
2212 uint32_t rdata = 0u;
2214 ec =
swd_.DpReadTxn(
static_cast<LibXR::Debug::SwdProtocol::DpReadReg
>(ADDR2B),
2217 xresp = MapAckToDapResp(ack);
2218 if (ack != LibXR::Debug::SwdProtocol::Ack::OK)
2223 if (ec != ErrorCode::OK)
2225 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2230 resp_off =
static_cast<uint16_t
>(resp_off + 4u);
2231 done =
static_cast<uint16_t
>(i + 1u);
2237 return ErrorCode::OK;
2242 const uint32_t RESP_NEED =
2243 static_cast<uint32_t
>(resp_off) + (
static_cast<uint32_t
>(count) * 4u);
2244 if (RESP_NEED > resp_cap)
2246 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2250 return ErrorCode::OK;
2253 LibXR::Debug::SwdProtocol::Ack ack = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2254 ErrorCode ec = ErrorCode::OK;
2257 uint32_t dummy_posted = 0u;
2258 ec =
swd_.ApReadPostedTxn(ADDR2B, dummy_posted, ack);
2259 xresp = MapAckToDapResp(ack);
2260 if (ack != LibXR::Debug::SwdProtocol::Ack::OK)
2264 if (ec != ErrorCode::OK)
2266 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2271 for (uint32_t i = 1; i < count; ++i)
2273 uint32_t posted_prev = 0u;
2274 ec =
swd_.ApReadPostedTxn(ADDR2B, posted_prev, ack);
2275 const uint8_t CUR = MapAckToDapResp(ack);
2277 if (ack != LibXR::Debug::SwdProtocol::Ack::OK || ec != ErrorCode::OK)
2280 if (resp_off + 4u <= resp_cap)
2283 LibXR::Debug::SwdProtocol::Ack ack2 =
2284 LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2285 const ErrorCode EC2 =
swd_.DpReadRdbuffTxn(last, ack2);
2286 const uint8_t V2 = MapAckToDapResp(ack2);
2288 if (V2 == 1u && EC2 == ErrorCode::OK)
2291 resp_off =
static_cast<uint16_t
>(resp_off + 4u);
2292 done =
static_cast<uint16_t
>(i);
2298 if (EC2 != ErrorCode::OK)
2300 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2308 if (ec != ErrorCode::OK)
2310 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2317 resp_off =
static_cast<uint16_t
>(resp_off + 4u);
2318 done =
static_cast<uint16_t
>(i);
2325 LibXR::Debug::SwdProtocol::Ack ack2 = LibXR::Debug::SwdProtocol::Ack::PROTOCOL;
2326 const ErrorCode EC2 =
swd_.DpReadRdbuffTxn(last, ack2);
2327 const uint8_t V2 = MapAckToDapResp(ack2);
2334 if (EC2 != ErrorCode::OK)
2336 xresp |= LibXR::USB::DapLinkV2Def::DAP_TRANSFER_ERROR;
2341 resp_off =
static_cast<uint16_t
>(resp_off + 4u);
2349 return ErrorCode::OK;
2358 void DriveReset(
bool release)
2365 swj_shadow_ |= LibXR::USB::DapLinkV2Def::DAP_SWJ_NRESET;
2379 void DelayUsIfAllowed(
bool , uint32_t us)
2385 static constexpr uint16_t DEFAULT_DAP_PACKET_SIZE = 64u;
2386 static constexpr uint8_t PACKET_COUNT_ADVERTISED = 2u;
2387 static constexpr uint8_t MAX_OUTSTANDING_RESPONSES = PACKET_COUNT_ADVERTISED;
2388 static constexpr uint16_t MAX_DAP_PACKET_SIZE = 512u;
2389 static constexpr uint16_t RESP_SLOT_SIZE = MAX_DAP_PACKET_SIZE;
2390 static constexpr uint8_t RESP_QUEUE_DEPTH = PACKET_COUNT_ADVERTISED;
2391 static_assert(RESP_SLOT_SIZE >= DEFAULT_DAP_PACKET_SIZE,
2392 "RESP_SLOT_SIZE must cover FS bulk packet size");
2393 static_assert((RESP_QUEUE_DEPTH & (RESP_QUEUE_DEPTH - 1u)) == 0u,
2394 "Response queue depth must be power-of-two");
2402 static_cast<uint16_t
>(LibXR::USB::WinUsbMsOs20::GUID_STR_UTF16_BYTES +
2408 uint8_t payload[RESP_SLOT_SIZE] = {};
2412 uint8_t resp_q_head_ = 0u;
2413 uint8_t resp_q_tail_ = 0u;
2414 uint8_t resp_q_count_ = 0u;
2415 bool deferred_in_resp_valid_ =
false;
2416 uint16_t deferred_in_resp_len_ = 0u;
2418#pragma pack(push, 1)
2439 uint8_t
name[LibXR::USB::WinUsbMsOs20::
2440 PROP_NAME_DEVICE_INTERFACE_GUIDS_BYTES];
2455 DapLinkV2Def::DAP_SWJ_SWDIO_TMS |
2456 DapLinkV2Def::DAP_SWJ_NRESET);
2463 "XRobot",
"DAPLinkV2",
"00000001",
"2.0.0",
"XRUSB",
2464 "XRDAP",
"XRobot",
"DAP_DEMO",
"0.1.0"};
2477#pragma pack(push, 1)