DAP.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. /*
  2. * Copyright (c) 2013-2022 ARM Limited. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the License); you may
  7. * not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  14. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * ----------------------------------------------------------------------
  19. *
  20. * $Date: 26. April 2022
  21. * $Revision: V2.1.1
  22. *
  23. * Project: CMSIS-DAP Source
  24. * Title: DAP.c CMSIS-DAP Commands
  25. *
  26. *---------------------------------------------------------------------------*/
  27. #include <string.h>
  28. #include "DAP_config.h"
  29. #include "DAP.h"
  30. #if (DAP_PACKET_SIZE < 64U)
  31. #error "Minimum Packet Size is 64!"
  32. #endif
  33. #if (DAP_PACKET_SIZE > 32768U)
  34. #error "Maximum Packet Size is 32768!"
  35. #endif
  36. #if (DAP_PACKET_COUNT < 1U)
  37. #error "Minimum Packet Count is 1!"
  38. #endif
  39. #if (DAP_PACKET_COUNT > 255U)
  40. #error "Maximum Packet Count is 255!"
  41. #endif
  42. // Clock Macros
  43. #define MAX_SWJ_CLOCK(delay_cycles) \
  44. ((CPU_CLOCK/2U) / (IO_PORT_WRITE_CYCLES + delay_cycles))
  45. DAP_Data_t DAP_Data; // DAP Data
  46. volatile uint8_t DAP_TransferAbort; // Transfer Abort Flag
  47. static const char DAP_FW_Ver [] = DAP_FW_VER;
  48. // Common clock delay calculation routine
  49. // clock: requested SWJ frequency in Hertz
  50. static void Set_Clock_Delay(uint32_t clock) {
  51. uint32_t delay;
  52. if (clock >= MAX_SWJ_CLOCK(DELAY_FAST_CYCLES)) {
  53. DAP_Data.fast_clock = 1U;
  54. DAP_Data.clock_delay = 1U;
  55. } else {
  56. DAP_Data.fast_clock = 0U;
  57. delay = ((CPU_CLOCK/2U) + (clock - 1U)) / clock;
  58. if (delay > IO_PORT_WRITE_CYCLES) {
  59. delay -= IO_PORT_WRITE_CYCLES;
  60. delay = (delay + (DELAY_SLOW_CYCLES - 1U)) / DELAY_SLOW_CYCLES;
  61. } else {
  62. delay = 1U;
  63. }
  64. DAP_Data.clock_delay = delay;
  65. }
  66. }
  67. // Get DAP Information
  68. // id: info identifier
  69. // info: pointer to info data
  70. // return: number of bytes in info data
  71. static uint8_t DAP_Info(uint8_t id, uint8_t *info) {
  72. uint8_t length = 0U;
  73. switch (id) {
  74. case DAP_ID_VENDOR:
  75. length = DAP_GetVendorString((char *)info);
  76. break;
  77. case DAP_ID_PRODUCT:
  78. length = DAP_GetProductString((char *)info);
  79. break;
  80. case DAP_ID_SER_NUM:
  81. length = DAP_GetSerNumString((char *)info);
  82. break;
  83. case DAP_ID_DAP_FW_VER:
  84. length = (uint8_t)sizeof(DAP_FW_Ver);
  85. memcpy(info, DAP_FW_Ver, length);
  86. break;
  87. case DAP_ID_DEVICE_VENDOR:
  88. length = DAP_GetTargetDeviceVendorString((char *)info);
  89. break;
  90. case DAP_ID_DEVICE_NAME:
  91. length = DAP_GetTargetDeviceNameString((char *)info);
  92. break;
  93. case DAP_ID_BOARD_VENDOR:
  94. length = DAP_GetTargetBoardVendorString((char *)info);
  95. break;
  96. case DAP_ID_BOARD_NAME:
  97. length = DAP_GetTargetBoardNameString((char *)info);
  98. break;
  99. case DAP_ID_PRODUCT_FW_VER:
  100. length = DAP_GetProductFirmwareVersionString((char *)info);
  101. break;
  102. case DAP_ID_CAPABILITIES:
  103. info[0] = ((DAP_SWD != 0) ? (1U << 0) : 0U) |
  104. ((DAP_JTAG != 0) ? (1U << 1) : 0U) |
  105. ((SWO_UART != 0) ? (1U << 2) : 0U) |
  106. ((SWO_MANCHESTER != 0) ? (1U << 3) : 0U) |
  107. /* Atomic Commands */ (1U << 4) |
  108. ((TIMESTAMP_CLOCK != 0U) ? (1U << 5) : 0U) |
  109. ((SWO_STREAM != 0U) ? (1U << 6) : 0U) |
  110. ((DAP_UART != 0U) ? (1U << 7) : 0U);
  111. info[1] = ((DAP_UART_USB_COM_PORT != 0) ? (1U << 0) : 0U);
  112. length = 2U;
  113. break;
  114. case DAP_ID_TIMESTAMP_CLOCK:
  115. #if (TIMESTAMP_CLOCK != 0U)
  116. info[0] = (uint8_t)(TIMESTAMP_CLOCK >> 0);
  117. info[1] = (uint8_t)(TIMESTAMP_CLOCK >> 8);
  118. info[2] = (uint8_t)(TIMESTAMP_CLOCK >> 16);
  119. info[3] = (uint8_t)(TIMESTAMP_CLOCK >> 24);
  120. length = 4U;
  121. #endif
  122. break;
  123. case DAP_ID_UART_RX_BUFFER_SIZE:
  124. #if (DAP_UART != 0)
  125. info[0] = (uint8_t)(DAP_UART_RX_BUFFER_SIZE >> 0);
  126. info[1] = (uint8_t)(DAP_UART_RX_BUFFER_SIZE >> 8);
  127. info[2] = (uint8_t)(DAP_UART_RX_BUFFER_SIZE >> 16);
  128. info[3] = (uint8_t)(DAP_UART_RX_BUFFER_SIZE >> 24);
  129. length = 4U;
  130. #endif
  131. break;
  132. case DAP_ID_UART_TX_BUFFER_SIZE:
  133. #if (DAP_UART != 0)
  134. info[0] = (uint8_t)(DAP_UART_TX_BUFFER_SIZE >> 0);
  135. info[1] = (uint8_t)(DAP_UART_TX_BUFFER_SIZE >> 8);
  136. info[2] = (uint8_t)(DAP_UART_TX_BUFFER_SIZE >> 16);
  137. info[3] = (uint8_t)(DAP_UART_TX_BUFFER_SIZE >> 24);
  138. length = 4U;
  139. #endif
  140. break;
  141. case DAP_ID_SWO_BUFFER_SIZE:
  142. #if ((SWO_UART != 0) || (SWO_MANCHESTER != 0))
  143. info[0] = (uint8_t)(SWO_BUFFER_SIZE >> 0);
  144. info[1] = (uint8_t)(SWO_BUFFER_SIZE >> 8);
  145. info[2] = (uint8_t)(SWO_BUFFER_SIZE >> 16);
  146. info[3] = (uint8_t)(SWO_BUFFER_SIZE >> 24);
  147. length = 4U;
  148. #endif
  149. break;
  150. case DAP_ID_PACKET_SIZE:
  151. info[0] = (uint8_t)(DAP_PACKET_SIZE >> 0);
  152. info[1] = (uint8_t)(DAP_PACKET_SIZE >> 8);
  153. length = 2U;
  154. break;
  155. case DAP_ID_PACKET_COUNT:
  156. info[0] = DAP_PACKET_COUNT;
  157. length = 1U;
  158. break;
  159. default:
  160. break;
  161. }
  162. return (length);
  163. }
  164. // Delay for specified time
  165. // delay: delay time in ms
  166. void Delayms(uint32_t delay) {
  167. delay *= ((CPU_CLOCK/1000U) + (DELAY_SLOW_CYCLES-1U)) / DELAY_SLOW_CYCLES;
  168. PIN_DELAY_SLOW(delay);
  169. }
  170. // Process Delay command and prepare response
  171. // request: pointer to request data
  172. // response: pointer to response data
  173. // return: number of bytes in response (lower 16 bits)
  174. // number of bytes in request (upper 16 bits)
  175. static uint32_t DAP_Delay(const uint8_t *request, uint8_t *response) {
  176. uint32_t delay;
  177. delay = (uint32_t)(*(request+0)) |
  178. (uint32_t)(*(request+1) << 8);
  179. delay *= ((CPU_CLOCK/1000000U) + (DELAY_SLOW_CYCLES-1U)) / DELAY_SLOW_CYCLES;
  180. PIN_DELAY_SLOW(delay);
  181. *response = DAP_OK;
  182. return ((2U << 16) | 1U);
  183. }
  184. // Process Host Status command and prepare response
  185. // request: pointer to request data
  186. // response: pointer to response data
  187. // return: number of bytes in response (lower 16 bits)
  188. // number of bytes in request (upper 16 bits)
  189. static uint32_t DAP_HostStatus(const uint8_t *request, uint8_t *response) {
  190. switch (*request) {
  191. case DAP_DEBUGGER_CONNECTED:
  192. LED_CONNECTED_OUT((*(request+1) & 1U));
  193. break;
  194. case DAP_TARGET_RUNNING:
  195. LED_RUNNING_OUT((*(request+1) & 1U));
  196. break;
  197. default:
  198. *response = DAP_ERROR;
  199. return ((2U << 16) | 1U);
  200. }
  201. *response = DAP_OK;
  202. return ((2U << 16) | 1U);
  203. }
  204. // Process Connect command and prepare response
  205. // request: pointer to request data
  206. // response: pointer to response data
  207. // return: number of bytes in response (lower 16 bits)
  208. // number of bytes in request (upper 16 bits)
  209. static uint32_t DAP_Connect(const uint8_t *request, uint8_t *response) {
  210. uint32_t port;
  211. if (*request == DAP_PORT_AUTODETECT) {
  212. port = DAP_DEFAULT_PORT;
  213. } else {
  214. port = *request;
  215. }
  216. switch (port) {
  217. #if (DAP_SWD != 0)
  218. case DAP_PORT_SWD:
  219. DAP_Data.debug_port = DAP_PORT_SWD;
  220. PORT_SWD_SETUP();
  221. break;
  222. #endif
  223. #if (DAP_JTAG != 0)
  224. case DAP_PORT_JTAG:
  225. DAP_Data.debug_port = DAP_PORT_JTAG;
  226. PORT_JTAG_SETUP();
  227. break;
  228. #endif
  229. default:
  230. port = DAP_PORT_DISABLED;
  231. break;
  232. }
  233. *response = (uint8_t)port;
  234. return ((1U << 16) | 1U);
  235. }
  236. // Process Disconnect command and prepare response
  237. // response: pointer to response data
  238. // return: number of bytes in response
  239. static uint32_t DAP_Disconnect(uint8_t *response) {
  240. DAP_Data.debug_port = DAP_PORT_DISABLED;
  241. PORT_OFF();
  242. *response = DAP_OK;
  243. return (1U);
  244. }
  245. // Process Reset Target command and prepare response
  246. // response: pointer to response data
  247. // return: number of bytes in response
  248. static uint32_t DAP_ResetTarget(uint8_t *response) {
  249. *(response+1) = RESET_TARGET();
  250. *(response+0) = DAP_OK;
  251. return (2U);
  252. }
  253. // Process SWJ Pins command and prepare response
  254. // request: pointer to request data
  255. // response: pointer to response data
  256. // return: number of bytes in response (lower 16 bits)
  257. // number of bytes in request (upper 16 bits)
  258. static uint32_t DAP_SWJ_Pins(const uint8_t *request, uint8_t *response) {
  259. #if ((DAP_SWD != 0) || (DAP_JTAG != 0))
  260. uint32_t value;
  261. uint32_t select;
  262. uint32_t wait;
  263. uint32_t timestamp;
  264. value = (uint32_t) *(request+0);
  265. select = (uint32_t) *(request+1);
  266. wait = (uint32_t)(*(request+2) << 0) |
  267. (uint32_t)(*(request+3) << 8) |
  268. (uint32_t)(*(request+4) << 16) |
  269. (uint32_t)(*(request+5) << 24);
  270. if ((select & (1U << DAP_SWJ_SWCLK_TCK)) != 0U) {
  271. if ((value & (1U << DAP_SWJ_SWCLK_TCK)) != 0U) {
  272. PIN_SWCLK_TCK_SET();
  273. } else {
  274. PIN_SWCLK_TCK_CLR();
  275. }
  276. }
  277. if ((select & (1U << DAP_SWJ_SWDIO_TMS)) != 0U) {
  278. if ((value & (1U << DAP_SWJ_SWDIO_TMS)) != 0U) {
  279. PIN_SWDIO_TMS_SET();
  280. } else {
  281. PIN_SWDIO_TMS_CLR();
  282. }
  283. }
  284. if ((select & (1U << DAP_SWJ_TDI)) != 0U) {
  285. PIN_TDI_OUT(value >> DAP_SWJ_TDI);
  286. }
  287. if ((select & (1U << DAP_SWJ_nTRST)) != 0U) {
  288. PIN_nTRST_OUT(value >> DAP_SWJ_nTRST);
  289. }
  290. if ((select & (1U << DAP_SWJ_nRESET)) != 0U){
  291. PIN_nRESET_OUT(value >> DAP_SWJ_nRESET);
  292. }
  293. if (wait != 0U) {
  294. #if (TIMESTAMP_CLOCK != 0U)
  295. if (wait > 3000000U) {
  296. wait = 3000000U;
  297. }
  298. #if (TIMESTAMP_CLOCK >= 1000000U)
  299. wait *= TIMESTAMP_CLOCK / 1000000U;
  300. #else
  301. wait /= 1000000U / TIMESTAMP_CLOCK;
  302. #endif
  303. #else
  304. wait = 1U;
  305. #endif
  306. timestamp = TIMESTAMP_GET();
  307. do {
  308. if ((select & (1U << DAP_SWJ_SWCLK_TCK)) != 0U) {
  309. if ((value >> DAP_SWJ_SWCLK_TCK) ^ PIN_SWCLK_TCK_IN()) {
  310. continue;
  311. }
  312. }
  313. if ((select & (1U << DAP_SWJ_SWDIO_TMS)) != 0U) {
  314. if ((value >> DAP_SWJ_SWDIO_TMS) ^ PIN_SWDIO_TMS_IN()) {
  315. continue;
  316. }
  317. }
  318. if ((select & (1U << DAP_SWJ_TDI)) != 0U) {
  319. if ((value >> DAP_SWJ_TDI) ^ PIN_TDI_IN()) {
  320. continue;
  321. }
  322. }
  323. if ((select & (1U << DAP_SWJ_nTRST)) != 0U) {
  324. if ((value >> DAP_SWJ_nTRST) ^ PIN_nTRST_IN()) {
  325. continue;
  326. }
  327. }
  328. if ((select & (1U << DAP_SWJ_nRESET)) != 0U) {
  329. if ((value >> DAP_SWJ_nRESET) ^ PIN_nRESET_IN()) {
  330. continue;
  331. }
  332. }
  333. break;
  334. } while ((TIMESTAMP_GET() - timestamp) < wait);
  335. }
  336. value = (PIN_SWCLK_TCK_IN() << DAP_SWJ_SWCLK_TCK) |
  337. (PIN_SWDIO_TMS_IN() << DAP_SWJ_SWDIO_TMS) |
  338. (PIN_TDI_IN() << DAP_SWJ_TDI) |
  339. (PIN_TDO_IN() << DAP_SWJ_TDO) |
  340. (PIN_nTRST_IN() << DAP_SWJ_nTRST) |
  341. (PIN_nRESET_IN() << DAP_SWJ_nRESET);
  342. *response = (uint8_t)value;
  343. #else
  344. *response = 0U;
  345. #endif
  346. return ((6U << 16) | 1U);
  347. }
  348. // Process SWJ Clock command and prepare response
  349. // request: pointer to request data
  350. // response: pointer to response data
  351. // return: number of bytes in response (lower 16 bits)
  352. // number of bytes in request (upper 16 bits)
  353. static uint32_t DAP_SWJ_Clock(const uint8_t *request, uint8_t *response) {
  354. #if ((DAP_SWD != 0) || (DAP_JTAG != 0))
  355. uint32_t clock;
  356. uint32_t delay;
  357. clock = (uint32_t)(*(request+0) << 0) |
  358. (uint32_t)(*(request+1) << 8) |
  359. (uint32_t)(*(request+2) << 16) |
  360. (uint32_t)(*(request+3) << 24);
  361. if (clock == 0U) {
  362. *response = DAP_ERROR;
  363. return ((4U << 16) | 1U);
  364. }
  365. Set_Clock_Delay(clock);
  366. *response = DAP_OK;
  367. #else
  368. *response = DAP_ERROR;
  369. #endif
  370. return ((4U << 16) | 1U);
  371. }
  372. // Process SWJ Sequence command and prepare response
  373. // request: pointer to request data
  374. // response: pointer to response data
  375. // return: number of bytes in response (lower 16 bits)
  376. // number of bytes in request (upper 16 bits)
  377. static uint32_t DAP_SWJ_Sequence(const uint8_t *request, uint8_t *response) {
  378. uint32_t count;
  379. count = *request++;
  380. if (count == 0U) {
  381. count = 256U;
  382. }
  383. #if ((DAP_SWD != 0) || (DAP_JTAG != 0))
  384. SWJ_Sequence(count, request);
  385. *response = DAP_OK;
  386. #else
  387. *response = DAP_ERROR;
  388. #endif
  389. count = (count + 7U) >> 3;
  390. return (((count + 1U) << 16) | 1U);
  391. }
  392. // Process SWD Configure command and prepare response
  393. // request: pointer to request data
  394. // response: pointer to response data
  395. // return: number of bytes in response (lower 16 bits)
  396. // number of bytes in request (upper 16 bits)
  397. static uint32_t DAP_SWD_Configure(const uint8_t *request, uint8_t *response) {
  398. #if (DAP_SWD != 0)
  399. uint8_t value;
  400. value = *request;
  401. DAP_Data.swd_conf.turnaround = (value & 0x03U) + 1U;
  402. DAP_Data.swd_conf.data_phase = (value & 0x04U) ? 1U : 0U;
  403. *response = DAP_OK;
  404. #else
  405. *response = DAP_ERROR;
  406. #endif
  407. return ((1U << 16) | 1U);
  408. }
  409. // Process SWD Sequence command and prepare response
  410. // request: pointer to request data
  411. // response: pointer to response data
  412. // return: number of bytes in response (lower 16 bits)
  413. // number of bytes in request (upper 16 bits)
  414. static uint32_t DAP_SWD_Sequence(const uint8_t *request, uint8_t *response) {
  415. uint32_t sequence_info;
  416. uint32_t sequence_count;
  417. uint32_t request_count;
  418. uint32_t response_count;
  419. uint32_t count;
  420. #if (DAP_SWD != 0)
  421. *response++ = DAP_OK;
  422. #else
  423. *response++ = DAP_ERROR;
  424. #endif
  425. request_count = 1U;
  426. response_count = 1U;
  427. sequence_count = *request++;
  428. while (sequence_count--) {
  429. sequence_info = *request++;
  430. count = sequence_info & SWD_SEQUENCE_CLK;
  431. if (count == 0U) {
  432. count = 64U;
  433. }
  434. count = (count + 7U) / 8U;
  435. #if (DAP_SWD != 0)
  436. if ((sequence_info & SWD_SEQUENCE_DIN) != 0U) {
  437. PIN_SWDIO_OUT_DISABLE();
  438. } else {
  439. PIN_SWDIO_OUT_ENABLE();
  440. }
  441. SWD_Sequence(sequence_info, request, response);
  442. if (sequence_count == 0U) {
  443. PIN_SWDIO_OUT_ENABLE();
  444. }
  445. #endif
  446. if ((sequence_info & SWD_SEQUENCE_DIN) != 0U) {
  447. request_count++;
  448. #if (DAP_SWD != 0)
  449. response += count;
  450. response_count += count;
  451. #endif
  452. } else {
  453. request += count;
  454. request_count += count + 1U;
  455. }
  456. }
  457. return ((request_count << 16) | response_count);
  458. }
  459. // Process JTAG Sequence command and prepare response
  460. // request: pointer to request data
  461. // response: pointer to response data
  462. // return: number of bytes in response (lower 16 bits)
  463. // number of bytes in request (upper 16 bits)
  464. static uint32_t DAP_JTAG_Sequence(const uint8_t *request, uint8_t *response) {
  465. uint32_t sequence_info;
  466. uint32_t sequence_count;
  467. uint32_t request_count;
  468. uint32_t response_count;
  469. uint32_t count;
  470. #if (DAP_JTAG != 0)
  471. *response++ = DAP_OK;
  472. #else
  473. *response++ = DAP_ERROR;
  474. #endif
  475. request_count = 1U;
  476. response_count = 1U;
  477. sequence_count = *request++;
  478. while (sequence_count--) {
  479. sequence_info = *request++;
  480. count = sequence_info & JTAG_SEQUENCE_TCK;
  481. if (count == 0U) {
  482. count = 64U;
  483. }
  484. count = (count + 7U) / 8U;
  485. #if (DAP_JTAG != 0)
  486. JTAG_Sequence(sequence_info, request, response);
  487. #endif
  488. request += count;
  489. request_count += count + 1U;
  490. #if (DAP_JTAG != 0)
  491. if ((sequence_info & JTAG_SEQUENCE_TDO) != 0U) {
  492. response += count;
  493. response_count += count;
  494. }
  495. #endif
  496. }
  497. return ((request_count << 16) | response_count);
  498. }
  499. // Process JTAG Configure command and prepare response
  500. // request: pointer to request data
  501. // response: pointer to response data
  502. // return: number of bytes in response (lower 16 bits)
  503. // number of bytes in request (upper 16 bits)
  504. static uint32_t DAP_JTAG_Configure(const uint8_t *request, uint8_t *response) {
  505. uint32_t count;
  506. #if (DAP_JTAG != 0)
  507. uint32_t length;
  508. uint32_t bits;
  509. uint32_t n;
  510. count = *request++;
  511. DAP_Data.jtag_dev.count = (uint8_t)count;
  512. bits = 0U;
  513. for (n = 0U; n < count; n++) {
  514. length = *request++;
  515. DAP_Data.jtag_dev.ir_length[n] = (uint8_t)length;
  516. DAP_Data.jtag_dev.ir_before[n] = (uint16_t)bits;
  517. bits += length;
  518. }
  519. for (n = 0U; n < count; n++) {
  520. bits -= DAP_Data.jtag_dev.ir_length[n];
  521. DAP_Data.jtag_dev.ir_after[n] = (uint16_t)bits;
  522. }
  523. *response = DAP_OK;
  524. #else
  525. count = *request;
  526. *response = DAP_ERROR;
  527. #endif
  528. return (((count + 1U) << 16) | 1U);
  529. }
  530. // Process JTAG IDCODE command and prepare response
  531. // request: pointer to request data
  532. // response: pointer to response data
  533. // return: number of bytes in response (lower 16 bits)
  534. // number of bytes in request (upper 16 bits)
  535. static uint32_t DAP_JTAG_IDCode(const uint8_t *request, uint8_t *response) {
  536. #if (DAP_JTAG != 0)
  537. uint32_t data;
  538. if (DAP_Data.debug_port != DAP_PORT_JTAG) {
  539. goto id_error;
  540. }
  541. // Device index (JTAP TAP)
  542. DAP_Data.jtag_dev.index = *request;
  543. if (DAP_Data.jtag_dev.index >= DAP_Data.jtag_dev.count) {
  544. goto id_error;
  545. }
  546. // Select JTAG chain
  547. JTAG_IR(JTAG_IDCODE);
  548. // Read IDCODE register
  549. data = JTAG_ReadIDCode();
  550. // Store Data
  551. *(response+0) = DAP_OK;
  552. *(response+1) = (uint8_t)(data >> 0);
  553. *(response+2) = (uint8_t)(data >> 8);
  554. *(response+3) = (uint8_t)(data >> 16);
  555. *(response+4) = (uint8_t)(data >> 24);
  556. return ((1U << 16) | 5U);
  557. id_error:
  558. #endif
  559. *response = DAP_ERROR;
  560. return ((1U << 16) | 1U);
  561. }
  562. // Process Transfer Configure command and prepare response
  563. // request: pointer to request data
  564. // response: pointer to response data
  565. // return: number of bytes in response (lower 16 bits)
  566. // number of bytes in request (upper 16 bits)
  567. static uint32_t DAP_TransferConfigure(const uint8_t *request, uint8_t *response) {
  568. DAP_Data.transfer.idle_cycles = *(request+0);
  569. DAP_Data.transfer.retry_count = (uint16_t) *(request+1) |
  570. (uint16_t)(*(request+2) << 8);
  571. DAP_Data.transfer.match_retry = (uint16_t) *(request+3) |
  572. (uint16_t)(*(request+4) << 8);
  573. *response = DAP_OK;
  574. return ((5U << 16) | 1U);
  575. }
  576. // Process SWD Transfer command and prepare response
  577. // request: pointer to request data
  578. // response: pointer to response data
  579. // return: number of bytes in response (lower 16 bits)
  580. // number of bytes in request (upper 16 bits)
  581. #if (DAP_SWD != 0)
  582. static uint32_t DAP_SWD_Transfer(const uint8_t *request, uint8_t *response) {
  583. const
  584. uint8_t *request_head;
  585. uint32_t request_count;
  586. uint32_t request_value;
  587. uint8_t *response_head;
  588. uint32_t response_count;
  589. uint32_t response_value;
  590. uint32_t post_read;
  591. uint32_t check_write;
  592. uint32_t match_value;
  593. uint32_t match_retry;
  594. uint32_t retry;
  595. uint32_t data;
  596. #if (TIMESTAMP_CLOCK != 0U)
  597. uint32_t timestamp;
  598. #endif
  599. request_head = request;
  600. response_count = 0U;
  601. response_value = 0U;
  602. response_head = response;
  603. response += 2;
  604. DAP_TransferAbort = 0U;
  605. post_read = 0U;
  606. check_write = 0U;
  607. request++; // Ignore DAP index
  608. request_count = *request++;
  609. for (; request_count != 0U; request_count--) {
  610. request_value = *request++;
  611. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  612. // Read register
  613. if (post_read) {
  614. // Read was posted before
  615. retry = DAP_Data.transfer.retry_count;
  616. if ((request_value & (DAP_TRANSFER_APnDP | DAP_TRANSFER_MATCH_VALUE)) == DAP_TRANSFER_APnDP) {
  617. // Read previous AP data and post next AP read
  618. do {
  619. response_value = SWD_Transfer(request_value, &data);
  620. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  621. } else {
  622. // Read previous AP data
  623. do {
  624. response_value = SWD_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  625. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  626. post_read = 0U;
  627. }
  628. if (response_value != DAP_TRANSFER_OK) {
  629. break;
  630. }
  631. // Store previous AP data
  632. *response++ = (uint8_t) data;
  633. *response++ = (uint8_t)(data >> 8);
  634. *response++ = (uint8_t)(data >> 16);
  635. *response++ = (uint8_t)(data >> 24);
  636. #if (TIMESTAMP_CLOCK != 0U)
  637. if (post_read) {
  638. // Store Timestamp of next AP read
  639. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  640. timestamp = DAP_Data.timestamp;
  641. *response++ = (uint8_t) timestamp;
  642. *response++ = (uint8_t)(timestamp >> 8);
  643. *response++ = (uint8_t)(timestamp >> 16);
  644. *response++ = (uint8_t)(timestamp >> 24);
  645. }
  646. }
  647. #endif
  648. }
  649. if ((request_value & DAP_TRANSFER_MATCH_VALUE) != 0U) {
  650. // Read with value match
  651. match_value = (uint32_t)(*(request+0) << 0) |
  652. (uint32_t)(*(request+1) << 8) |
  653. (uint32_t)(*(request+2) << 16) |
  654. (uint32_t)(*(request+3) << 24);
  655. request += 4;
  656. match_retry = DAP_Data.transfer.match_retry;
  657. if ((request_value & DAP_TRANSFER_APnDP) != 0U) {
  658. // Post AP read
  659. retry = DAP_Data.transfer.retry_count;
  660. do {
  661. response_value = SWD_Transfer(request_value, NULL);
  662. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  663. if (response_value != DAP_TRANSFER_OK) {
  664. break;
  665. }
  666. }
  667. do {
  668. // Read register until its value matches or retry counter expires
  669. retry = DAP_Data.transfer.retry_count;
  670. do {
  671. response_value = SWD_Transfer(request_value, &data);
  672. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  673. if (response_value != DAP_TRANSFER_OK) {
  674. break;
  675. }
  676. } while (((data & DAP_Data.transfer.match_mask) != match_value) && match_retry-- && !DAP_TransferAbort);
  677. if ((data & DAP_Data.transfer.match_mask) != match_value) {
  678. response_value |= DAP_TRANSFER_MISMATCH;
  679. }
  680. if (response_value != DAP_TRANSFER_OK) {
  681. break;
  682. }
  683. } else {
  684. // Normal read
  685. retry = DAP_Data.transfer.retry_count;
  686. if ((request_value & DAP_TRANSFER_APnDP) != 0U) {
  687. // Read AP register
  688. if (post_read == 0U) {
  689. // Post AP read
  690. do {
  691. response_value = SWD_Transfer(request_value, NULL);
  692. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  693. if (response_value != DAP_TRANSFER_OK) {
  694. break;
  695. }
  696. #if (TIMESTAMP_CLOCK != 0U)
  697. // Store Timestamp
  698. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  699. timestamp = DAP_Data.timestamp;
  700. *response++ = (uint8_t) timestamp;
  701. *response++ = (uint8_t)(timestamp >> 8);
  702. *response++ = (uint8_t)(timestamp >> 16);
  703. *response++ = (uint8_t)(timestamp >> 24);
  704. }
  705. #endif
  706. post_read = 1U;
  707. }
  708. } else {
  709. // Read DP register
  710. do {
  711. response_value = SWD_Transfer(request_value, &data);
  712. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  713. if (response_value != DAP_TRANSFER_OK) {
  714. break;
  715. }
  716. #if (TIMESTAMP_CLOCK != 0U)
  717. // Store Timestamp
  718. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  719. timestamp = DAP_Data.timestamp;
  720. *response++ = (uint8_t) timestamp;
  721. *response++ = (uint8_t)(timestamp >> 8);
  722. *response++ = (uint8_t)(timestamp >> 16);
  723. *response++ = (uint8_t)(timestamp >> 24);
  724. }
  725. #endif
  726. // Store data
  727. *response++ = (uint8_t) data;
  728. *response++ = (uint8_t)(data >> 8);
  729. *response++ = (uint8_t)(data >> 16);
  730. *response++ = (uint8_t)(data >> 24);
  731. }
  732. }
  733. check_write = 0U;
  734. } else {
  735. // Write register
  736. if (post_read) {
  737. // Read previous data
  738. retry = DAP_Data.transfer.retry_count;
  739. do {
  740. response_value = SWD_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  741. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  742. if (response_value != DAP_TRANSFER_OK) {
  743. break;
  744. }
  745. // Store previous data
  746. *response++ = (uint8_t) data;
  747. *response++ = (uint8_t)(data >> 8);
  748. *response++ = (uint8_t)(data >> 16);
  749. *response++ = (uint8_t)(data >> 24);
  750. post_read = 0U;
  751. }
  752. // Load data
  753. data = (uint32_t)(*(request+0) << 0) |
  754. (uint32_t)(*(request+1) << 8) |
  755. (uint32_t)(*(request+2) << 16) |
  756. (uint32_t)(*(request+3) << 24);
  757. request += 4;
  758. if ((request_value & DAP_TRANSFER_MATCH_MASK) != 0U) {
  759. // Write match mask
  760. DAP_Data.transfer.match_mask = data;
  761. response_value = DAP_TRANSFER_OK;
  762. } else {
  763. // Write DP/AP register
  764. retry = DAP_Data.transfer.retry_count;
  765. do {
  766. response_value = SWD_Transfer(request_value, &data);
  767. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  768. if (response_value != DAP_TRANSFER_OK) {
  769. break;
  770. }
  771. #if (TIMESTAMP_CLOCK != 0U)
  772. // Store Timestamp
  773. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  774. timestamp = DAP_Data.timestamp;
  775. *response++ = (uint8_t) timestamp;
  776. *response++ = (uint8_t)(timestamp >> 8);
  777. *response++ = (uint8_t)(timestamp >> 16);
  778. *response++ = (uint8_t)(timestamp >> 24);
  779. }
  780. #endif
  781. check_write = 1U;
  782. }
  783. }
  784. response_count++;
  785. if (DAP_TransferAbort) {
  786. break;
  787. }
  788. }
  789. for (; request_count != 0U; request_count--) {
  790. // Process canceled requests
  791. request_value = *request++;
  792. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  793. // Read register
  794. if ((request_value & DAP_TRANSFER_MATCH_VALUE) != 0U) {
  795. // Read with value match
  796. request += 4;
  797. }
  798. } else {
  799. // Write register
  800. request += 4;
  801. }
  802. }
  803. if (response_value == DAP_TRANSFER_OK) {
  804. if (post_read) {
  805. // Read previous data
  806. retry = DAP_Data.transfer.retry_count;
  807. do {
  808. response_value = SWD_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  809. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  810. if (response_value != DAP_TRANSFER_OK) {
  811. goto end;
  812. }
  813. // Store previous data
  814. *response++ = (uint8_t) data;
  815. *response++ = (uint8_t)(data >> 8);
  816. *response++ = (uint8_t)(data >> 16);
  817. *response++ = (uint8_t)(data >> 24);
  818. } else if (check_write) {
  819. // Check last write
  820. retry = DAP_Data.transfer.retry_count;
  821. do {
  822. response_value = SWD_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, NULL);
  823. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  824. }
  825. }
  826. end:
  827. *(response_head+0) = (uint8_t)response_count;
  828. *(response_head+1) = (uint8_t)response_value;
  829. return (((uint32_t)(request - request_head) << 16) | (uint32_t)(response - response_head));
  830. }
  831. #endif
  832. // Process JTAG Transfer command and prepare response
  833. // request: pointer to request data
  834. // response: pointer to response data
  835. // return: number of bytes in response (lower 16 bits)
  836. // number of bytes in request (upper 16 bits)
  837. #if (DAP_JTAG != 0)
  838. static uint32_t DAP_JTAG_Transfer(const uint8_t *request, uint8_t *response) {
  839. const
  840. uint8_t *request_head;
  841. uint32_t request_count;
  842. uint32_t request_value;
  843. uint32_t request_ir;
  844. uint8_t *response_head;
  845. uint32_t response_count;
  846. uint32_t response_value;
  847. uint32_t post_read;
  848. uint32_t match_value;
  849. uint32_t match_retry;
  850. uint32_t retry;
  851. uint32_t data;
  852. uint32_t ir;
  853. #if (TIMESTAMP_CLOCK != 0U)
  854. uint32_t timestamp;
  855. #endif
  856. request_head = request;
  857. response_count = 0U;
  858. response_value = 0U;
  859. response_head = response;
  860. response += 2;
  861. DAP_TransferAbort = 0U;
  862. ir = 0U;
  863. post_read = 0U;
  864. // Device index (JTAP TAP)
  865. DAP_Data.jtag_dev.index = *request++;
  866. if (DAP_Data.jtag_dev.index >= DAP_Data.jtag_dev.count) {
  867. goto end;
  868. }
  869. request_count = *request++;
  870. for (; request_count != 0U; request_count--) {
  871. request_value = *request++;
  872. request_ir = (request_value & DAP_TRANSFER_APnDP) ? JTAG_APACC : JTAG_DPACC;
  873. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  874. // Read register
  875. if (post_read) {
  876. // Read was posted before
  877. retry = DAP_Data.transfer.retry_count;
  878. if ((ir == request_ir) && ((request_value & DAP_TRANSFER_MATCH_VALUE) == 0U)) {
  879. // Read previous data and post next read
  880. do {
  881. response_value = JTAG_Transfer(request_value, &data);
  882. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  883. } else {
  884. // Select JTAG chain
  885. if (ir != JTAG_DPACC) {
  886. ir = JTAG_DPACC;
  887. JTAG_IR(ir);
  888. }
  889. // Read previous data
  890. do {
  891. response_value = JTAG_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  892. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  893. post_read = 0U;
  894. }
  895. if (response_value != DAP_TRANSFER_OK) {
  896. break;
  897. }
  898. // Store previous data
  899. *response++ = (uint8_t) data;
  900. *response++ = (uint8_t)(data >> 8);
  901. *response++ = (uint8_t)(data >> 16);
  902. *response++ = (uint8_t)(data >> 24);
  903. #if (TIMESTAMP_CLOCK != 0U)
  904. if (post_read) {
  905. // Store Timestamp of next AP read
  906. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  907. timestamp = DAP_Data.timestamp;
  908. *response++ = (uint8_t) timestamp;
  909. *response++ = (uint8_t)(timestamp >> 8);
  910. *response++ = (uint8_t)(timestamp >> 16);
  911. *response++ = (uint8_t)(timestamp >> 24);
  912. }
  913. }
  914. #endif
  915. }
  916. if ((request_value & DAP_TRANSFER_MATCH_VALUE) != 0U) {
  917. // Read with value match
  918. match_value = (uint32_t)(*(request+0) << 0) |
  919. (uint32_t)(*(request+1) << 8) |
  920. (uint32_t)(*(request+2) << 16) |
  921. (uint32_t)(*(request+3) << 24);
  922. request += 4;
  923. match_retry = DAP_Data.transfer.match_retry;
  924. // Select JTAG chain
  925. if (ir != request_ir) {
  926. ir = request_ir;
  927. JTAG_IR(ir);
  928. }
  929. // Post DP/AP read
  930. retry = DAP_Data.transfer.retry_count;
  931. do {
  932. response_value = JTAG_Transfer(request_value, NULL);
  933. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  934. if (response_value != DAP_TRANSFER_OK) {
  935. break;
  936. }
  937. do {
  938. // Read register until its value matches or retry counter expires
  939. retry = DAP_Data.transfer.retry_count;
  940. do {
  941. response_value = JTAG_Transfer(request_value, &data);
  942. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  943. if (response_value != DAP_TRANSFER_OK) {
  944. break;
  945. }
  946. } while (((data & DAP_Data.transfer.match_mask) != match_value) && match_retry-- && !DAP_TransferAbort);
  947. if ((data & DAP_Data.transfer.match_mask) != match_value) {
  948. response_value |= DAP_TRANSFER_MISMATCH;
  949. }
  950. if (response_value != DAP_TRANSFER_OK) {
  951. break;
  952. }
  953. } else {
  954. // Normal read
  955. if (post_read == 0U) {
  956. // Select JTAG chain
  957. if (ir != request_ir) {
  958. ir = request_ir;
  959. JTAG_IR(ir);
  960. }
  961. // Post DP/AP read
  962. retry = DAP_Data.transfer.retry_count;
  963. do {
  964. response_value = JTAG_Transfer(request_value, NULL);
  965. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  966. if (response_value != DAP_TRANSFER_OK) {
  967. break;
  968. }
  969. #if (TIMESTAMP_CLOCK != 0U)
  970. // Store Timestamp
  971. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  972. timestamp = DAP_Data.timestamp;
  973. *response++ = (uint8_t) timestamp;
  974. *response++ = (uint8_t)(timestamp >> 8);
  975. *response++ = (uint8_t)(timestamp >> 16);
  976. *response++ = (uint8_t)(timestamp >> 24);
  977. }
  978. #endif
  979. post_read = 1U;
  980. }
  981. }
  982. } else {
  983. // Write register
  984. if (post_read) {
  985. // Select JTAG chain
  986. if (ir != JTAG_DPACC) {
  987. ir = JTAG_DPACC;
  988. JTAG_IR(ir);
  989. }
  990. // Read previous data
  991. retry = DAP_Data.transfer.retry_count;
  992. do {
  993. response_value = JTAG_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  994. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  995. if (response_value != DAP_TRANSFER_OK) {
  996. break;
  997. }
  998. // Store previous data
  999. *response++ = (uint8_t) data;
  1000. *response++ = (uint8_t)(data >> 8);
  1001. *response++ = (uint8_t)(data >> 16);
  1002. *response++ = (uint8_t)(data >> 24);
  1003. post_read = 0U;
  1004. }
  1005. // Load data
  1006. data = (uint32_t)(*(request+0) << 0) |
  1007. (uint32_t)(*(request+1) << 8) |
  1008. (uint32_t)(*(request+2) << 16) |
  1009. (uint32_t)(*(request+3) << 24);
  1010. request += 4;
  1011. if ((request_value & DAP_TRANSFER_MATCH_MASK) != 0U) {
  1012. // Write match mask
  1013. DAP_Data.transfer.match_mask = data;
  1014. response_value = DAP_TRANSFER_OK;
  1015. } else {
  1016. // Select JTAG chain
  1017. if (ir != request_ir) {
  1018. ir = request_ir;
  1019. JTAG_IR(ir);
  1020. }
  1021. // Write DP/AP register
  1022. retry = DAP_Data.transfer.retry_count;
  1023. do {
  1024. response_value = JTAG_Transfer(request_value, &data);
  1025. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1026. if (response_value != DAP_TRANSFER_OK) {
  1027. break;
  1028. }
  1029. #if (TIMESTAMP_CLOCK != 0U)
  1030. // Store Timestamp
  1031. if ((request_value & DAP_TRANSFER_TIMESTAMP) != 0U) {
  1032. timestamp = DAP_Data.timestamp;
  1033. *response++ = (uint8_t) timestamp;
  1034. *response++ = (uint8_t)(timestamp >> 8);
  1035. *response++ = (uint8_t)(timestamp >> 16);
  1036. *response++ = (uint8_t)(timestamp >> 24);
  1037. }
  1038. #endif
  1039. }
  1040. }
  1041. response_count++;
  1042. if (DAP_TransferAbort) {
  1043. break;
  1044. }
  1045. }
  1046. for (; request_count != 0U; request_count--) {
  1047. // Process canceled requests
  1048. request_value = *request++;
  1049. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  1050. // Read register
  1051. if ((request_value & DAP_TRANSFER_MATCH_VALUE) != 0U) {
  1052. // Read with value match
  1053. request += 4;
  1054. }
  1055. } else {
  1056. // Write register
  1057. request += 4;
  1058. }
  1059. }
  1060. if (response_value == DAP_TRANSFER_OK) {
  1061. // Select JTAG chain
  1062. if (ir != JTAG_DPACC) {
  1063. ir = JTAG_DPACC;
  1064. JTAG_IR(ir);
  1065. }
  1066. if (post_read) {
  1067. // Read previous data
  1068. retry = DAP_Data.transfer.retry_count;
  1069. do {
  1070. response_value = JTAG_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, &data);
  1071. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1072. if (response_value != DAP_TRANSFER_OK) {
  1073. goto end;
  1074. }
  1075. // Store previous data
  1076. *response++ = (uint8_t) data;
  1077. *response++ = (uint8_t)(data >> 8);
  1078. *response++ = (uint8_t)(data >> 16);
  1079. *response++ = (uint8_t)(data >> 24);
  1080. } else {
  1081. // Check last write
  1082. retry = DAP_Data.transfer.retry_count;
  1083. do {
  1084. response_value = JTAG_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, NULL);
  1085. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1086. }
  1087. }
  1088. end:
  1089. *(response_head+0) = (uint8_t)response_count;
  1090. *(response_head+1) = (uint8_t)response_value;
  1091. return (((uint32_t)(request - request_head) << 16) | (uint32_t)(response - response_head));
  1092. }
  1093. #endif
  1094. // Process Dummy Transfer command and prepare response
  1095. // request: pointer to request data
  1096. // response: pointer to response data
  1097. // return: number of bytes in response (lower 16 bits)
  1098. // number of bytes in request (upper 16 bits)
  1099. static uint32_t DAP_Dummy_Transfer(const uint8_t *request, uint8_t *response) {
  1100. const
  1101. uint8_t *request_head;
  1102. uint32_t request_count;
  1103. uint32_t request_value;
  1104. request_head = request;
  1105. request++; // Ignore DAP index
  1106. request_count = *request++;
  1107. for (; request_count != 0U; request_count--) {
  1108. // Process dummy requests
  1109. request_value = *request++;
  1110. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  1111. // Read register
  1112. if ((request_value & DAP_TRANSFER_MATCH_VALUE) != 0U) {
  1113. // Read with value match
  1114. request += 4;
  1115. }
  1116. } else {
  1117. // Write register
  1118. request += 4;
  1119. }
  1120. }
  1121. *(response+0) = 0U; // Response count
  1122. *(response+1) = 0U; // Response value
  1123. return (((uint32_t)(request - request_head) << 16) | 2U);
  1124. }
  1125. // Process Transfer command and prepare response
  1126. // request: pointer to request data
  1127. // response: pointer to response data
  1128. // return: number of bytes in response (lower 16 bits)
  1129. // number of bytes in request (upper 16 bits)
  1130. static uint32_t DAP_Transfer(const uint8_t *request, uint8_t *response) {
  1131. uint32_t num;
  1132. switch (DAP_Data.debug_port) {
  1133. #if (DAP_SWD != 0)
  1134. case DAP_PORT_SWD:
  1135. num = DAP_SWD_Transfer(request, response);
  1136. break;
  1137. #endif
  1138. #if (DAP_JTAG != 0)
  1139. case DAP_PORT_JTAG:
  1140. num = DAP_JTAG_Transfer(request, response);
  1141. break;
  1142. #endif
  1143. default:
  1144. num = DAP_Dummy_Transfer(request, response);
  1145. break;
  1146. }
  1147. return (num);
  1148. }
  1149. // Process SWD Transfer Block command and prepare response
  1150. // request: pointer to request data
  1151. // response: pointer to response data
  1152. // return: number of bytes in response
  1153. #if (DAP_SWD != 0)
  1154. static uint32_t DAP_SWD_TransferBlock(const uint8_t *request, uint8_t *response) {
  1155. uint32_t request_count;
  1156. uint32_t request_value;
  1157. uint32_t response_count;
  1158. uint32_t response_value;
  1159. uint8_t *response_head;
  1160. uint32_t retry;
  1161. uint32_t data;
  1162. response_count = 0U;
  1163. response_value = 0U;
  1164. response_head = response;
  1165. response += 3;
  1166. DAP_TransferAbort = 0U;
  1167. request++; // Ignore DAP index
  1168. request_count = (uint32_t)(*(request+0) << 0) |
  1169. (uint32_t)(*(request+1) << 8);
  1170. request += 2;
  1171. if (request_count == 0U) {
  1172. goto end;
  1173. }
  1174. request_value = *request++;
  1175. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  1176. // Read register block
  1177. if ((request_value & DAP_TRANSFER_APnDP) != 0U) {
  1178. // Post AP read
  1179. retry = DAP_Data.transfer.retry_count;
  1180. do {
  1181. response_value = SWD_Transfer(request_value, NULL);
  1182. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1183. if (response_value != DAP_TRANSFER_OK) {
  1184. goto end;
  1185. }
  1186. }
  1187. while (request_count--) {
  1188. // Read DP/AP register
  1189. if ((request_count == 0U) && ((request_value & DAP_TRANSFER_APnDP) != 0U)) {
  1190. // Last AP read
  1191. request_value = DP_RDBUFF | DAP_TRANSFER_RnW;
  1192. }
  1193. retry = DAP_Data.transfer.retry_count;
  1194. do {
  1195. response_value = SWD_Transfer(request_value, &data);
  1196. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1197. if (response_value != DAP_TRANSFER_OK) {
  1198. goto end;
  1199. }
  1200. // Store data
  1201. *response++ = (uint8_t) data;
  1202. *response++ = (uint8_t)(data >> 8);
  1203. *response++ = (uint8_t)(data >> 16);
  1204. *response++ = (uint8_t)(data >> 24);
  1205. response_count++;
  1206. }
  1207. } else {
  1208. // Write register block
  1209. while (request_count--) {
  1210. // Load data
  1211. data = (uint32_t)(*(request+0) << 0) |
  1212. (uint32_t)(*(request+1) << 8) |
  1213. (uint32_t)(*(request+2) << 16) |
  1214. (uint32_t)(*(request+3) << 24);
  1215. request += 4;
  1216. // Write DP/AP register
  1217. retry = DAP_Data.transfer.retry_count;
  1218. do {
  1219. response_value = SWD_Transfer(request_value, &data);
  1220. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1221. if (response_value != DAP_TRANSFER_OK) {
  1222. goto end;
  1223. }
  1224. response_count++;
  1225. }
  1226. // Check last write
  1227. retry = DAP_Data.transfer.retry_count;
  1228. do {
  1229. response_value = SWD_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, NULL);
  1230. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1231. }
  1232. end:
  1233. *(response_head+0) = (uint8_t)(response_count >> 0);
  1234. *(response_head+1) = (uint8_t)(response_count >> 8);
  1235. *(response_head+2) = (uint8_t) response_value;
  1236. return ((uint32_t)(response - response_head));
  1237. }
  1238. #endif
  1239. // Process JTAG Transfer Block command and prepare response
  1240. // request: pointer to request data
  1241. // response: pointer to response data
  1242. // return: number of bytes in response
  1243. #if (DAP_JTAG != 0)
  1244. static uint32_t DAP_JTAG_TransferBlock(const uint8_t *request, uint8_t *response) {
  1245. uint32_t request_count;
  1246. uint32_t request_value;
  1247. uint32_t response_count;
  1248. uint32_t response_value;
  1249. uint8_t *response_head;
  1250. uint32_t retry;
  1251. uint32_t data;
  1252. uint32_t ir;
  1253. response_count = 0U;
  1254. response_value = 0U;
  1255. response_head = response;
  1256. response += 3;
  1257. DAP_TransferAbort = 0U;
  1258. // Device index (JTAP TAP)
  1259. DAP_Data.jtag_dev.index = *request++;
  1260. if (DAP_Data.jtag_dev.index >= DAP_Data.jtag_dev.count) {
  1261. goto end;
  1262. }
  1263. request_count = (uint32_t)(*(request+0) << 0) |
  1264. (uint32_t)(*(request+1) << 8);
  1265. request += 2;
  1266. if (request_count == 0U) {
  1267. goto end;
  1268. }
  1269. request_value = *request++;
  1270. // Select JTAG chain
  1271. ir = (request_value & DAP_TRANSFER_APnDP) ? JTAG_APACC : JTAG_DPACC;
  1272. JTAG_IR(ir);
  1273. if ((request_value & DAP_TRANSFER_RnW) != 0U) {
  1274. // Post read
  1275. retry = DAP_Data.transfer.retry_count;
  1276. do {
  1277. response_value = JTAG_Transfer(request_value, NULL);
  1278. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1279. if (response_value != DAP_TRANSFER_OK) {
  1280. goto end;
  1281. }
  1282. // Read register block
  1283. while (request_count--) {
  1284. // Read DP/AP register
  1285. if (request_count == 0U) {
  1286. // Last read
  1287. if (ir != JTAG_DPACC) {
  1288. JTAG_IR(JTAG_DPACC);
  1289. }
  1290. request_value = DP_RDBUFF | DAP_TRANSFER_RnW;
  1291. }
  1292. retry = DAP_Data.transfer.retry_count;
  1293. do {
  1294. response_value = JTAG_Transfer(request_value, &data);
  1295. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1296. if (response_value != DAP_TRANSFER_OK) {
  1297. goto end;
  1298. }
  1299. // Store data
  1300. *response++ = (uint8_t) data;
  1301. *response++ = (uint8_t)(data >> 8);
  1302. *response++ = (uint8_t)(data >> 16);
  1303. *response++ = (uint8_t)(data >> 24);
  1304. response_count++;
  1305. }
  1306. } else {
  1307. // Write register block
  1308. while (request_count--) {
  1309. // Load data
  1310. data = (uint32_t)(*(request+0) << 0) |
  1311. (uint32_t)(*(request+1) << 8) |
  1312. (uint32_t)(*(request+2) << 16) |
  1313. (uint32_t)(*(request+3) << 24);
  1314. request += 4;
  1315. // Write DP/AP register
  1316. retry = DAP_Data.transfer.retry_count;
  1317. do {
  1318. response_value = JTAG_Transfer(request_value, &data);
  1319. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1320. if (response_value != DAP_TRANSFER_OK) {
  1321. goto end;
  1322. }
  1323. response_count++;
  1324. }
  1325. // Check last write
  1326. if (ir != JTAG_DPACC) {
  1327. JTAG_IR(JTAG_DPACC);
  1328. }
  1329. retry = DAP_Data.transfer.retry_count;
  1330. do {
  1331. response_value = JTAG_Transfer(DP_RDBUFF | DAP_TRANSFER_RnW, NULL);
  1332. } while ((response_value == DAP_TRANSFER_WAIT) && retry-- && !DAP_TransferAbort);
  1333. }
  1334. end:
  1335. *(response_head+0) = (uint8_t)(response_count >> 0);
  1336. *(response_head+1) = (uint8_t)(response_count >> 8);
  1337. *(response_head+2) = (uint8_t) response_value;
  1338. return ((uint32_t)(response - response_head));
  1339. }
  1340. #endif
  1341. // Process Transfer Block command and prepare response
  1342. // request: pointer to request data
  1343. // response: pointer to response data
  1344. // return: number of bytes in response (lower 16 bits)
  1345. // number of bytes in request (upper 16 bits)
  1346. static uint32_t DAP_TransferBlock(const uint8_t *request, uint8_t *response) {
  1347. uint32_t num;
  1348. switch (DAP_Data.debug_port) {
  1349. #if (DAP_SWD != 0)
  1350. case DAP_PORT_SWD:
  1351. num = DAP_SWD_TransferBlock (request, response);
  1352. break;
  1353. #endif
  1354. #if (DAP_JTAG != 0)
  1355. case DAP_PORT_JTAG:
  1356. num = DAP_JTAG_TransferBlock(request, response);
  1357. break;
  1358. #endif
  1359. default:
  1360. *(response+0) = 0U; // Response count [7:0]
  1361. *(response+1) = 0U; // Response count[15:8]
  1362. *(response+2) = 0U; // Response value
  1363. num = 3U;
  1364. break;
  1365. }
  1366. if ((*(request+3) & DAP_TRANSFER_RnW) != 0U) {
  1367. // Read register block
  1368. num |= 4U << 16;
  1369. } else {
  1370. // Write register block
  1371. num |= (4U + (((uint32_t)(*(request+1)) | (uint32_t)(*(request+2) << 8)) * 4)) << 16;
  1372. }
  1373. return (num);
  1374. }
  1375. // Process SWD Write ABORT command and prepare response
  1376. // request: pointer to request data
  1377. // response: pointer to response data
  1378. // return: number of bytes in response
  1379. #if (DAP_SWD != 0)
  1380. static uint32_t DAP_SWD_WriteAbort(const uint8_t *request, uint8_t *response) {
  1381. uint32_t data;
  1382. // Load data (Ignore DAP index)
  1383. data = (uint32_t)(*(request+1) << 0) |
  1384. (uint32_t)(*(request+2) << 8) |
  1385. (uint32_t)(*(request+3) << 16) |
  1386. (uint32_t)(*(request+4) << 24);
  1387. // Write Abort register
  1388. SWD_Transfer(DP_ABORT, &data);
  1389. *response = DAP_OK;
  1390. return (1U);
  1391. }
  1392. #endif
  1393. // Process JTAG Write ABORT command and prepare response
  1394. // request: pointer to request data
  1395. // response: pointer to response data
  1396. // return: number of bytes in response
  1397. #if (DAP_JTAG != 0)
  1398. static uint32_t DAP_JTAG_WriteAbort(const uint8_t *request, uint8_t *response) {
  1399. uint32_t data;
  1400. // Device index (JTAP TAP)
  1401. DAP_Data.jtag_dev.index = *request;
  1402. if (DAP_Data.jtag_dev.index >= DAP_Data.jtag_dev.count) {
  1403. *response = DAP_ERROR;
  1404. return (1U);
  1405. }
  1406. // Select JTAG chain
  1407. JTAG_IR(JTAG_ABORT);
  1408. // Load data
  1409. data = (uint32_t)(*(request+1) << 0) |
  1410. (uint32_t)(*(request+2) << 8) |
  1411. (uint32_t)(*(request+3) << 16) |
  1412. (uint32_t)(*(request+4) << 24);
  1413. // Write Abort register
  1414. JTAG_WriteAbort(data);
  1415. *response = DAP_OK;
  1416. return (1U);
  1417. }
  1418. #endif
  1419. // Process Write ABORT command and prepare response
  1420. // request: pointer to request data
  1421. // response: pointer to response data
  1422. // return: number of bytes in response (lower 16 bits)
  1423. // number of bytes in request (upper 16 bits)
  1424. static uint32_t DAP_WriteAbort(const uint8_t *request, uint8_t *response) {
  1425. uint32_t num;
  1426. switch (DAP_Data.debug_port) {
  1427. #if (DAP_SWD != 0)
  1428. case DAP_PORT_SWD:
  1429. num = DAP_SWD_WriteAbort (request, response);
  1430. break;
  1431. #endif
  1432. #if (DAP_JTAG != 0)
  1433. case DAP_PORT_JTAG:
  1434. num = DAP_JTAG_WriteAbort(request, response);
  1435. break;
  1436. #endif
  1437. default:
  1438. *response = DAP_ERROR;
  1439. num = 1U;
  1440. break;
  1441. }
  1442. return ((5U << 16) | num);
  1443. }
  1444. // Process DAP Vendor command request and prepare response
  1445. // Default function (can be overridden)
  1446. // request: pointer to request data
  1447. // response: pointer to response data
  1448. // return: number of bytes in response (lower 16 bits)
  1449. // number of bytes in request (upper 16 bits)
  1450. __WEAK uint32_t DAP_ProcessVendorCommand(const uint8_t *request, uint8_t *response) {
  1451. (void)request;
  1452. *response = ID_DAP_Invalid;
  1453. return ((1U << 16) | 1U);
  1454. }
  1455. // Process DAP command request and prepare response
  1456. // request: pointer to request data
  1457. // response: pointer to response data
  1458. // return: number of bytes in response (lower 16 bits)
  1459. // number of bytes in request (upper 16 bits)
  1460. uint32_t DAP_ProcessCommand(const uint8_t *request, uint8_t *response) {
  1461. uint32_t num;
  1462. if ((*request >= ID_DAP_Vendor0) && (*request <= ID_DAP_Vendor31)) {
  1463. return DAP_ProcessVendorCommand(request, response);
  1464. }
  1465. *response++ = *request;
  1466. switch (*request++) {
  1467. case ID_DAP_Info:
  1468. num = DAP_Info(*request, response+1);
  1469. *response = (uint8_t)num;
  1470. return ((2U << 16) + 2U + num);
  1471. case ID_DAP_HostStatus:
  1472. num = DAP_HostStatus(request, response);
  1473. break;
  1474. case ID_DAP_Connect:
  1475. num = DAP_Connect(request, response);
  1476. break;
  1477. case ID_DAP_Disconnect:
  1478. num = DAP_Disconnect(response);
  1479. break;
  1480. case ID_DAP_Delay:
  1481. num = DAP_Delay(request, response);
  1482. break;
  1483. case ID_DAP_ResetTarget:
  1484. num = DAP_ResetTarget(response);
  1485. break;
  1486. case ID_DAP_SWJ_Pins:
  1487. num = DAP_SWJ_Pins(request, response);
  1488. break;
  1489. case ID_DAP_SWJ_Clock:
  1490. num = DAP_SWJ_Clock(request, response);
  1491. break;
  1492. case ID_DAP_SWJ_Sequence:
  1493. num = DAP_SWJ_Sequence(request, response);
  1494. break;
  1495. case ID_DAP_SWD_Configure:
  1496. num = DAP_SWD_Configure(request, response);
  1497. break;
  1498. case ID_DAP_SWD_Sequence:
  1499. num = DAP_SWD_Sequence(request, response);
  1500. break;
  1501. case ID_DAP_JTAG_Sequence:
  1502. num = DAP_JTAG_Sequence(request, response);
  1503. break;
  1504. case ID_DAP_JTAG_Configure:
  1505. num = DAP_JTAG_Configure(request, response);
  1506. break;
  1507. case ID_DAP_JTAG_IDCODE:
  1508. num = DAP_JTAG_IDCode(request, response);
  1509. break;
  1510. case ID_DAP_TransferConfigure:
  1511. num = DAP_TransferConfigure(request, response);
  1512. break;
  1513. case ID_DAP_Transfer:
  1514. num = DAP_Transfer(request, response);
  1515. break;
  1516. case ID_DAP_TransferBlock:
  1517. num = DAP_TransferBlock(request, response);
  1518. break;
  1519. case ID_DAP_WriteABORT:
  1520. num = DAP_WriteAbort(request, response);
  1521. break;
  1522. #if ((SWO_UART != 0) || (SWO_MANCHESTER != 0))
  1523. case ID_DAP_SWO_Transport:
  1524. num = SWO_Transport(request, response);
  1525. break;
  1526. case ID_DAP_SWO_Mode:
  1527. num = SWO_Mode(request, response);
  1528. break;
  1529. case ID_DAP_SWO_Baudrate:
  1530. num = SWO_Baudrate(request, response);
  1531. break;
  1532. case ID_DAP_SWO_Control:
  1533. num = SWO_Control(request, response);
  1534. break;
  1535. case ID_DAP_SWO_Status:
  1536. num = SWO_Status(response);
  1537. break;
  1538. case ID_DAP_SWO_ExtendedStatus:
  1539. num = SWO_ExtendedStatus(request, response);
  1540. break;
  1541. case ID_DAP_SWO_Data:
  1542. num = SWO_Data(request, response);
  1543. break;
  1544. #endif
  1545. #if (DAP_UART != 0)
  1546. case ID_DAP_UART_Transport:
  1547. num = UART_Transport(request, response);
  1548. break;
  1549. case ID_DAP_UART_Configure:
  1550. num = UART_Configure(request, response);
  1551. break;
  1552. case ID_DAP_UART_Control:
  1553. num = UART_Control(request, response);
  1554. break;
  1555. case ID_DAP_UART_Status:
  1556. num = UART_Status(response);
  1557. break;
  1558. case ID_DAP_UART_Transfer:
  1559. num = UART_Transfer(request, response);
  1560. break;
  1561. #endif
  1562. default:
  1563. *(response-1) = ID_DAP_Invalid;
  1564. return ((1U << 16) | 1U);
  1565. }
  1566. return ((1U << 16) + 1U + num);
  1567. }
  1568. // Execute DAP command (process request and prepare response)
  1569. // request: pointer to request data
  1570. // response: pointer to response data
  1571. // return: number of bytes in response (lower 16 bits)
  1572. // number of bytes in request (upper 16 bits)
  1573. uint32_t DAP_ExecuteCommand(const uint8_t *request, uint8_t *response) {
  1574. uint32_t cnt, num, n;
  1575. if (*request == ID_DAP_ExecuteCommands) {
  1576. *response++ = *request++;
  1577. cnt = *request++;
  1578. *response++ = (uint8_t)cnt;
  1579. num = (2U << 16) | 2U;
  1580. while (cnt--) {
  1581. n = DAP_ProcessCommand(request, response);
  1582. num += n;
  1583. request += (uint16_t)(n >> 16);
  1584. response += (uint16_t) n;
  1585. }
  1586. return (num);
  1587. }
  1588. return DAP_ProcessCommand(request, response);
  1589. }
  1590. // Setup DAP
  1591. void DAP_Setup(void) {
  1592. // Default settings
  1593. DAP_Data.debug_port = 0U;
  1594. DAP_Data.transfer.idle_cycles = 0U;
  1595. DAP_Data.transfer.retry_count = 100U;
  1596. DAP_Data.transfer.match_retry = 0U;
  1597. DAP_Data.transfer.match_mask = 0x00000000U;
  1598. #if (DAP_SWD != 0)
  1599. DAP_Data.swd_conf.turnaround = 1U;
  1600. DAP_Data.swd_conf.data_phase = 0U;
  1601. #endif
  1602. #if (DAP_JTAG != 0)
  1603. DAP_Data.jtag_dev.count = 0U;
  1604. #endif
  1605. // Sets DAP_Data.fast_clock and DAP_Data.clock_delay.
  1606. Set_Clock_Delay(DAP_DEFAULT_SWJ_CLOCK);
  1607. DAP_SETUP(); // Device specific setup
  1608. }