Fix debug prints when loading to flash
While loading to flash with debug level at least 3, OpenOCD tries to print the whole loaded bitstream. This will be very-very-slow due to implementation of conversion from buffer to string. * fix condition on selected debug level in jtag/core.c * replace slow buf_to_str function from helper/binarybuffer.c with faster but_to_hex_str function Change-Id: I3dc01d5846941ca80736f2ed12e3a54114d2b6dd Signed-off-by: Samuel Obuch <sobuch@codasip.com> Reviewed-on: http://openocd.zylin.com/5800 Tested-by: jenkins Reviewed-by: Jan Matyas <matyas@codasip.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
committed by
Antonio Borneo
parent
764b25c814
commit
3ac010bb9f
@@ -199,45 +199,20 @@ static int ceil_f_to_u32(float x)
|
||||
return y;
|
||||
}
|
||||
|
||||
char *buf_to_str(const void *_buf, unsigned buf_len, unsigned radix)
|
||||
char *buf_to_hex_str(const void *_buf, unsigned buf_len)
|
||||
{
|
||||
float factor;
|
||||
switch (radix) {
|
||||
case 16:
|
||||
factor = 2.0; /* log(256) / log(16) = 2.0 */
|
||||
break;
|
||||
case 10:
|
||||
factor = 2.40824; /* log(256) / log(10) = 2.40824 */
|
||||
break;
|
||||
case 8:
|
||||
factor = 2.66667; /* log(256) / log(8) = 2.66667 */
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned str_len = ceil_f_to_u32(DIV_ROUND_UP(buf_len, 8) * factor);
|
||||
char *str = calloc(str_len + 1, 1);
|
||||
unsigned len_bytes = DIV_ROUND_UP(buf_len, 8);
|
||||
char *str = calloc(len_bytes * 2 + 1, 1);
|
||||
|
||||
const uint8_t *buf = _buf;
|
||||
int b256_len = DIV_ROUND_UP(buf_len, 8);
|
||||
for (int i = b256_len - 1; i >= 0; i--) {
|
||||
uint32_t tmp = buf[i];
|
||||
if (((unsigned)i == (buf_len / 8)) && (buf_len % 8))
|
||||
for (unsigned i = 0; i < len_bytes; i++) {
|
||||
uint8_t tmp = buf[len_bytes - i - 1];
|
||||
if ((i == 0) && (buf_len % 8))
|
||||
tmp &= (0xff >> (8 - (buf_len % 8)));
|
||||
|
||||
/* base-256 digits */
|
||||
for (unsigned j = str_len; j > 0; j--) {
|
||||
tmp += (uint32_t)str[j-1] * 256;
|
||||
str[j-1] = (uint8_t)(tmp % radix);
|
||||
tmp /= radix;
|
||||
}
|
||||
str[2 * i] = hex_digits[tmp >> 4];
|
||||
str[2 * i + 1] = hex_digits[tmp & 0xf];
|
||||
}
|
||||
|
||||
const char * const DIGITS = "0123456789ABCDEF";
|
||||
for (unsigned j = 0; j < str_len; j++)
|
||||
str[j] = DIGITS[(int)str[j]];
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user