This is an automated email from Gerrit. "Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8742
-- gerrit commit ab8d4381b5b4f213fa9ab262f1176ad8c859b959 Author: Tomas Vanek <van...@fbl.cz> Date: Sun Nov 5 06:42:25 2023 +0100 drivers/ch347: detailed packet logging Split USB data packet logs by CH347 protocol commands Signed-off-by: Tomas Vanek <van...@fbl.cz> Change-Id: I0f61529755f007ab13f42643676199790c5be2d4 diff --git a/src/jtag/drivers/ch347.c b/src/jtag/drivers/ch347.c index 42f58c6423..e7d59f3206 100644 --- a/src/jtag/drivers/ch347.c +++ b/src/jtag/drivers/ch347.c @@ -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; } +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 * @@ -289,9 +385,8 @@ static int ch347_write_data(uint8_t *data, int *length) } if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) { - char *str = buf_to_hex_str(data, i * 8); - LOG_DEBUG_IO("size=%d, buf=[%s]", i, str); - free(str); + LOG_DEBUG_IO("size=%d, buf=", i); + log_buf_dump(data, i, false); } *length = i; @@ -327,9 +422,8 @@ static int ch347_read_data(uint8_t *data, int *length) } if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) { - char *str = buf_to_hex_str(data, i * 8); - LOG_DEBUG_IO("size=%d, buf=[%s]", i, str); - free(str); + LOG_DEBUG_IO("size=%d, buf=", i); + log_buf_dump(data, i, true); } *length = i; --