server/telnet: Always allow 'exit' command
[openocd.git] / src / target / ls1_sap.c
blob9bd00c0e5ff346be8ef027c05d84c6290236cb59
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /*
4 * Copyright (C) 2015 by Esben Haabendal <eha@deif.com>
5 */
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
11 #include "target.h"
12 #include "target_type.h"
14 #include <jtag/jtag.h>
16 struct ls1_sap {
17 struct jtag_tap *tap;
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;
27 return ERROR_OK;
30 static int ls1_sap_init_target(struct command_context *cmd_ctx, struct target *target)
32 LOG_DEBUG("%s", __func__);
33 return ERROR_OK;
36 static int ls1_sap_arch_state(struct target *target)
38 LOG_DEBUG("%s", __func__);
39 return ERROR_OK;
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;
49 return ERROR_OK;
52 static int ls1_sap_halt(struct target *target)
54 LOG_DEBUG("%s", __func__);
55 return ERROR_OK;
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__);
62 return ERROR_OK;
65 static int ls1_sap_step(struct target *target, int current, target_addr_t address,
66 int handle_breakpoints)
68 LOG_DEBUG("%s", __func__);
69 return ERROR_OK;
72 static int ls1_sap_assert_reset(struct target *target)
74 target->state = TARGET_RESET;
76 LOG_DEBUG("%s", __func__);
77 return ERROR_OK;
80 static int ls1_sap_deassert_reset(struct target *target)
82 target->state = TARGET_RUNNING;
84 LOG_DEBUG("%s", __func__);
85 return ERROR_OK;
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)
93 return;
95 field.num_bits = tap->ir_length;
96 uint8_t *t = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
97 field.out_value = t;
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);
101 free(t);
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);
111 field.num_bits = 16;
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);
128 field.num_bits = 64;
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,
143 uint8_t *value)
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);
183 while (count--) {
184 ls1_sap_memory_cmd(target->tap, address, size, true);
185 ls1_sap_memory_read(target->tap, size, buffer);
186 address += size;
187 buffer += size;
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);
206 while (count--) {
207 ls1_sap_memory_cmd(target->tap, address, size, false);
208 ls1_sap_memory_write(target->tap, size, buffer);
209 address += size;
210 buffer += size;
213 return jtag_execute_queue();
216 struct target_type ls1_sap_target = {
217 .name = "ls1_sap",
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,