]> git.sur5r.net Git - openocd/blob - src/target/arm_adi_v5.h
target: no implicit #includes of "register.h"
[openocd] / src / target / arm_adi_v5.h
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
26 #include "target.h"
27 #include "arm_jtag.h"
28
29 #define DAP_IR_DPACC    0xA
30 #define DAP_IR_APACC    0xB
31
32 #define DPAP_WRITE              0
33 #define DPAP_READ               1
34 #define DP_ZERO                 0
35 #define DP_CTRL_STAT    0x4
36 #define DP_SELECT               0x8
37 #define DP_RDBUFF               0xC
38
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)
48
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
58
59 #define CSW_8BIT                0
60 #define CSW_16BIT               1
61 #define CSW_32BIT               2
62
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)
70
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
77
78 struct swjdp_reg
79 {
80         int addr;
81         struct arm_jtag *jtag_info;
82 };
83
84 struct swjdp_common
85 {
86         struct arm_jtag *jtag_info;
87         /* Control config */
88         uint32_t dp_ctrl_stat;
89         /* Support for several AP's in one DAP */
90         uint32_t apsel;
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 */
96         uint8_t  trans_mode;
97         uint8_t  trans_rw;
98         uint8_t  ack;
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;
103
104 };
105
106 /* Accessor function for currently selected DAP-AP number */
107 static inline uint8_t dap_ap_get_select(struct swjdp_common *swjdp)
108 {
109         return (uint8_t)(swjdp ->apsel >> 24);
110 }
111
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);
119
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);
124
125 /* External interface, partial operations must be completed with swjdp_transaction_endcheck() */
126 int swjdp_transaction_endcheck(struct swjdp_common *swjdp);
127
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);
131
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);
137
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);
145
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);
152
153 /* Initialisation of the debug system, power domains and registers */
154 int ahbap_debugport_init(struct swjdp_common *swjdp);
155
156
157 /* Commands for user dap access */
158 int dap_info_command(struct command_context *cmd_ctx,
159                 struct swjdp_common *swjdp, int apsel);
160
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);
167
168 #endif