mirror of
https://github.com/openocd-org/openocd.git
synced 2025-10-15 12:57:13 +08:00
drivers/ch347: detailed packet logging
Split USB data packet logs by CH347 protocol commands Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Change-Id: I0f61529755f007ab13f42643676199790c5be2d4 Reviewed-on: https://review.openocd.org/c/openocd/+/8742 Reviewed-by: ZhiYuanNJ <871238103@qq.com> Tested-by: jenkins
This commit is contained in:
@@ -261,6 +261,102 @@ static inline bool ch347_is_single_cmd_type(uint8_t type)
|
|||||||
return type == CH347_CMD_GPIO || type == CH347_CMD_JTAG_INIT || type == CH347_CMD_SWD_INIT;
|
return type == CH347_CMD_GPIO || type == CH347_CMD_JTAG_INIT || type == CH347_CMD_SWD_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void log_buf_dump(const uint8_t *data, unsigned int size, bool recv)
|
||||||
|
{
|
||||||
|
unsigned int i = 0, j = 0;
|
||||||
|
unsigned int n = size * 3 + 1;
|
||||||
|
char *str = malloc(n);
|
||||||
|
if (!str)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (i < size && j < n) {
|
||||||
|
uint8_t cmd = data[i++];
|
||||||
|
hexify(str + j, &cmd, 1, n - j);
|
||||||
|
j += 2;
|
||||||
|
str[j++] = ' ';
|
||||||
|
|
||||||
|
unsigned int cmd_payload_size = le_to_h_u16(data + i);
|
||||||
|
if (i + 2 <= size && j + 4 < n) {
|
||||||
|
hexify(str + j, data + i, 2, n - j);
|
||||||
|
i += 2;
|
||||||
|
j += 4;
|
||||||
|
str[j++] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd == CH347_CMD_SWD) {
|
||||||
|
// nested SWD commands
|
||||||
|
str[j] = '\0';
|
||||||
|
if (i + cmd_payload_size > size) {
|
||||||
|
LOG_DEBUG_IO("%s - bad size", str);
|
||||||
|
cmd_payload_size = size - i;
|
||||||
|
} else {
|
||||||
|
LOG_DEBUG_IO("%s", str);
|
||||||
|
}
|
||||||
|
j = 0;
|
||||||
|
unsigned int swd_base_i = i;
|
||||||
|
|
||||||
|
while (i < swd_base_i + cmd_payload_size) {
|
||||||
|
uint8_t swd_cmd = data[i++];
|
||||||
|
hexify(str + j, &swd_cmd, 1, n - j);
|
||||||
|
j += 2;
|
||||||
|
str[j++] = ' ';
|
||||||
|
|
||||||
|
unsigned int swd_bits = 0;
|
||||||
|
unsigned int swd_payload_size = 0;
|
||||||
|
if (!recv) {
|
||||||
|
if (i + 2 <= size) {
|
||||||
|
swd_bits = le_to_h_u16(data + i);
|
||||||
|
hexify(str + j, data + i, 2, n - j);
|
||||||
|
i += 2;
|
||||||
|
j += 4;
|
||||||
|
str[j++] = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (swd_cmd) {
|
||||||
|
case CH347_CMD_SWD_REG_W:
|
||||||
|
if (recv)
|
||||||
|
swd_payload_size = 1;
|
||||||
|
else
|
||||||
|
swd_payload_size = DIV_ROUND_UP(swd_bits, 8);
|
||||||
|
break;
|
||||||
|
case CH347_CMD_SWD_SEQ_W:
|
||||||
|
if (!recv)
|
||||||
|
swd_payload_size = DIV_ROUND_UP(swd_bits, 8);
|
||||||
|
break;
|
||||||
|
case CH347_CMD_SWD_REG_R:
|
||||||
|
if (recv)
|
||||||
|
swd_payload_size = 1 + 4 + 1;
|
||||||
|
else
|
||||||
|
swd_payload_size = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
hexify(str + j, data + i, MIN(swd_payload_size, size - i), n - j);
|
||||||
|
i += swd_payload_size;
|
||||||
|
j += 2 * swd_payload_size;
|
||||||
|
str[j] = '\0';
|
||||||
|
if (i > size)
|
||||||
|
LOG_DEBUG_IO(" %s - bad size", str);
|
||||||
|
else
|
||||||
|
LOG_DEBUG_IO(" %s", str);
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hexify(str + j, data + i, MIN(cmd_payload_size, size - i), n - j);
|
||||||
|
i += cmd_payload_size;
|
||||||
|
j += 2 * cmd_payload_size;
|
||||||
|
str[j] = '\0';
|
||||||
|
if (i > size)
|
||||||
|
LOG_DEBUG_IO("%s - bad size", str);
|
||||||
|
else
|
||||||
|
LOG_DEBUG_IO("%s", str);
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief writes data to the CH347 via libusb driver
|
* @brief writes data to the CH347 via libusb driver
|
||||||
*
|
*
|
||||||
@@ -289,9 +385,8 @@ static int ch347_write_data(uint8_t *data, int *length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
|
if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
|
||||||
char *str = buf_to_hex_str(data, i * 8);
|
LOG_DEBUG_IO("size=%d, buf=", i);
|
||||||
LOG_DEBUG_IO("size=%d, buf=[%s]", i, str);
|
log_buf_dump(data, i, false);
|
||||||
free(str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*length = i;
|
*length = i;
|
||||||
@@ -327,9 +422,8 @@ static int ch347_read_data(uint8_t *data, int *length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
|
if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
|
||||||
char *str = buf_to_hex_str(data, i * 8);
|
LOG_DEBUG_IO("size=%d, buf=", i);
|
||||||
LOG_DEBUG_IO("size=%d, buf=[%s]", i, str);
|
log_buf_dump(data, i, true);
|
||||||
free(str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*length = i;
|
*length = i;
|
||||||
|
Reference in New Issue
Block a user