1 /***************************************************************************
2 * Copyright (C) 2015 by Esben Haabendal *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 ***************************************************************************/
21 #include "target_type.h"
23 #include <jtag/jtag.h>
29 static int ls1_sap_target_create(struct target
*target
, Jim_Interp
*interp
)
31 struct ls1_sap
*ls1_sap
= calloc(1, sizeof(struct ls1_sap
));
33 ls1_sap
->tap
= target
->tap
;
34 target
->arch_info
= ls1_sap
;
39 static int ls1_sap_init_target(struct command_context
*cmd_ctx
, struct target
*target
)
41 LOG_DEBUG("%s", __func__
);
45 static int ls1_sap_arch_state(struct target
*target
)
47 LOG_DEBUG("%s", __func__
);
51 static int ls1_sap_poll(struct target
*target
)
53 if ((target
->state
== TARGET_UNKNOWN
) ||
54 (target
->state
== TARGET_RUNNING
) ||
55 (target
->state
== TARGET_DEBUG_RUNNING
))
56 target
->state
= TARGET_HALTED
;
61 static int ls1_sap_halt(struct target
*target
)
63 LOG_DEBUG("%s", __func__
);
67 static int ls1_sap_resume(struct target
*target
, int current
, target_addr_t address
,
68 int handle_breakpoints
, int debug_execution
)
70 LOG_DEBUG("%s", __func__
);
74 static int ls1_sap_step(struct target
*target
, int current
, target_addr_t address
,
75 int handle_breakpoints
)
77 LOG_DEBUG("%s", __func__
);
81 static int ls1_sap_assert_reset(struct target
*target
)
83 target
->state
= TARGET_RESET
;
85 LOG_DEBUG("%s", __func__
);
89 static int ls1_sap_deassert_reset(struct target
*target
)
91 target
->state
= TARGET_RUNNING
;
93 LOG_DEBUG("%s", __func__
);
97 static void ls1_sap_set_instr(struct jtag_tap
*tap
, uint32_t new_instr
)
99 struct scan_field field
;
101 if (buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
) == new_instr
)
104 field
.num_bits
= tap
->ir_length
;
105 uint8_t *t
= calloc(DIV_ROUND_UP(field
.num_bits
, 8), 1);
107 buf_set_u32(t
, 0, field
.num_bits
, new_instr
);
108 field
.in_value
= NULL
;
109 jtag_add_ir_scan(tap
, &field
, TAP_IDLE
);
113 static void ls1_sap_set_addr_high(struct jtag_tap
*tap
, uint16_t addr_high
)
115 struct scan_field field
;
118 ls1_sap_set_instr(tap
, 0x21);
121 field
.out_value
= buf
;
122 buf_set_u32(buf
, 0, 16, addr_high
);
123 field
.in_value
= NULL
;
124 field
.check_value
= NULL
;
125 field
.check_mask
= NULL
;
126 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
129 static void ls1_sap_memory_cmd(struct jtag_tap
*tap
, uint32_t address
,
130 int32_t size
, bool rnw
)
132 struct scan_field field
;
135 ls1_sap_set_instr(tap
, 0x24);
138 field
.out_value
= cmd
;
139 buf_set_u64(cmd
, 0, 9, 0);
140 buf_set_u64(cmd
, 9, 3, size
);
141 buf_set_u64(cmd
, 12, 1, rnw
);
142 buf_set_u64(cmd
, 13, 3, 0);
143 buf_set_u64(cmd
, 16, 32, address
);
144 buf_set_u64(cmd
, 48, 16, 0);
145 field
.in_value
= NULL
;
146 field
.check_value
= NULL
;
147 field
.check_mask
= NULL
;
148 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
151 static void ls1_sap_memory_read(struct jtag_tap
*tap
, uint32_t size
,
154 struct scan_field field
;
156 ls1_sap_set_instr(tap
, 0x25);
158 field
.num_bits
= 8 * size
;
159 field
.out_value
= NULL
;
160 field
.in_value
= value
;
161 field
.check_value
= NULL
;
162 field
.check_mask
= NULL
;
163 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
166 static void ls1_sap_memory_write(struct jtag_tap
*tap
, uint32_t size
,
167 const uint8_t *value
)
169 struct scan_field field
;
171 ls1_sap_set_instr(tap
, 0x25);
173 field
.num_bits
= 8 * size
;
174 field
.out_value
= value
;
175 field
.in_value
= NULL
;
176 field
.check_value
= NULL
;
177 field
.check_mask
= NULL
;
178 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
181 static int ls1_sap_read_memory(struct target
*target
, target_addr_t address
,
182 uint32_t size
, uint32_t count
, uint8_t *buffer
)
184 LOG_DEBUG("Reading memory at physical address 0x%" TARGET_PRIxADDR
185 "; size %" PRId32
"; count %" PRId32
, address
, size
, count
);
187 if (count
== 0 || buffer
== NULL
)
188 return ERROR_COMMAND_SYNTAX_ERROR
;
190 ls1_sap_set_addr_high(target
->tap
, 0);
193 ls1_sap_memory_cmd(target
->tap
, address
, size
, true);
194 ls1_sap_memory_read(target
->tap
, size
, buffer
);
199 return jtag_execute_queue();
202 static int ls1_sap_write_memory(struct target
*target
, target_addr_t address
,
203 uint32_t size
, uint32_t count
,
204 const uint8_t *buffer
)
206 LOG_DEBUG("Writing memory at physical address 0x%" TARGET_PRIxADDR
207 "; size %" PRId32
"; count %" PRId32
, address
, size
, count
);
210 if (count
== 0 || buffer
== NULL
)
211 return ERROR_COMMAND_SYNTAX_ERROR
;
213 ls1_sap_set_addr_high(target
->tap
, 0);
216 ls1_sap_memory_cmd(target
->tap
, address
, size
, false);
217 ls1_sap_memory_write(target
->tap
, size
, buffer
);
222 return jtag_execute_queue();
225 struct target_type ls1_sap_target
= {
228 .target_create
= ls1_sap_target_create
,
229 .init_target
= ls1_sap_init_target
,
231 .poll
= ls1_sap_poll
,
232 .arch_state
= ls1_sap_arch_state
,
234 .halt
= ls1_sap_halt
,
235 .resume
= ls1_sap_resume
,
236 .step
= ls1_sap_step
,
238 .assert_reset
= ls1_sap_assert_reset
,
239 .deassert_reset
= ls1_sap_deassert_reset
,
241 .read_memory
= ls1_sap_read_memory
,
242 .write_memory
= ls1_sap_write_memory
,
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)