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