1 /* SPDX-License-Identifier: GPL-2.0-or-later */
4 * Copyright (C) 2015 by Esben Haabendal <eha@deif.com>
12 #include "target_type.h"
14 #include <jtag/jtag.h>
20 static int ls1_sap_target_create(struct target
*target
, Jim_Interp
*interp
)
22 struct ls1_sap
*ls1_sap
= calloc(1, sizeof(struct ls1_sap
));
24 ls1_sap
->tap
= target
->tap
;
25 target
->arch_info
= ls1_sap
;
30 static int ls1_sap_init_target(struct command_context
*cmd_ctx
, struct target
*target
)
32 LOG_DEBUG("%s", __func__
);
36 static int ls1_sap_arch_state(struct target
*target
)
38 LOG_DEBUG("%s", __func__
);
42 static int ls1_sap_poll(struct target
*target
)
44 if ((target
->state
== TARGET_UNKNOWN
) ||
45 (target
->state
== TARGET_RUNNING
) ||
46 (target
->state
== TARGET_DEBUG_RUNNING
))
47 target
->state
= TARGET_HALTED
;
52 static int ls1_sap_halt(struct target
*target
)
54 LOG_DEBUG("%s", __func__
);
58 static int ls1_sap_resume(struct target
*target
, int current
, target_addr_t address
,
59 int handle_breakpoints
, int debug_execution
)
61 LOG_DEBUG("%s", __func__
);
65 static int ls1_sap_step(struct target
*target
, int current
, target_addr_t address
,
66 int handle_breakpoints
)
68 LOG_DEBUG("%s", __func__
);
72 static int ls1_sap_assert_reset(struct target
*target
)
74 target
->state
= TARGET_RESET
;
76 LOG_DEBUG("%s", __func__
);
80 static int ls1_sap_deassert_reset(struct target
*target
)
82 target
->state
= TARGET_RUNNING
;
84 LOG_DEBUG("%s", __func__
);
88 static void ls1_sap_set_instr(struct jtag_tap
*tap
, uint32_t new_instr
)
90 struct scan_field field
;
92 if (buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
) == new_instr
)
95 field
.num_bits
= tap
->ir_length
;
96 uint8_t *t
= calloc(DIV_ROUND_UP(field
.num_bits
, 8), 1);
98 buf_set_u32(t
, 0, field
.num_bits
, new_instr
);
99 field
.in_value
= NULL
;
100 jtag_add_ir_scan(tap
, &field
, TAP_IDLE
);
104 static void ls1_sap_set_addr_high(struct jtag_tap
*tap
, uint16_t addr_high
)
106 struct scan_field field
;
107 uint8_t buf
[2] = { 0 };
109 ls1_sap_set_instr(tap
, 0x21);
112 field
.out_value
= buf
;
113 buf_set_u32(buf
, 0, 16, addr_high
);
114 field
.in_value
= NULL
;
115 field
.check_value
= NULL
;
116 field
.check_mask
= NULL
;
117 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
120 static void ls1_sap_memory_cmd(struct jtag_tap
*tap
, uint32_t address
,
121 int32_t size
, bool rnw
)
123 struct scan_field field
;
124 uint8_t cmd
[8] = { 0 };
126 ls1_sap_set_instr(tap
, 0x24);
129 field
.out_value
= cmd
;
130 buf_set_u64(cmd
, 0, 9, 0);
131 buf_set_u64(cmd
, 9, 3, size
);
132 buf_set_u64(cmd
, 12, 1, rnw
);
133 buf_set_u64(cmd
, 13, 3, 0);
134 buf_set_u64(cmd
, 16, 32, address
);
135 buf_set_u64(cmd
, 48, 16, 0);
136 field
.in_value
= NULL
;
137 field
.check_value
= NULL
;
138 field
.check_mask
= NULL
;
139 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
142 static void ls1_sap_memory_read(struct jtag_tap
*tap
, uint32_t size
,
145 struct scan_field field
;
147 ls1_sap_set_instr(tap
, 0x25);
149 field
.num_bits
= 8 * size
;
150 field
.out_value
= NULL
;
151 field
.in_value
= value
;
152 field
.check_value
= NULL
;
153 field
.check_mask
= NULL
;
154 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
157 static void ls1_sap_memory_write(struct jtag_tap
*tap
, uint32_t size
,
158 const uint8_t *value
)
160 struct scan_field field
;
162 ls1_sap_set_instr(tap
, 0x25);
164 field
.num_bits
= 8 * size
;
165 field
.out_value
= value
;
166 field
.in_value
= NULL
;
167 field
.check_value
= NULL
;
168 field
.check_mask
= NULL
;
169 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
172 static int ls1_sap_read_memory(struct target
*target
, target_addr_t address
,
173 uint32_t size
, uint32_t count
, uint8_t *buffer
)
175 LOG_DEBUG("Reading memory at physical address 0x%" TARGET_PRIxADDR
176 "; size %" PRIu32
"; count %" PRIu32
, address
, size
, count
);
178 if (count
== 0 || !buffer
)
179 return ERROR_COMMAND_SYNTAX_ERROR
;
181 ls1_sap_set_addr_high(target
->tap
, 0);
184 ls1_sap_memory_cmd(target
->tap
, address
, size
, true);
185 ls1_sap_memory_read(target
->tap
, size
, buffer
);
190 return jtag_execute_queue();
193 static int ls1_sap_write_memory(struct target
*target
, target_addr_t address
,
194 uint32_t size
, uint32_t count
,
195 const uint8_t *buffer
)
197 LOG_DEBUG("Writing memory at physical address 0x%" TARGET_PRIxADDR
198 "; size %" PRIu32
"; count %" PRIu32
, address
, size
, count
);
201 if (count
== 0 || !buffer
)
202 return ERROR_COMMAND_SYNTAX_ERROR
;
204 ls1_sap_set_addr_high(target
->tap
, 0);
207 ls1_sap_memory_cmd(target
->tap
, address
, size
, false);
208 ls1_sap_memory_write(target
->tap
, size
, buffer
);
213 return jtag_execute_queue();
216 struct target_type ls1_sap_target
= {
219 .target_create
= ls1_sap_target_create
,
220 .init_target
= ls1_sap_init_target
,
222 .poll
= ls1_sap_poll
,
223 .arch_state
= ls1_sap_arch_state
,
225 .halt
= ls1_sap_halt
,
226 .resume
= ls1_sap_resume
,
227 .step
= ls1_sap_step
,
229 .assert_reset
= ls1_sap_assert_reset
,
230 .deassert_reset
= ls1_sap_deassert_reset
,
232 .read_memory
= ls1_sap_read_memory
,
233 .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)