You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1128 lines
32 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2006 by Magnus Lundin *
  3. * lundin@mlu.mine.nu *
  4. * *
  5. * Copyright (C) 2008 by Spencer Oliver *
  6. * spen@spen-soft.co.uk *
  7. * *
  8. * Copyright (C) 2009 by Oyvind Harboe *
  9. * oyvind.harboe@zylin.com *
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. * This program is distributed in the hope that it will be useful, *
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  19. * GNU General Public License for more details. *
  20. * *
  21. * You should have received a copy of the GNU General Public License *
  22. * along with this program; if not, write to the *
  23. * Free Software Foundation, Inc., *
  24. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  25. ***************************************************************************/
  26. /***************************************************************************
  27. * *
  28. * This file implements support for the ARM Debug Interface v5 (ADI_V5) *
  29. * *
  30. * ARM(tm) Debug Interface v5 Architecture Specification ARM IHI 0031A *
  31. * *
  32. * CoreSight(tm) DAP-Lite TRM, ARM DDI 0316A *
  33. * Cortex-M3(tm) TRM, ARM DDI 0337C *
  34. * *
  35. ***************************************************************************/
  36. #ifdef HAVE_CONFIG_H
  37. #include "config.h"
  38. #endif
  39. #include "replacements.h"
  40. #include "arm_adi_v5.h"
  41. #include "jtag.h"
  42. #include "log.h"
  43. #include "time_support.h"
  44. #include <stdlib.h>
  45. #include <string.h>
  46. /*
  47. * Transaction Mode:
  48. * swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  49. * Uses Overrun checking mode and does not do actual JTAG send/receive or transaction
  50. * result checking until swjdp_end_transaction()
  51. * This must be done before using or deallocating any return variables.
  52. * swjdp->trans_mode == TRANS_MODE_ATOMIC
  53. * All reads and writes to the AHB bus are checked for valid completion, and return values
  54. * are immediatley available.
  55. */
  56. /***************************************************************************
  57. * *
  58. * DPACC and APACC scanchain access through JTAG-DP *
  59. * *
  60. ***************************************************************************/
  61. /* Scan out and in from target ordered u8 buffers */
  62. int adi_jtag_dp_scan(arm_jtag_t *jtag_info, u8 instr, u8 reg_addr, u8 RnW, u8 *outvalue, u8 *invalue, u8 *ack)
  63. {
  64. scan_field_t fields[2];
  65. u8 out_addr_buf;
  66. jtag_add_end_state(TAP_IDLE);
  67. arm_jtag_set_instr(jtag_info, instr, NULL);
  68. fields[0].tap = jtag_info->tap;
  69. fields[0].num_bits = 3;
  70. buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1));
  71. fields[0].out_value = &out_addr_buf;
  72. fields[0].in_value = ack;
  73. fields[0].in_handler = NULL;
  74. fields[1].tap = jtag_info->tap;
  75. fields[1].num_bits = 32;
  76. fields[1].out_value = outvalue;
  77. fields[1].in_value = invalue;
  78. fields[1].in_handler = NULL;
  79. jtag_add_dr_scan(2, fields, TAP_INVALID);
  80. return ERROR_OK;
  81. }
  82. /* Scan out and in from host ordered u32 variables */
  83. int adi_jtag_dp_scan_u32(arm_jtag_t *jtag_info, u8 instr, u8 reg_addr, u8 RnW, u32 outvalue, u32 *invalue, u8 *ack)
  84. {
  85. scan_field_t fields[2];
  86. u8 out_value_buf[4];
  87. u8 out_addr_buf;
  88. jtag_add_end_state(TAP_IDLE);
  89. arm_jtag_set_instr(jtag_info, instr, NULL);
  90. fields[0].tap = jtag_info->tap;
  91. fields[0].num_bits = 3;
  92. buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1));
  93. fields[0].out_value = &out_addr_buf;
  94. fields[0].in_value = ack;
  95. fields[0].in_handler = NULL;
  96. fields[1].tap = jtag_info->tap;
  97. fields[1].num_bits = 32;
  98. buf_set_u32(out_value_buf, 0, 32, outvalue);
  99. fields[1].out_value = out_value_buf;
  100. fields[1].in_value = NULL;
  101. fields[1].in_handler = NULL;
  102. if (invalue)
  103. {
  104. u8 tmp[4];
  105. fields[1].in_value = tmp;
  106. jtag_add_dr_scan_now(2, fields, TAP_INVALID);
  107. *invalue=le_to_h_u32(tmp);
  108. } else
  109. {
  110. jtag_add_dr_scan(2, fields, TAP_INVALID);
  111. }
  112. return ERROR_OK;
  113. }
  114. /* scan_inout_check adds one extra inscan for DPAP_READ commands to read variables */
  115. int scan_inout_check(swjdp_common_t *swjdp, u8 instr, u8 reg_addr, u8 RnW, u8 *outvalue, u8 *invalue)
  116. {
  117. adi_jtag_dp_scan(swjdp->jtag_info, instr, reg_addr, RnW, outvalue, NULL, NULL);
  118. if ((RnW == DPAP_READ) && (invalue != NULL))
  119. {
  120. adi_jtag_dp_scan(swjdp->jtag_info, SWJDP_IR_DPACC, DP_RDBUFF, DPAP_READ, 0, invalue, &swjdp->ack);
  121. }
  122. /* In TRANS_MODE_ATOMIC all SWJDP_IR_APACC transactions wait for ack=OK/FAULT and the check CTRL_STAT */
  123. if ((instr == SWJDP_IR_APACC) && (swjdp->trans_mode == TRANS_MODE_ATOMIC))
  124. {
  125. return swjdp_transaction_endcheck(swjdp);
  126. }
  127. return ERROR_OK;
  128. }
  129. int scan_inout_check_u32(swjdp_common_t *swjdp, u8 instr, u8 reg_addr, u8 RnW, u32 outvalue, u32 *invalue)
  130. {
  131. adi_jtag_dp_scan_u32(swjdp->jtag_info, instr, reg_addr, RnW, outvalue, NULL, NULL);
  132. if ((RnW==DPAP_READ) && (invalue != NULL))
  133. {
  134. adi_jtag_dp_scan_u32(swjdp->jtag_info, SWJDP_IR_DPACC, DP_RDBUFF, DPAP_READ, 0, invalue, &swjdp->ack);
  135. }
  136. /* In TRANS_MODE_ATOMIC all SWJDP_IR_APACC transactions wait for ack=OK/FAULT and then check CTRL_STAT */
  137. if ((instr == SWJDP_IR_APACC) && (swjdp->trans_mode == TRANS_MODE_ATOMIC))
  138. {
  139. return swjdp_transaction_endcheck(swjdp);
  140. }
  141. return ERROR_OK;
  142. }
  143. int swjdp_transaction_endcheck(swjdp_common_t *swjdp)
  144. {
  145. int retval;
  146. u32 ctrlstat;
  147. /* too expensive to call keep_alive() here */
  148. #if 0
  149. /* Danger!!!! BROKEN!!!! */
  150. scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
  151. /* Danger!!!! BROKEN!!!! Why will jtag_execute_queue() fail here????
  152. R956 introduced the check on return value here and now Michael Schwingen reports
  153. that this code no longer works....
  154. https://lists.berlios.de/pipermail/openocd-development/2008-September/003107.html
  155. */
  156. if ((retval=jtag_execute_queue())!=ERROR_OK)
  157. {
  158. LOG_ERROR("BUG: Why does this fail the first time????");
  159. }
  160. /* Why??? second time it works??? */
  161. #endif
  162. scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
  163. if ((retval=jtag_execute_queue())!=ERROR_OK)
  164. return retval;
  165. swjdp->ack = swjdp->ack & 0x7;
  166. if (swjdp->ack != 2)
  167. {
  168. long long then=timeval_ms();
  169. while (swjdp->ack != 2)
  170. {
  171. if (swjdp->ack == 1)
  172. {
  173. if ((timeval_ms()-then) > 1000)
  174. {
  175. LOG_WARNING("Timeout (1000ms) waiting for ACK = OK/FAULT in SWJDP transaction");
  176. return ERROR_JTAG_DEVICE_ERROR;
  177. }
  178. }
  179. else
  180. {
  181. LOG_WARNING("Invalid ACK in SWJDP transaction");
  182. return ERROR_JTAG_DEVICE_ERROR;
  183. }
  184. scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
  185. if ((retval=jtag_execute_queue())!=ERROR_OK)
  186. return retval;
  187. swjdp->ack = swjdp->ack & 0x7;
  188. }
  189. } else
  190. {
  191. /* common code path avoids fn to timeval_ms() */
  192. }
  193. /* Check for STICKYERR and STICKYORUN */
  194. if (ctrlstat & (SSTICKYORUN | SSTICKYERR))
  195. {
  196. LOG_DEBUG("swjdp: CTRL/STAT error 0x%x", ctrlstat);
  197. /* Check power to debug regions */
  198. if ((ctrlstat & 0xf0000000) != 0xf0000000)
  199. {
  200. ahbap_debugport_init(swjdp);
  201. }
  202. else
  203. {
  204. u32 mem_ap_csw, mem_ap_tar;
  205. /* Print information about last AHBAP access */
  206. LOG_ERROR("AHBAP Cached values: dp_select 0x%x, ap_csw 0x%x, ap_tar 0x%x", swjdp->dp_select_value, swjdp->ap_csw_value, swjdp->ap_tar_value);
  207. if (ctrlstat & SSTICKYORUN)
  208. LOG_ERROR("SWJ-DP OVERRUN - check clock or reduce jtag speed");
  209. if (ctrlstat & SSTICKYERR)
  210. LOG_ERROR("SWJ-DP STICKY ERROR");
  211. /* Clear Sticky Error Bits */
  212. scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_WRITE, swjdp->dp_ctrl_stat | SSTICKYORUN | SSTICKYERR, NULL);
  213. scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
  214. if ((retval=jtag_execute_queue())!=ERROR_OK)
  215. return retval;
  216. LOG_DEBUG("swjdp: status 0x%x", ctrlstat);
  217. dap_ap_read_reg_u32(swjdp, AP_REG_CSW, &mem_ap_csw);
  218. dap_ap_read_reg_u32(swjdp, AP_REG_TAR, &mem_ap_tar);
  219. if ((retval=jtag_execute_queue())!=ERROR_OK)
  220. return retval;
  221. LOG_ERROR("Read MEM_AP_CSW 0x%x, MEM_AP_TAR 0x%x", mem_ap_csw, mem_ap_tar);
  222. }
  223. if ((retval=jtag_execute_queue())!=ERROR_OK)
  224. return retval;
  225. return ERROR_JTAG_DEVICE_ERROR;
  226. }
  227. return ERROR_OK;
  228. }
  229. /***************************************************************************
  230. * *
  231. * DP and MEM-AP register access through APACC and DPACC *
  232. * *
  233. ***************************************************************************/
  234. int dap_dp_write_reg(swjdp_common_t *swjdp, u32 value, u8 reg_addr)
  235. {
  236. return scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, reg_addr, DPAP_WRITE, value, NULL);
  237. }
  238. int dap_dp_read_reg(swjdp_common_t *swjdp, u32 *value, u8 reg_addr)
  239. {
  240. return scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, reg_addr, DPAP_READ, 0, value);
  241. }
  242. int dap_ap_select(swjdp_common_t *swjdp,u8 apsel)
  243. {
  244. u32 select;
  245. select = (apsel<<24) & 0xFF000000;
  246. if (select != swjdp->apsel)
  247. {
  248. swjdp->apsel = select;
  249. /* Switchin AP invalidates cached values */
  250. swjdp->dp_select_value = -1;
  251. swjdp->ap_csw_value = -1;
  252. swjdp->ap_tar_value = -1;
  253. }
  254. return ERROR_OK;
  255. }
  256. int dap_dp_bankselect(swjdp_common_t *swjdp,u32 ap_reg)
  257. {
  258. u32 select;
  259. select = (ap_reg & 0x000000F0);
  260. if (select != swjdp->dp_select_value)
  261. {
  262. dap_dp_write_reg(swjdp, select | swjdp->apsel, DP_SELECT);
  263. swjdp->dp_select_value = select;
  264. }
  265. return ERROR_OK;
  266. }
  267. int dap_ap_write_reg(swjdp_common_t *swjdp, u32 reg_addr, u8* out_value_buf)
  268. {
  269. dap_dp_bankselect(swjdp, reg_addr);
  270. scan_inout_check(swjdp, SWJDP_IR_APACC, reg_addr, DPAP_WRITE, out_value_buf, NULL);
  271. return ERROR_OK;
  272. }
  273. int dap_ap_read_reg(swjdp_common_t *swjdp, u32 reg_addr, u8 *in_value_buf)
  274. {
  275. dap_dp_bankselect(swjdp, reg_addr);
  276. scan_inout_check(swjdp, SWJDP_IR_APACC, reg_addr, DPAP_READ, 0, in_value_buf);
  277. return ERROR_OK;
  278. }
  279. int dap_ap_write_reg_u32(swjdp_common_t *swjdp, u32 reg_addr, u32 value)
  280. {
  281. u8 out_value_buf[4];
  282. buf_set_u32(out_value_buf, 0, 32, value);
  283. dap_dp_bankselect(swjdp, reg_addr);
  284. scan_inout_check(swjdp, SWJDP_IR_APACC, reg_addr, DPAP_WRITE, out_value_buf, NULL);
  285. return ERROR_OK;
  286. }
  287. int dap_ap_read_reg_u32(swjdp_common_t *swjdp, u32 reg_addr, u32 *value)
  288. {
  289. dap_dp_bankselect(swjdp, reg_addr);
  290. scan_inout_check_u32(swjdp, SWJDP_IR_APACC, reg_addr, DPAP_READ, 0, value);
  291. return ERROR_OK;
  292. }
  293. /***************************************************************************
  294. * *
  295. * AHB-AP access to memory and system registers on AHB bus *
  296. * *
  297. ***************************************************************************/
  298. int dap_setup_accessport(swjdp_common_t *swjdp, u32 csw, u32 tar)
  299. {
  300. csw = csw | CSW_DBGSWENABLE | CSW_MASTER_DEBUG | CSW_HPROT;
  301. if (csw != swjdp->ap_csw_value)
  302. {
  303. /* LOG_DEBUG("swjdp : Set CSW %x",csw); */
  304. dap_ap_write_reg_u32(swjdp, AP_REG_CSW, csw );
  305. swjdp->ap_csw_value = csw;
  306. }
  307. if (tar != swjdp->ap_tar_value)
  308. {
  309. /* LOG_DEBUG("swjdp : Set TAR %x",tar); */
  310. dap_ap_write_reg_u32(swjdp, AP_REG_TAR, tar );
  311. swjdp->ap_tar_value = tar;
  312. }
  313. if (csw & CSW_ADDRINC_MASK)
  314. {
  315. /* Do not cache TAR value when autoincrementing */
  316. swjdp->ap_tar_value = -1;
  317. }
  318. return ERROR_OK;
  319. }
  320. /*****************************************************************************
  321. * *
  322. * mem_ap_read_u32(swjdp_common_t *swjdp, u32 address, u32 *value) *
  323. * *
  324. * Read a u32 value from memory or system register *
  325. * Functionally equivalent to target_read_u32(target, address, u32 *value), *
  326. * but with less overhead *
  327. *****************************************************************************/
  328. int mem_ap_read_u32(swjdp_common_t *swjdp, u32 address, u32 *value)
  329. {
  330. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  331. dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, address & 0xFFFFFFF0);
  332. dap_ap_read_reg_u32(swjdp, AP_REG_BD0 | (address & 0xC), value );
  333. return ERROR_OK;
  334. }
  335. int mem_ap_read_atomic_u32(swjdp_common_t *swjdp, u32 address, u32 *value)
  336. {
  337. mem_ap_read_u32(swjdp, address, value);
  338. return swjdp_transaction_endcheck(swjdp);
  339. }
  340. /*****************************************************************************
  341. * *
  342. * mem_ap_write_u32(swjdp_common_t *swjdp, u32 address, u32 value) *
  343. * *
  344. * Write a u32 value to memory or memory mapped register *
  345. * *
  346. *****************************************************************************/
  347. int mem_ap_write_u32(swjdp_common_t *swjdp, u32 address, u32 value)
  348. {
  349. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  350. dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, address & 0xFFFFFFF0);
  351. dap_ap_write_reg_u32(swjdp, AP_REG_BD0 | (address & 0xC), value );
  352. return ERROR_OK;
  353. }
  354. int mem_ap_write_atomic_u32(swjdp_common_t *swjdp, u32 address, u32 value)
  355. {
  356. mem_ap_write_u32(swjdp, address, value);
  357. return swjdp_transaction_endcheck(swjdp);
  358. }
  359. /*****************************************************************************
  360. * *
  361. * mem_ap_write_buf(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) *
  362. * *
  363. * Write a buffer in target order (little endian) *
  364. * *
  365. *****************************************************************************/
  366. int mem_ap_write_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  367. {
  368. int wcount, blocksize, writecount, errorcount = 0, retval = ERROR_OK;
  369. u32 adr = address;
  370. u8* pBuffer = buffer;
  371. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  372. count >>= 2;
  373. wcount = count;
  374. /* if we have an unaligned access - reorder data */
  375. if (adr & 0x3u)
  376. {
  377. for (writecount = 0; writecount < count; writecount++)
  378. {
  379. int i;
  380. u32 outvalue;
  381. memcpy(&outvalue, pBuffer, sizeof(u32));
  382. for (i = 0; i < 4; i++ )
  383. {
  384. *((u8*)pBuffer + (adr & 0x3)) = outvalue;
  385. outvalue >>= 8;
  386. adr++;
  387. }
  388. pBuffer += sizeof(u32);
  389. }
  390. }
  391. while (wcount > 0)
  392. {
  393. /* Adjust to write blocks within 4K aligned boundaries */
  394. blocksize = (0x1000 - (0xFFF & address)) >> 2;
  395. if (wcount < blocksize)
  396. blocksize = wcount;
  397. /* handle unaligned data at 4k boundary */
  398. if (blocksize == 0)
  399. blocksize = 1;
  400. dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
  401. for (writecount = 0; writecount < blocksize; writecount++)
  402. {
  403. dap_ap_write_reg(swjdp, AP_REG_DRW, buffer + 4 * writecount );
  404. }
  405. if (swjdp_transaction_endcheck(swjdp) == ERROR_OK)
  406. {
  407. wcount = wcount - blocksize;
  408. address = address + 4 * blocksize;
  409. buffer = buffer + 4 * blocksize;
  410. }
  411. else
  412. {
  413. errorcount++;
  414. }
  415. if (errorcount > 1)
  416. {
  417. LOG_WARNING("Block write error address 0x%x, wcount 0x%x", address, wcount);
  418. return ERROR_JTAG_DEVICE_ERROR;
  419. }
  420. }
  421. return retval;
  422. }
  423. int mem_ap_write_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  424. {
  425. int retval = ERROR_OK;
  426. int wcount, blocksize, writecount, i;
  427. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  428. wcount = count >> 1;
  429. while (wcount > 0)
  430. {
  431. int nbytes;
  432. /* Adjust to read within 4K block boundaries */
  433. blocksize = (0x1000 - (0xFFF & address)) >> 1;
  434. if (wcount < blocksize)
  435. blocksize = wcount;
  436. /* handle unaligned data at 4k boundary */
  437. if (blocksize == 0)
  438. blocksize = 1;
  439. dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_PACKED, address);
  440. writecount = blocksize;
  441. do
  442. {
  443. nbytes = MIN((writecount << 1), 4);
  444. if (nbytes < 4 )
  445. {
  446. if (mem_ap_write_buf_u16(swjdp, buffer, nbytes, address) != ERROR_OK)
  447. {
  448. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  449. return ERROR_JTAG_DEVICE_ERROR;
  450. }
  451. address += nbytes >> 1;
  452. }
  453. else
  454. {
  455. u32 outvalue;
  456. memcpy(&outvalue, buffer, sizeof(u32));
  457. for (i = 0; i < nbytes; i++ )
  458. {
  459. *((u8*)buffer + (address & 0x3)) = outvalue;
  460. outvalue >>= 8;
  461. address++;
  462. }
  463. memcpy(&outvalue, buffer, sizeof(u32));
  464. dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
  465. if (swjdp_transaction_endcheck(swjdp) != ERROR_OK)
  466. {
  467. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  468. return ERROR_JTAG_DEVICE_ERROR;
  469. }
  470. }
  471. buffer += nbytes >> 1;
  472. writecount -= nbytes >> 1;
  473. } while (writecount);
  474. wcount -= blocksize;
  475. }
  476. return retval;
  477. }
  478. int mem_ap_write_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  479. {
  480. int retval = ERROR_OK;
  481. if (count >= 4)
  482. return mem_ap_write_buf_packed_u16(swjdp, buffer, count, address);
  483. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  484. while (count > 0)
  485. {
  486. dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
  487. u16 svalue;
  488. memcpy(&svalue, buffer, sizeof(u16));
  489. u32 outvalue = (u32)svalue << 8 * (address & 0x3);
  490. dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue );
  491. retval = swjdp_transaction_endcheck(swjdp);
  492. count -= 2;
  493. address += 2;
  494. buffer += 2;
  495. }
  496. return retval;
  497. }
  498. int mem_ap_write_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  499. {
  500. int retval = ERROR_OK;
  501. int wcount, blocksize, writecount, i;
  502. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  503. wcount = count;
  504. while (wcount > 0)
  505. {
  506. int nbytes;
  507. /* Adjust to read within 4K block boundaries */
  508. blocksize = (0x1000 - (0xFFF & address));
  509. if (wcount < blocksize)
  510. blocksize = wcount;
  511. dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_PACKED, address);
  512. writecount = blocksize;
  513. do
  514. {
  515. nbytes = MIN(writecount, 4);
  516. if (nbytes < 4 )
  517. {
  518. if (mem_ap_write_buf_u8(swjdp, buffer, nbytes, address) != ERROR_OK)
  519. {
  520. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  521. return ERROR_JTAG_DEVICE_ERROR;
  522. }
  523. address += nbytes;
  524. }
  525. else
  526. {
  527. u32 outvalue;
  528. memcpy(&outvalue, buffer, sizeof(u32));
  529. for (i = 0; i < nbytes; i++ )
  530. {
  531. *((u8*)buffer + (address & 0x3)) = outvalue;
  532. outvalue >>= 8;
  533. address++;
  534. }
  535. memcpy(&outvalue, buffer, sizeof(u32));
  536. dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
  537. if (swjdp_transaction_endcheck(swjdp) != ERROR_OK)
  538. {
  539. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  540. return ERROR_JTAG_DEVICE_ERROR;
  541. }
  542. }
  543. buffer += nbytes;
  544. writecount -= nbytes;
  545. } while (writecount);
  546. wcount -= blocksize;
  547. }
  548. return retval;
  549. }
  550. int mem_ap_write_buf_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  551. {
  552. int retval = ERROR_OK;
  553. if (count >= 4)
  554. return mem_ap_write_buf_packed_u8(swjdp, buffer, count, address);
  555. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  556. while (count > 0)
  557. {
  558. dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
  559. u32 outvalue = (u32)*buffer << 8 * (address & 0x3);
  560. dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue );
  561. retval = swjdp_transaction_endcheck(swjdp);
  562. count--;
  563. address++;
  564. buffer++;
  565. }
  566. return retval;
  567. }
  568. /*********************************************************************************
  569. * *
  570. * mem_ap_read_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address) *
  571. * *
  572. * Read block fast in target order (little endian) into a buffer *
  573. * *
  574. **********************************************************************************/
  575. int mem_ap_read_buf_u32(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  576. {
  577. int wcount, blocksize, readcount, errorcount = 0, retval = ERROR_OK;
  578. u32 adr = address;
  579. u8* pBuffer = buffer;
  580. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  581. count >>= 2;
  582. wcount = count;
  583. while (wcount > 0)
  584. {
  585. /* Adjust to read within 4K block boundaries */
  586. blocksize = (0x1000 - (0xFFF & address)) >> 2;
  587. if (wcount < blocksize)
  588. blocksize = wcount;
  589. /* handle unaligned data at 4k boundary */
  590. if (blocksize == 0)
  591. blocksize = 1;
  592. dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
  593. /* Scan out first read */
  594. adi_jtag_dp_scan(swjdp->jtag_info, SWJDP_IR_APACC, AP_REG_DRW, DPAP_READ, 0, NULL, NULL);
  595. for (readcount = 0; readcount < blocksize - 1; readcount++)
  596. {
  597. /* Scan out read instruction and scan in previous value */
  598. adi_jtag_dp_scan(swjdp->jtag_info, SWJDP_IR_APACC, AP_REG_DRW, DPAP_READ, 0, buffer + 4 * readcount, &swjdp->ack);
  599. }
  600. /* Scan in last value */
  601. adi_jtag_dp_scan(swjdp->jtag_info, SWJDP_IR_DPACC, DP_RDBUFF, DPAP_READ, 0, buffer + 4 * readcount, &swjdp->ack);
  602. if (swjdp_transaction_endcheck(swjdp) == ERROR_OK)
  603. {
  604. wcount = wcount - blocksize;
  605. address += 4 * blocksize;
  606. buffer += 4 * blocksize;
  607. }
  608. else
  609. {
  610. errorcount++;
  611. }
  612. if (errorcount > 1)
  613. {
  614. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  615. return ERROR_JTAG_DEVICE_ERROR;
  616. }
  617. }
  618. /* if we have an unaligned access - reorder data */
  619. if (adr & 0x3u)
  620. {
  621. for (readcount = 0; readcount < count; readcount++)
  622. {
  623. int i;
  624. u32 data;
  625. memcpy(&data, pBuffer, sizeof(u32));
  626. for (i = 0; i < 4; i++ )
  627. {
  628. *((u8*)pBuffer) = (data >> 8 * (adr & 0x3));
  629. pBuffer++;
  630. adr++;
  631. }
  632. }
  633. }
  634. return retval;
  635. }
  636. int mem_ap_read_buf_packed_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  637. {
  638. u32 invalue;
  639. int retval = ERROR_OK;
  640. int wcount, blocksize, readcount, i;
  641. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  642. wcount = count >> 1;
  643. while (wcount > 0)
  644. {
  645. int nbytes;
  646. /* Adjust to read within 4K block boundaries */
  647. blocksize = (0x1000 - (0xFFF & address)) >> 1;
  648. if (wcount < blocksize)
  649. blocksize = wcount;
  650. dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_PACKED, address);
  651. /* handle unaligned data at 4k boundary */
  652. if (blocksize == 0)
  653. blocksize = 1;
  654. readcount = blocksize;
  655. do
  656. {
  657. dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue );
  658. if (swjdp_transaction_endcheck(swjdp) != ERROR_OK)
  659. {
  660. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  661. return ERROR_JTAG_DEVICE_ERROR;
  662. }
  663. nbytes = MIN((readcount << 1), 4);
  664. for (i = 0; i < nbytes; i++ )
  665. {
  666. *((u8*)buffer) = (invalue >> 8 * (address & 0x3));
  667. buffer++;
  668. address++;
  669. }
  670. readcount -= (nbytes >> 1);
  671. } while (readcount);
  672. wcount -= blocksize;
  673. }
  674. return retval;
  675. }
  676. int mem_ap_read_buf_u16(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  677. {
  678. u32 invalue, i;
  679. int retval = ERROR_OK;
  680. if (count >= 4)
  681. return mem_ap_read_buf_packed_u16(swjdp, buffer, count, address);
  682. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  683. while (count > 0)
  684. {
  685. dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
  686. dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue );
  687. retval = swjdp_transaction_endcheck(swjdp);
  688. if (address & 0x1)
  689. {
  690. for (i = 0; i < 2; i++ )
  691. {
  692. *((u8*)buffer) = (invalue >> 8 * (address & 0x3));
  693. buffer++;
  694. address++;
  695. }
  696. }
  697. else
  698. {
  699. u16 svalue = (invalue >> 8 * (address & 0x3));
  700. memcpy(buffer, &svalue, sizeof(u16));
  701. address += 2;
  702. buffer += 2;
  703. }
  704. count -= 2;
  705. }
  706. return retval;
  707. }
  708. /* FIX!!! is this a potential performance bottleneck w.r.t. requiring too many
  709. * roundtrips when jtag_execute_queue() has a large overhead(e.g. for USB)s?
  710. *
  711. * The solution is to arrange for a large out/in scan in this loop and
  712. * and convert data afterwards.
  713. */
  714. int mem_ap_read_buf_packed_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  715. {
  716. u32 invalue;
  717. int retval = ERROR_OK;
  718. int wcount, blocksize, readcount, i;
  719. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  720. wcount = count;
  721. while (wcount > 0)
  722. {
  723. int nbytes;
  724. /* Adjust to read within 4K block boundaries */
  725. blocksize = (0x1000 - (0xFFF & address));
  726. if (wcount < blocksize)
  727. blocksize = wcount;
  728. dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_PACKED, address);
  729. readcount = blocksize;
  730. do
  731. {
  732. dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue );
  733. if (swjdp_transaction_endcheck(swjdp) != ERROR_OK)
  734. {
  735. LOG_WARNING("Block read error address 0x%x, count 0x%x", address, count);
  736. return ERROR_JTAG_DEVICE_ERROR;
  737. }
  738. nbytes = MIN(readcount, 4);
  739. for (i = 0; i < nbytes; i++ )
  740. {
  741. *((u8*)buffer) = (invalue >> 8 * (address & 0x3));
  742. buffer++;
  743. address++;
  744. }
  745. readcount -= nbytes;
  746. } while (readcount);
  747. wcount -= blocksize;
  748. }
  749. return retval;
  750. }
  751. int mem_ap_read_buf_u8(swjdp_common_t *swjdp, u8 *buffer, int count, u32 address)
  752. {
  753. u32 invalue;
  754. int retval = ERROR_OK;
  755. if (count >= 4)
  756. return mem_ap_read_buf_packed_u8(swjdp, buffer, count, address);
  757. swjdp->trans_mode = TRANS_MODE_COMPOSITE;
  758. while (count > 0)
  759. {
  760. dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
  761. dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue );
  762. retval = swjdp_transaction_endcheck(swjdp);
  763. *((u8*)buffer) = (invalue >> 8 * (address & 0x3));
  764. count--;
  765. address++;
  766. buffer++;
  767. }
  768. return retval;
  769. }
  770. int ahbap_debugport_init(swjdp_common_t *swjdp)
  771. {
  772. u32 idreg, romaddr, dummy;
  773. u32 ctrlstat;
  774. int cnt = 0;
  775. int retval;
  776. LOG_DEBUG(" ");
  777. swjdp->apsel = 0;
  778. swjdp->ap_csw_value = -1;
  779. swjdp->ap_tar_value = -1;
  780. swjdp->trans_mode = TRANS_MODE_ATOMIC;
  781. dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
  782. dap_dp_write_reg(swjdp, SSTICKYERR, DP_CTRL_STAT);
  783. dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
  784. swjdp->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ;
  785. dap_dp_write_reg(swjdp, swjdp->dp_ctrl_stat, DP_CTRL_STAT);
  786. dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
  787. if ((retval=jtag_execute_queue())!=ERROR_OK)
  788. return retval;
  789. /* Check that we have debug power domains activated */
  790. while (!(ctrlstat & CDBGPWRUPACK) && (cnt++ < 10))
  791. {
  792. LOG_DEBUG("swjdp: wait CDBGPWRUPACK");
  793. dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
  794. if ((retval=jtag_execute_queue())!=ERROR_OK)
  795. return retval;
  796. alive_sleep(10);
  797. }
  798. while (!(ctrlstat & CSYSPWRUPACK) && (cnt++ < 10))
  799. {
  800. LOG_DEBUG("swjdp: wait CSYSPWRUPACK");
  801. dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
  802. if ((retval=jtag_execute_queue())!=ERROR_OK)
  803. return retval;
  804. alive_sleep(10);
  805. }
  806. dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
  807. /* With debug power on we can activate OVERRUN checking */
  808. swjdp->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ | CORUNDETECT;
  809. dap_dp_write_reg(swjdp, swjdp->dp_ctrl_stat, DP_CTRL_STAT);
  810. dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
  811. dap_ap_read_reg_u32(swjdp, 0xFC, &idreg);
  812. dap_ap_read_reg_u32(swjdp, 0xF8, &romaddr);
  813. LOG_DEBUG("AHB-AP ID Register 0x%x, Debug ROM Address 0x%x", idreg, romaddr);
  814. return ERROR_OK;
  815. }
  816. char * class_description[16] ={
  817. "Reserved",
  818. "ROM table","Reserved","Reserved","Reserved","Reserved","Reserved","Reserved","Reserved",
  819. "CoreSight component","Reserved","Peripheral Test Block","Reserved","DESS","Generic IP component","Non standard layout"};
  820. int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, int apsel)
  821. {
  822. u32 dbgbase,apid;
  823. int romtable_present = 0;
  824. u8 mem_ap;
  825. u32 apselold;
  826. apselold = swjdp->apsel;
  827. dap_ap_select(swjdp, apsel);
  828. dap_ap_read_reg_u32(swjdp, 0xF8, &dbgbase);
  829. dap_ap_read_reg_u32(swjdp, 0xFC, &apid);
  830. swjdp_transaction_endcheck(swjdp);
  831. /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
  832. mem_ap = ((apid&0x10000)&&((apid&0x0F)!=0));
  833. command_print(cmd_ctx, "ap identification register 0x%8.8x", apid);
  834. if (apid)
  835. {
  836. switch (apid&0x0F)
  837. {
  838. case 0:
  839. command_print(cmd_ctx, "\tType is jtag-ap");
  840. break;
  841. case 1:
  842. command_print(cmd_ctx, "\tType is mem-ap AHB");
  843. break;
  844. case 2:
  845. command_print(cmd_ctx, "\tType is mem-ap APB");
  846. break;
  847. default:
  848. command_print(cmd_ctx, "\tUnknown AP-type");
  849. break;
  850. }
  851. command_print(cmd_ctx, "ap debugbase 0x%8.8x", dbgbase);
  852. }
  853. else
  854. {
  855. command_print(cmd_ctx, "No AP found at this apsel 0x%x", apsel);
  856. }
  857. romtable_present = ((mem_ap)&&(dbgbase != 0xFFFFFFFF));
  858. if (romtable_present)
  859. {
  860. u32 cid0,cid1,cid2,cid3,memtype,romentry;
  861. u16 entry_offset;
  862. /* bit 16 of apid indicates a memory access port */
  863. if (dbgbase&0x02)
  864. {
  865. command_print(cmd_ctx, "\tValid ROM table present");
  866. }
  867. else
  868. {
  869. command_print(cmd_ctx, "\tROM table in legacy format" );
  870. }
  871. /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
  872. mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF0, &cid0);
  873. mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF4, &cid1);
  874. mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFF8, &cid2);
  875. mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFFC, &cid3);
  876. mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000)|0xFCC, &memtype);
  877. swjdp_transaction_endcheck(swjdp);
  878. command_print(cmd_ctx, "\tCID3 0x%x, CID2 0x%x, CID1 0x%x, CID0, 0x%x",cid3,cid2,cid1,cid0);
  879. if (memtype&0x01)
  880. {
  881. command_print(cmd_ctx, "\tMEMTYPE system memory present on bus");
  882. }
  883. else
  884. {
  885. command_print(cmd_ctx, "\tMEMTYPE system memory not present. Dedicated debug bus" );
  886. }
  887. /* Now we read ROM table entries from dbgbase&0xFFFFF000)|0x000 until we get 0x00000000 */
  888. entry_offset = 0;
  889. do
  890. {
  891. mem_ap_read_atomic_u32(swjdp, (dbgbase&0xFFFFF000)|entry_offset, &romentry);
  892. command_print(cmd_ctx, "\tROMTABLE[0x%x] = 0x%x",entry_offset,romentry);
  893. if (romentry&0x01)
  894. {
  895. u32 c_cid0,c_cid1,c_cid2,c_cid3,c_pid0,c_pid1,c_pid2,c_pid3,c_pid4,component_start;
  896. u32 component_base = (u32)((dbgbase&0xFFFFF000)+(int)(romentry&0xFFFFF000));
  897. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFE0, &c_pid0);
  898. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFE4, &c_pid1);
  899. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFE8, &c_pid2);
  900. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFEC, &c_pid3);
  901. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFD0, &c_pid4);
  902. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFF0, &c_cid0);
  903. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFF4, &c_cid1);
  904. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFF8, &c_cid2);
  905. mem_ap_read_atomic_u32(swjdp, (component_base&0xFFFFF000)|0xFFC, &c_cid3);
  906. component_start = component_base - 0x1000*(c_pid4>>4);
  907. command_print(cmd_ctx, "\t\tComponent base address 0x%x, pid4 0x%x, start address 0x%x",component_base,c_pid4,component_start);
  908. command_print(cmd_ctx, "\t\tComponent cid1 0x%x, class is %s",c_cid1,class_description[(c_cid1>>4)&0xF]); /* Se ARM DDI 0314 C Table 2.2 */
  909. command_print(cmd_ctx, "\t\tCID3 0x%x, CID2 0x%x, CID1 0x%x, CID0, 0x%x",c_cid3,c_cid2,c_cid1,c_cid0);
  910. command_print(cmd_ctx, "\t\tPID3 0x%x, PID2 0x%x, PID1 0x%x, PID0, 0x%x",c_pid3,c_pid2,c_pid1,c_pid0);
  911. /* For CoreSight components, (c_cid1>>4)&0xF==9 , we also read 0xFC8 DevId and 0xFCC DevType */
  912. }
  913. else
  914. {
  915. if (romentry)
  916. command_print(cmd_ctx, "\t\tComponent not present");
  917. else
  918. command_print(cmd_ctx, "\t\tEnd of ROM table");
  919. }
  920. entry_offset += 4;
  921. } while (romentry>0);
  922. }
  923. else
  924. {
  925. command_print(cmd_ctx, "\tNo ROM table present");
  926. }
  927. dap_ap_select(swjdp, apselold);
  928. return ERROR_OK;
  929. }