libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
daplink_v2_def.hpp
1#pragma once
2
3#include <cstdint>
4
5#include "libxr_def.hpp"
6#include "timebase.hpp"
7
8namespace LibXR::USB
9{
10
18namespace DapLinkV2Def
19{
20// ==============================
21// CMSIS-DAP v2 Command IDs / 命令号
22// ==============================
23enum class CommandId : std::uint8_t
24{
25 // Core (0x00-0x0F)
26 INFO = 0x00,
27 HOST_STATUS = 0x01,
28 CONNECT = 0x02,
29 DISCONNECT = 0x03,
30 TRANSFER_CONFIGURE = 0x04,
31 TRANSFER = 0x05,
32 TRANSFER_BLOCK = 0x06,
33 TRANSFER_ABORT = 0x07,
34 WRITE_ABORT = 0x08,
35 DELAY = 0x09,
36 RESET_TARGET = 0x0A,
37
38 // SWJ (0x10-0x1F)
39 SWJ_PINS = 0x10,
40 SWJ_CLOCK = 0x11,
41 SWJ_SEQUENCE = 0x12,
42 SWD_CONFIGURE = 0x13,
43 JTAG_SEQUENCE = 0x14,
44 JTAG_CONFIGURE = 0x15,
45 JTAG_IDCODE = 0x16,
46
47 // SWO (v2)
48 SWO_TRANSPORT = 0x17,
49 SWO_MODE = 0x18,
50 SWO_BAUDRATE = 0x19,
51 SWO_CONTROL = 0x1A,
52 SWO_STATUS = 0x1B,
53 SWO_DATA = 0x1C,
54
55 // SWD sequence (v2)
56 SWD_SEQUENCE = 0x1D,
57
58 // Queue (0x7E-0x7F)
59 QUEUE_COMMANDS = 0x7E,
60 EXECUTE_COMMANDS = 0x7F,
61
62 INVALID = 0xFF
63};
64
65// ==============================
66// DAP_Info IDs / 信息 ID
67// ==============================
68
69enum class InfoId : std::uint8_t
70{
71 VENDOR = 0x01,
72 PRODUCT = 0x02,
73 SERIAL_NUMBER = 0x03,
74 FIRMWARE_VERSION = 0x04,
75
76 DEVICE_VENDOR = 0x05,
77 DEVICE_NAME = 0x06,
78 BOARD_VENDOR = 0x07,
79 BOARD_NAME = 0x08,
80 PRODUCT_FIRMWARE_VERSION = 0x09,
81
82 CAPABILITIES = 0xF0,
83 TIMESTAMP_CLOCK = 0xF1,
84 SWO_BUFFER_SIZE = 0xFD,
85 PACKET_COUNT = 0xFE,
86 PACKET_SIZE = 0xFF
87};
88
89// ==============================
90// Capabilities bits / 能力位(DAP_Info: Capabilities)
91// ==============================
92
93static constexpr std::uint8_t DAP_CAP_SWD = 0x01u;
94static constexpr std::uint8_t DAP_CAP_JTAG = 0x02u;
95static constexpr std::uint8_t DAP_CAP_SWO = 0x04u;
96
97// ==============================
98// Status / Port / 状态与端口
99// ==============================
100
101enum class Status : std::uint8_t
102{
103 OK = 0x00,
104 ERROR = 0xFF
105};
106
107enum class Port : std::uint8_t
108{
109 DISABLED = 0x00,
110 SWD = 0x01,
111 JTAG = 0x02
112};
113
114enum class DebugPort : std::uint8_t
115{
116 DISABLED = 0,
117 SWD = 1,
118 JTAG = 2
119};
120
121// ==============================
122// Transfer Request bits / 传输请求位
123// ==============================
124
125static constexpr std::uint8_t DAP_TRANSFER_APNDP = (1u << 0);
126static constexpr std::uint8_t DAP_TRANSFER_RNW = (1u << 1);
127static constexpr std::uint8_t DAP_TRANSFER_A2 = (1u << 2);
128static constexpr std::uint8_t DAP_TRANSFER_A3 = (1u << 3);
129static constexpr std::uint8_t DAP_TRANSFER_MATCH_VALUE = (1u << 4);
130static constexpr std::uint8_t DAP_TRANSFER_MATCH_MASK = (1u << 5);
131static constexpr std::uint8_t DAP_TRANSFER_TIMESTAMP = (1u << 7);
132
133// Transfer Response bits / 传输响应位
134static constexpr std::uint8_t DAP_TRANSFER_OK = (1u << 0);
135static constexpr std::uint8_t DAP_TRANSFER_WAIT = (1u << 1);
136static constexpr std::uint8_t DAP_TRANSFER_FAULT = (1u << 2);
137static constexpr std::uint8_t DAP_TRANSFER_ERROR = (1u << 3);
138static constexpr std::uint8_t DAP_TRANSFER_MISMATCH = (1u << 4);
139static constexpr std::uint8_t DAP_TRANSFER_NO_TARGET = (1u << 7);
140
141// ==============================
142// SWJ Pins bits / SWJ 引脚位
143// ==============================
144
145static constexpr std::uint8_t DAP_SWJ_SWCLK_TCK = (1u << 0);
146static constexpr std::uint8_t DAP_SWJ_SWDIO_TMS = (1u << 1);
147static constexpr std::uint8_t DAP_SWJ_TDI = (1u << 2);
148static constexpr std::uint8_t DAP_SWJ_TDO = (1u << 3);
149static constexpr std::uint8_t DAP_SWJ_NTRST = (1u << 5);
150static constexpr std::uint8_t DAP_SWJ_NRESET = (1u << 7);
151
152// ==============================
153// SWD / JTAG Sequence fields / 序列字段
154// ==============================
155
156static constexpr std::uint8_t SWD_SEQUENCE_CLK = 0x3Fu;
157static constexpr std::uint8_t SWD_SEQUENCE_DIN = (1u << 7);
158
159static constexpr std::uint8_t JTAG_SEQUENCE_TCK = 0x3Fu;
160static constexpr std::uint8_t JTAG_SEQUENCE_TMS = (1u << 6);
161static constexpr std::uint8_t JTAG_SEQUENCE_TDO = (1u << 7);
162
163// ==============================
164// Helpers / 工具函数
165// ==============================
166
169static inline constexpr std::uint8_t req_addr2b(std::uint8_t req)
170{
171 return static_cast<std::uint8_t>(((req & DAP_TRANSFER_A2) ? 1u : 0u) |
172 ((req & DAP_TRANSFER_A3) ? 2u : 0u));
173}
174
176static inline constexpr bool req_is_ap(std::uint8_t req)
177{
178 return (req & DAP_TRANSFER_APNDP) != 0u;
179}
180
182static inline constexpr bool req_is_read(std::uint8_t req)
183{
184 return (req & DAP_TRANSFER_RNW) != 0u;
185}
186
188static inline constexpr bool req_need_timestamp(std::uint8_t req)
189{
190 return (req & DAP_TRANSFER_TIMESTAMP) != 0u;
191}
192
193// ==============================
194// State structs / 运行态结构体
195// ==============================
196
198{
199 std::uint8_t idle_cycles = 0u;
200 std::uint16_t retry_count = 100u;
201 std::uint16_t match_retry = 0u;
202 std::uint32_t match_mask = 0u;
203};
204
206{
207 std::uint8_t turnaround = 1u;
208 bool data_phase = false;
209};
210
211struct State
212{
213 DebugPort debug_port = DebugPort::DISABLED;
214 volatile bool transfer_abort = false;
215
218};
219
221{
222 std::uint16_t request_consumed = 0u;
223 std::uint16_t response_generated = 0u;
224};
225
226} // namespace DapLinkV2Def
227
228} // namespace LibXR::USB