-/* SPDX-License-Identifier: GPL-2.0-or-later */
+// SPDX-License-Identifier: GPL-2.0-or-later
/***************************************************************************
* Copyright (C) 2007 by Juergen Stuber <juergen@jstuber.net> *
return ERROR_OK;
}
-static int jlink_execute_queue(void)
+static int jlink_execute_queue(struct jtag_command *cmd_queue)
{
int ret;
- struct jtag_command *cmd = jtag_command_queue;
+ struct jtag_command *cmd = cmd_queue;
while (cmd) {
ret = jlink_execute_command(cmd);
{
int tmp;
- if (CMD_ARGC != 1) {
- command_print(CMD, "Need exactly one argument for jlink usb");
+ if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR;
- }
if (sscanf(CMD_ARGV[0], "%i", &tmp) != 1) {
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]);
- return ERROR_FAIL;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
if (tmp < JAYLINK_USB_ADDRESS_0 || tmp > JAYLINK_USB_ADDRESS_3) {
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]);
- return ERROR_FAIL;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
usb_address = tmp;
} else if (CMD_ARGC == 1) {
if (sscanf(CMD_ARGV[0], "%i", &tmp) != 1) {
command_print(CMD, "Invalid argument: %s", CMD_ARGV[0]);
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
switch (tmp) {
break;
default:
command_print(CMD, "Invalid argument: %s", CMD_ARGV[0]);
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
} else {
- command_print(CMD, "Need exactly one argument for jlink jtag");
return ERROR_COMMAND_SYNTAX_ERROR;
}
int ret;
int enable;
- if (CMD_ARGC != 1) {
- command_print(CMD, "Need exactly one argument for jlink targetpower");
+ if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR;
- }
if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_SET_TARGET_POWER)) {
command_print(CMD, "Target power supply is not supported by the "
} else if (CMD_ARGC == 1) {
if (sscanf(CMD_ARGV[0], "%" SCNd8, &tmp) != 1) {
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]);
- return ERROR_FAIL;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
if (tmp > JAYLINK_USB_ADDRESS_3) {
command_print(CMD, "Invalid USB address: %u", tmp);
- return ERROR_FAIL;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
tmp_config.usb_address = tmp;
} else {
- command_print(CMD, "Need exactly one argument for jlink config usb");
return ERROR_COMMAND_SYNTAX_ERROR;
}
enable = false;
} else {
command_print(CMD, "Invalid argument: %s", CMD_ARGV[0]);
- return ERROR_FAIL;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
tmp_config.target_power = enable;
} else {
- command_print(CMD, "Need exactly one argument for jlink config "
- "targetpower");
return ERROR_COMMAND_SYNTAX_ERROR;
}
if ((strlen(str) != 17) || (str[2] != ':' || str[5] != ':' ||
str[8] != ':' || str[11] != ':' || str[14] != ':')) {
command_print(CMD, "Invalid MAC address format");
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
for (i = 5; i >= 0; i--) {
if (!(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5])) {
command_print(CMD, "Invalid MAC address: zero address");
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
if (!(0x01 & addr[0])) {
command_print(CMD, "Invalid MAC address: multicast address");
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_ARGUMENT_INVALID;
}
memcpy(tmp_config.mac_address, addr, sizeof(addr));
} else {
- command_print(CMD, "Need exactly one argument for jlink config mac");
return ERROR_COMMAND_SYNTAX_ERROR;
}
if (!CMD_ARGC) {
show_config_ip_address(CMD);
} else {
- if (!string_to_ip(CMD_ARGV[0], ip_address, &i))
- return ERROR_COMMAND_SYNTAX_ERROR;
+ if (!string_to_ip(CMD_ARGV[0], ip_address, &i)) {
+ command_print(CMD, "invalid IPv4 address");
+ return ERROR_COMMAND_ARGUMENT_INVALID;
+ }
len = strlen(CMD_ARGV[0]);
/* Check for format A.B.C.D/E. */
if (i < len) {
- if (CMD_ARGV[0][i] != '/')
- return ERROR_COMMAND_SYNTAX_ERROR;
+ if (CMD_ARGV[0][i] != '/') {
+ command_print(CMD, "missing network mask");
+ return ERROR_COMMAND_ARGUMENT_INVALID;
+ }
COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0] + i + 1, subnet_bits);
} else if (CMD_ARGC > 1) {
- if (!string_to_ip(CMD_ARGV[1], (uint8_t *)&subnet_mask, &i))
- return ERROR_COMMAND_SYNTAX_ERROR;
+ if (!string_to_ip(CMD_ARGV[1], (uint8_t *)&subnet_mask, &i)) {
+ command_print(CMD, "invalid subnet mask");
+ return ERROR_COMMAND_ARGUMENT_INVALID;
+ }
}
if (!subnet_mask)
void *buffer;
/** Offset in the destination buffer */
unsigned buffer_offset;
+ /** SWD command */
+ uint8_t swd_cmd;
};
#define MAX_PENDING_SCAN_RESULTS 256
switch (seq) {
case LINE_RESET:
- LOG_DEBUG("SWD line reset");
+ LOG_DEBUG_IO("SWD line reset");
s = swd_seq_line_reset;
s_len = swd_seq_line_reset_len;
break;
int i;
int ret;
- LOG_DEBUG("Executing %d queued transactions", pending_scan_results_length);
+ LOG_DEBUG_IO("Executing %d queued transactions", pending_scan_results_length);
if (queued_retval != ERROR_OK) {
LOG_DEBUG("Skipping due to previous errors: %d", queued_retval);
}
for (i = 0; i < pending_scan_results_length; i++) {
+ /* Devices do not reply to DP_TARGETSEL write cmd, ignore received ack */
+ bool check_ack = swd_cmd_returns_ack(pending_scan_results_buffer[i].swd_cmd);
int ack = buf_get_u32(tdo_buffer, pending_scan_results_buffer[i].first, 3);
-
- if (ack != SWD_ACK_OK) {
+ if (check_ack && ack != SWD_ACK_OK) {
LOG_DEBUG("SWD ack not OK: %d %s", ack,
ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK");
- queued_retval = ack == SWD_ACK_WAIT ? ERROR_WAIT : ERROR_FAIL;
+ queued_retval = swd_ack_to_error_code(ack);
goto skip;
} else if (pending_scan_results_buffer[i].length) {
uint32_t data = buf_get_u32(tdo_buffer, 3 + pending_scan_results_buffer[i].first, 32);
if (queued_retval != ERROR_OK)
return;
+ pending_scan_results_buffer[pending_scan_results_length].swd_cmd = cmd;
cmd |= SWD_CMD_START | SWD_CMD_PARK;
jlink_queue_data_out(&cmd, 8);