1 /***************************************************************************
2 * Copyright (C) 2006 by Magnus Lundin *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
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. *
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. *
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 ***************************************************************************/
26 #include <target/arm_jtag.h>
28 #define DAP_IR_DPACC 0xA
29 #define DAP_IR_APACC 0xB
34 #define DP_CTRL_STAT 0x4
38 #define CORUNDETECT (1 << 0)
39 #define SSTICKYORUN (1 << 1)
40 #define SSTICKYERR (1 << 5)
41 #define CDBGRSTREQ (1 << 26)
42 #define CDBGRSTACK (1 << 27)
43 #define CDBGPWRUPREQ (1 << 28)
44 #define CDBGPWRUPACK (1 << 29)
45 #define CSYSPWRUPREQ (1 << 30)
46 #define CSYSPWRUPACK (1 << 31)
48 #define AP_REG_CSW 0x00
49 #define AP_REG_TAR 0x04
50 #define AP_REG_DRW 0x0C
51 #define AP_REG_BD0 0x10
52 #define AP_REG_BD1 0x14
53 #define AP_REG_BD2 0x18
54 #define AP_REG_BD3 0x1C
55 #define AP_REG_DBGROMA 0xF8
56 #define AP_REG_IDR 0xFC
62 #define CSW_ADDRINC_MASK (3 << 4)
63 #define CSW_ADDRINC_OFF 0
64 #define CSW_ADDRINC_SINGLE (1 << 4)
65 #define CSW_ADDRINC_PACKED (2 << 4)
66 #define CSW_HPROT (1 << 25)
67 #define CSW_MASTER_DEBUG (1 << 29)
68 #define CSW_DBGSWENABLE (1 << 31)
70 /* transaction mode */
71 #define TRANS_MODE_NONE 0
72 /* Transaction waits for previous to complete */
73 #define TRANS_MODE_ATOMIC 1
74 /* Freerunning transactions with delays and overrun checking */
75 #define TRANS_MODE_COMPOSITE 2
80 struct arm_jtag *jtag_info;
85 struct arm_jtag *jtag_info;
87 uint32_t dp_ctrl_stat;
88 /* Support for several AP's in one DAP */
90 /* Register select cache */
91 uint32_t dp_select_value;
92 uint32_t ap_csw_value;
93 uint32_t ap_tar_value;
94 /* information about current pending SWjDP-AHBAP transaction */
98 /* extra tck clocks for memory bus access */
99 uint32_t memaccess_tck;
100 /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */
101 uint32_t tar_autoincr_block;
105 /* Accessor function for currently selected DAP-AP number */
106 static inline uint8_t dap_ap_get_select(struct swjdp_common *swjdp)
108 return (uint8_t)(swjdp ->apsel >> 24);
111 /* Internal functions used in the module, partial transactions, use with caution */
112 int dap_dp_write_reg(struct swjdp_common *swjdp, uint32_t value, uint8_t reg_addr);
113 /* int swjdp_write_apacc(struct swjdp_common *swjdp, uint32_t value, uint8_t reg_addr); */
114 int dap_dp_read_reg(struct swjdp_common *swjdp, uint32_t *value, uint8_t reg_addr);
115 /* int swjdp_read_apacc(struct swjdp_common *swjdp, uint32_t *value, uint8_t reg_addr); */
116 int dap_setup_accessport(struct swjdp_common *swjdp, uint32_t csw, uint32_t tar);
117 int dap_ap_select(struct swjdp_common *swjdp,uint8_t apsel);
119 int dap_ap_write_reg(struct swjdp_common *swjdp, uint32_t addr, uint8_t* out_buf);
120 int dap_ap_write_reg_u32(struct swjdp_common *swjdp, uint32_t addr, uint32_t value);
121 int dap_ap_read_reg(struct swjdp_common *swjdp, uint32_t addr, uint8_t *in_buf);
122 int dap_ap_read_reg_u32(struct swjdp_common *swjdp, uint32_t addr, uint32_t *value);
124 /* External interface, partial operations must be completed with swjdp_transaction_endcheck() */
125 int swjdp_transaction_endcheck(struct swjdp_common *swjdp);
127 /* MEM-AP memory mapped bus single uint32_t register transfers, without endcheck */
128 int mem_ap_read_u32(struct swjdp_common *swjdp, uint32_t address, uint32_t *value);
129 int mem_ap_write_u32(struct swjdp_common *swjdp, uint32_t address, uint32_t value);
131 /* MEM-AP memory mapped bus transfers, single registers, complete transactions */
132 int mem_ap_read_atomic_u32(struct swjdp_common *swjdp,
133 uint32_t address, uint32_t *value);
134 int mem_ap_write_atomic_u32(struct swjdp_common *swjdp,
135 uint32_t address, uint32_t value);
137 /* MEM-AP memory mapped bus block transfers */
138 int mem_ap_read_buf_u8(struct swjdp_common *swjdp,
139 uint8_t *buffer, int count, uint32_t address);
140 int mem_ap_read_buf_u16(struct swjdp_common *swjdp,
141 uint8_t *buffer, int count, uint32_t address);
142 int mem_ap_read_buf_u32(struct swjdp_common *swjdp,
143 uint8_t *buffer, int count, uint32_t address);
145 int mem_ap_write_buf_u8(struct swjdp_common *swjdp,
146 uint8_t *buffer, int count, uint32_t address);
147 int mem_ap_write_buf_u16(struct swjdp_common *swjdp,
148 uint8_t *buffer, int count, uint32_t address);
149 int mem_ap_write_buf_u32(struct swjdp_common *swjdp,
150 uint8_t *buffer, int count, uint32_t address);
152 /* Initialisation of the debug system, power domains and registers */
153 int ahbap_debugport_init(struct swjdp_common *swjdp);
156 /* Commands for user dap access */
157 int dap_info_command(struct command_context *cmd_ctx,
158 struct swjdp_common *swjdp, int apsel);
160 #define DAP_COMMAND_HANDLER(name) \
161 COMMAND_HELPER(name, struct swjdp_common *swjdp)
162 DAP_COMMAND_HANDLER(dap_baseaddr_command);
163 DAP_COMMAND_HANDLER(dap_memaccess_command);
164 DAP_COMMAND_HANDLER(dap_apsel_command);
165 DAP_COMMAND_HANDLER(dap_apid_command);