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.
 
 
 
 
 
 

158 lines
6.9 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. * This program is free software; you can redistribute it and/or modify *
  9. * it under the terms of the GNU General Public License as published by *
  10. * the Free Software Foundation; either version 2 of the License, or *
  11. * (at your option) any later version. *
  12. * *
  13. * This program is distributed in the hope that it will be useful, *
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  16. * GNU General Public License for more details. *
  17. * *
  18. * You should have received a copy of the GNU General Public License *
  19. * along with this program; if not, write to the *
  20. * Free Software Foundation, Inc., *
  21. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  22. ***************************************************************************/
  23. #ifndef ARM_ADI_V5_H
  24. #define ARM_ADI_V5_H
  25. #include "target.h"
  26. #include "register.h"
  27. #include "arm_jtag.h"
  28. #define DAP_IR_DPACC 0xA
  29. #define DAP_IR_APACC 0xB
  30. #define DPAP_WRITE 0
  31. #define DPAP_READ 1
  32. #define DP_ZERO 0
  33. #define DP_CTRL_STAT 0x4
  34. #define DP_SELECT 0x8
  35. #define DP_RDBUFF 0xC
  36. #define CORUNDETECT (1 << 0)
  37. #define SSTICKYORUN (1 << 1)
  38. #define SSTICKYERR (1 << 5)
  39. #define CDBGRSTREQ (1 << 26)
  40. #define CDBGRSTACK (1 << 27)
  41. #define CDBGPWRUPREQ (1 << 28)
  42. #define CDBGPWRUPACK (1 << 29)
  43. #define CSYSPWRUPREQ (1 << 30)
  44. #define CSYSPWRUPACK (1 << 31)
  45. #define AP_REG_CSW 0x00
  46. #define AP_REG_TAR 0x04
  47. #define AP_REG_DRW 0x0C
  48. #define AP_REG_BD0 0x10
  49. #define AP_REG_BD1 0x14
  50. #define AP_REG_BD2 0x18
  51. #define AP_REG_BD3 0x1C
  52. #define AP_REG_DBGROMA 0xF8
  53. #define AP_REG_IDR 0xFC
  54. #define CSW_8BIT 0
  55. #define CSW_16BIT 1
  56. #define CSW_32BIT 2
  57. #define CSW_ADDRINC_MASK (3 << 4)
  58. #define CSW_ADDRINC_OFF 0
  59. #define CSW_ADDRINC_SINGLE (1 << 4)
  60. #define CSW_ADDRINC_PACKED (2 << 4)
  61. #define CSW_HPROT (1 << 25)
  62. #define CSW_MASTER_DEBUG (1 << 29)
  63. #define CSW_DBGSWENABLE (1 << 31)
  64. /* transaction mode */
  65. #define TRANS_MODE_NONE 0
  66. /* Transaction waits for previous to complete */
  67. #define TRANS_MODE_ATOMIC 1
  68. /* Freerunning transactions with delays and overrun checking */
  69. #define TRANS_MODE_COMPOSITE 2
  70. typedef struct swjdp_reg_s
  71. {
  72. int addr;
  73. arm_jtag_t *jtag_info;
  74. } swjdp_reg_t;
  75. typedef struct swjdp_common_s
  76. {
  77. arm_jtag_t *jtag_info;
  78. /* Control config */
  79. uint32_t dp_ctrl_stat;
  80. /* Support for several AP's in one DAP */
  81. uint32_t apsel;
  82. /* Register select cache */
  83. uint32_t dp_select_value;
  84. uint32_t ap_csw_value;
  85. uint32_t ap_tar_value;
  86. /* information about current pending SWjDP-AHBAP transaction */
  87. uint8_t trans_mode;
  88. uint8_t trans_rw;
  89. uint8_t ack;
  90. /* extra tck clocks for memory bus access */
  91. uint32_t memaccess_tck;
  92. /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */
  93. uint32_t tar_autoincr_block;
  94. } swjdp_common_t;
  95. /* Accessor function for currently selected DAP-AP number */
  96. static inline uint8_t dap_ap_get_select(swjdp_common_t *swjdp)
  97. {
  98. return (uint8_t)(swjdp ->apsel >> 24);
  99. }
  100. /* Internal functions used in the module, partial transactions, use with caution */
  101. extern int dap_dp_write_reg(swjdp_common_t *swjdp, uint32_t value, uint8_t reg_addr);
  102. /* extern int swjdp_write_apacc(swjdp_common_t *swjdp, uint32_t value, uint8_t reg_addr); */
  103. extern int dap_dp_read_reg(swjdp_common_t *swjdp, uint32_t *value, uint8_t reg_addr);
  104. /* extern int swjdp_read_apacc(swjdp_common_t *swjdp, uint32_t *value, uint8_t reg_addr); */
  105. extern int dap_setup_accessport(swjdp_common_t *swjdp, uint32_t csw, uint32_t tar);
  106. extern int dap_ap_select(swjdp_common_t *swjdp,uint8_t apsel);
  107. extern int dap_ap_write_reg(swjdp_common_t *swjdp, uint32_t reg_addr, uint8_t* out_value_buf);
  108. extern int dap_ap_write_reg_u32(swjdp_common_t *swjdp, uint32_t reg_addr, uint32_t value);
  109. extern int dap_ap_read_reg(swjdp_common_t *swjdp, uint32_t reg_addr, uint8_t *in_value_buf);
  110. extern int dap_ap_read_reg_u32(swjdp_common_t *swjdp, uint32_t reg_addr, uint32_t *value);
  111. /* External interface, partial operations must be completed with swjdp_transaction_endcheck() */
  112. extern int swjdp_transaction_endcheck(swjdp_common_t *swjdp);
  113. /* MEM-AP memory mapped bus single uint32_t register transfers, without endcheck */
  114. extern int mem_ap_read_u32(swjdp_common_t *swjdp, uint32_t address, uint32_t *value);
  115. extern int mem_ap_write_u32(swjdp_common_t *swjdp, uint32_t address, uint32_t value);
  116. /* MEM-AP memory mapped bus transfers, single registers, complete transactions */
  117. extern int mem_ap_read_atomic_u32(swjdp_common_t *swjdp, uint32_t address, uint32_t *value);
  118. extern int mem_ap_write_atomic_u32(swjdp_common_t *swjdp, uint32_t address, uint32_t value);
  119. /* MEM-AP memory mapped bus block transfers */
  120. extern int mem_ap_read_buf_u8(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  121. extern int mem_ap_read_buf_u16(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  122. extern int mem_ap_read_buf_u32(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  123. extern int mem_ap_write_buf_u8(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  124. extern int mem_ap_write_buf_u16(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  125. extern int mem_ap_write_buf_u32(swjdp_common_t *swjdp, uint8_t *buffer, int count, uint32_t address);
  126. /* Initialisation of the debug system, power domains and registers */
  127. extern int ahbap_debugport_init(swjdp_common_t *swjdp);
  128. extern int dap_info_command(struct command_context_s *cmd_ctx, swjdp_common_t *swjdp, int apsel);
  129. /* Commands for user dap access */
  130. /* Currently implemented in armv7m, needs armv7m target structure to find jtag and swjdp structures */
  131. extern int handle_dap_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  132. extern int handle_dap_apsel_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  133. extern int handle_dap_apid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  134. extern int handle_dap_baseaddr_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  135. extern int handle_dap_memaccess_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  136. #endif