1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
* (C) Copyright 2014,2018 Leo C. <erbl259-lmu@yahoo.de>
*
* SPDX-License-Identifier: GPL-2.0
*/
#include "common.h"
#include <stdint.h>
#include "con-utils.h"
#include "print-utils.h"
void print_blanks(uint_fast8_t count)
{
while(count--)
putchar(' ');
}
ERRNUM eeprom_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
{
eeprom_read_block((void *) buf, (const void *) (size_t) addr, count);
return ESUCCESS;
}
ERRNUM ram_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
{
while (count--)
*buf++ = *(uint8_t *) (size_t) addr++;
return ESUCCESS;
}
ERRNUM flash_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
{
while (count--)
*buf++ = *(const __memx uint8_t *) (__uint24) addr++;
return ESUCCESS;
}
ERRNUM dump_mem(uint32_t address, uint32_t offset, uint32_t len,
ERRNUM (*readfkt)(uint8_t *, uint32_t, uint8_t), char *title)
{
uint8_t buf[16];
uint8_t llen = 16;
uint8_t pre = offset % 16;
offset = offset & ~0x0f;
len += pre;
uint8_t i;
if (title && *title) {
printf_P(PSTR("%s\n"),title);
}
while (len) {
if (len < 16)
llen = len;
ERRNUM err = readfkt(buf, address, llen - pre);
if (err != ESUCCESS)
return err;
if (title)
print_blanks(4);
printf_P(PSTR("%.5lx:"),offset);
for (i = 0; i < llen; i++) {
if ((i % 8) == 0)
putchar(' ');
if (i < pre)
printf_P(PSTR(".. "));
else
printf_P(PSTR("%.2x "), buf[i-pre]);
}
/* fill line with whitespace for nice ASCII print */
print_blanks(3 * (16u - i) + (16u-i)/8 + 1 + pre);
/* Print data in ASCII characters */
for (i = pre; i < llen; i++)
printf_P(PSTR("%c"), isprint(buf[i-pre]) ? buf[i-pre] : '.');
putchar('\n');
address += llen - pre;
offset += 16;
pre = 0;
len -= llen;
if (ctrlc())
return EINTR;
}
return ESUCCESS;
}
void dump_eep(uint32_t addr, unsigned int len, char *title)
{
dump_mem(addr, addr, len, eeprom_read_buf, title);
}
void dump_ram(uint8_t *addr, size_t offset, unsigned int len, char *title)
{
dump_mem((uint32_t) (size_t) addr, offset, len, ram_read_buf, title);
}
|