Implemented "hexout" command.
This commit is contained in:
parent
8ce134c04c
commit
f8a9b9f5b6
132
main.c
132
main.c
|
@ -221,6 +221,135 @@ static int cmd_dis(char **arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Hex dumper
|
||||||
|
*/
|
||||||
|
|
||||||
|
static FILE *hexout_file;
|
||||||
|
static u_int16_t hexout_addr;
|
||||||
|
static u_int8_t hexout_buf[16];
|
||||||
|
static int hexout_len;
|
||||||
|
|
||||||
|
static int hexout_start(const char *filename)
|
||||||
|
{
|
||||||
|
hexout_file = fopen(filename, "w");
|
||||||
|
if (!hexout_file) {
|
||||||
|
perror("hexout: couldn't open output file");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hexout_flush(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int cksum = 0;
|
||||||
|
|
||||||
|
if (!hexout_len)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (fprintf(hexout_file, ":%02X%04X00", hexout_len, hexout_addr) < 0)
|
||||||
|
goto fail;
|
||||||
|
cksum += hexout_len;
|
||||||
|
cksum += hexout_addr & 0xff;
|
||||||
|
cksum += hexout_addr >> 8;
|
||||||
|
|
||||||
|
for (i = 0; i < hexout_len; i++) {
|
||||||
|
if (fprintf(hexout_file, "%02X", hexout_buf[i]) < 0)
|
||||||
|
goto fail;
|
||||||
|
cksum += hexout_buf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fprintf(hexout_file, "%02X\n", ~(cksum - 1) & 0xff) < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
hexout_len = 0;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
perror("hexout: can't write HEX data");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hexout_feed(u_int16_t addr, const u_int8_t *buf, int len)
|
||||||
|
{
|
||||||
|
while (len) {
|
||||||
|
int count;
|
||||||
|
|
||||||
|
if ((hexout_addr + hexout_len != addr ||
|
||||||
|
hexout_len >= sizeof(hexout_buf)) &&
|
||||||
|
hexout_flush() < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!hexout_len)
|
||||||
|
hexout_addr = addr;
|
||||||
|
|
||||||
|
count = sizeof(hexout_buf) - hexout_len;
|
||||||
|
if (count > len)
|
||||||
|
count = len;
|
||||||
|
|
||||||
|
memcpy(hexout_buf + hexout_len, buf, count);
|
||||||
|
hexout_len += count;
|
||||||
|
|
||||||
|
addr += count;
|
||||||
|
buf += count;
|
||||||
|
len -= count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cmd_hexout(char **arg)
|
||||||
|
{
|
||||||
|
char *off_text = get_arg(arg);
|
||||||
|
char *len_text = get_arg(arg);
|
||||||
|
char *filename = *arg;
|
||||||
|
int off;
|
||||||
|
int length;
|
||||||
|
|
||||||
|
if (!(off_text && len_text && *filename)) {
|
||||||
|
fprintf(stderr, "hexout: need offset, length and filename\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stab_parse(off_text, &off) < 0 ||
|
||||||
|
stab_parse(len_text, &length) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hexout_start(filename) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
while (length) {
|
||||||
|
u_int8_t buf[128];
|
||||||
|
int count = length;
|
||||||
|
|
||||||
|
if (count > sizeof(buf))
|
||||||
|
count = sizeof(buf);
|
||||||
|
|
||||||
|
printf("Reading %d bytes from 0x%04x...\n", count, off);
|
||||||
|
if (msp430_dev->readmem(off, buf, count) < 0) {
|
||||||
|
perror("hexout: can't read memory");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hexout_feed(off, buf, count) < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
length -= count;
|
||||||
|
off += count;
|
||||||
|
}
|
||||||
|
|
||||||
|
hexout_flush();
|
||||||
|
fclose(hexout_file);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
fclose(hexout_file);
|
||||||
|
unlink(filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int cmd_reset(char **arg)
|
static int cmd_reset(char **arg)
|
||||||
{
|
{
|
||||||
return msp430_dev->control(DEVICE_CTL_RESET);
|
return msp430_dev->control(DEVICE_CTL_RESET);
|
||||||
|
@ -489,6 +618,9 @@ static const struct command all_commands[] = {
|
||||||
"help [command]\n"
|
"help [command]\n"
|
||||||
" Without arguments, displays a list of commands. With a command name as\n"
|
" Without arguments, displays a list of commands. With a command name as\n"
|
||||||
" an argument, displays help for that command.\n"},
|
" an argument, displays help for that command.\n"},
|
||||||
|
{"hexout", cmd_hexout,
|
||||||
|
"hexout <address> <length> <filename.hex>\n"
|
||||||
|
" Save a region of memory into an HEX file.\n"},
|
||||||
{"md", cmd_md,
|
{"md", cmd_md,
|
||||||
"md <address> <length>\n"
|
"md <address> <length>\n"
|
||||||
" Read the specified number of bytes from memory at the given address,\n"
|
" Read the specified number of bytes from memory at the given address,\n"
|
||||||
|
|
Loading…
Reference in New Issue