DAP.c 52 KB

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