From 4d53ce59cdc998471981e78825d85bd4cfe37b50 Mon Sep 17 00:00:00 2001 From: NĂ©lio Laranjeiro Date: Sun, 1 Mar 2009 12:08:20 +0100 Subject: digital/avr/modules/flash: Added in the initialize part of the dump memory the possibility to find where is the last trace. --- digital/avr/modules/flash/flash.c | 37 ++++++++++++++++++++++++++--- digital/avr/modules/flash/flash.h | 3 +++ digital/avr/modules/flash/test/Makefile | 3 ++- digital/avr/modules/flash/test/flash-dump.c | 10 ++++++-- digital/avr/modules/trace/trace.c | 2 +- 5 files changed, 48 insertions(+), 7 deletions(-) (limited to 'digital') diff --git a/digital/avr/modules/flash/flash.c b/digital/avr/modules/flash/flash.c index 8d714fd6..01841230 100644 --- a/digital/avr/modules/flash/flash.c +++ b/digital/avr/modules/flash/flash.c @@ -244,9 +244,9 @@ flash_write_array (uint32_t addr, uint8_t *data, uint32_t length) uint8_t flash_log (uint8_t size, uint8_t *args) { - uint8_t buf[128]; + uint8_t buf[128+1]; uint8_t status = 0x0; - uint32_t addr; + uint32_t addr = 0; if (size >= 4) addr = (((uint32_t) args[1]) << 16) @@ -256,10 +256,41 @@ flash_log (uint8_t size, uint8_t *args) { case FLASH_CMD_INIT: status = flash_init (); + if (status) + { + uint32_t res; + uint32_t ended = 0; + for (addr = 0; addr < FLASH_ADDRESS_HIGH; addr += FLASH_PAGE_SIZE) + { + flash_read_array (addr, (uint8_t *) &res, 4); + if (res == 0xFFFFFFFF) + { + ended = addr; + proto_send3b ('e', addr >> 16, addr >> 8, addr); + /* The sector is empty. */ + break; + } + } + + for (addr = FLASH_PAGE (ended - FLASH_PAGE_SIZE); + addr != ended; + addr = FLASH_PAGE (addr - FLASH_PAGE_SIZE)) + { + uint32_t res; + uint32_t toto = FLASH_LOG_CODE_READ; + flash_read_array (addr, (uint8_t *) &res, 4); + if (res == FLASH_LOG_CODE_READ) + { + proto_send3b ('i', addr >> 16, addr >> 8, addr); + break; + } + } + } + proto_send1b ('s', status); break; case FLASH_CMD_READ: if ((size == 5) - && (args[4] < sizeof(buf))) + && (args[4] <= sizeof(buf))) { flash_read_array (addr, buf, args[4]); proto_send ('r', args[4], buf); diff --git a/digital/avr/modules/flash/flash.h b/digital/avr/modules/flash/flash.h index 47cc882e..9f92259a 100644 --- a/digital/avr/modules/flash/flash.h +++ b/digital/avr/modules/flash/flash.h @@ -53,6 +53,9 @@ #define FLASH_TBP_US 10 +#define FLASH_LOG_CODE 0xF33FF22F +#define FLASH_LOG_CODE_READ 0x2FF23FF3 + enum { FLASH_CMD_INIT, diff --git a/digital/avr/modules/flash/test/Makefile b/digital/avr/modules/flash/test/Makefile index aec41f98..33ad8001 100644 --- a/digital/avr/modules/flash/test/Makefile +++ b/digital/avr/modules/flash/test/Makefile @@ -1,7 +1,8 @@ BASE = ../../.. -AVR_PROGS = test-flash +AVR_PROGS = test-flash flash_dump test-flash_SOURCES = test-flash.c +flash_dump_SOURCES = flash-dump.c MODULES = utils spi flash proto uart CONFIGFILE = avrconfig.h diff --git a/digital/avr/modules/flash/test/flash-dump.c b/digital/avr/modules/flash/test/flash-dump.c index c2bc6106..6a622ac5 100644 --- a/digital/avr/modules/flash/test/flash-dump.c +++ b/digital/avr/modules/flash/test/flash-dump.c @@ -34,7 +34,6 @@ void proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) { /* May be unused. */ - uint32_t addr = v8_to_v32 (0, args[0], args[1], args[2]); uint8_t status; #define c(cmd, size) (cmd << 8 | size) switch (c (cmd, size)) @@ -45,14 +44,21 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) break; default: if (cmd == 'l') + { status = flash_log (size, args); if (!status) + { /* Error */ proto_send0('?'); + return; + } + } else + { /* Error */ proto_send0 ('?'); - return; + return; + } } /* Acknowledge what has been done */ proto_send (cmd, size, args); diff --git a/digital/avr/modules/trace/trace.c b/digital/avr/modules/trace/trace.c index c6a78a52..33488150 100644 --- a/digital/avr/modules/trace/trace.c +++ b/digital/avr/modules/trace/trace.c @@ -27,7 +27,7 @@ #include "modules/flash/flash.h" #include "trace.h" -#define TRACE_CODE_START 0xF33FF22F +#define TRACE_CODE_START FLASH_LOG_CODE #define TRACE_ARGS_MAX 6 #define TRACE_MAX_ARGS (TRACE_ARGS_MAX * TRACE_ARGS_MAX) -- cgit v1.2.3