summaryrefslogtreecommitdiffhomepage
path: root/digital
diff options
context:
space:
mode:
authorNélio Laranjeiro2009-03-01 12:08:20 +0100
committerNélio Laranjeiro2009-03-01 12:08:20 +0100
commit4d53ce59cdc998471981e78825d85bd4cfe37b50 (patch)
tree7cfed27022c709e83050476e822d774b58253b1c /digital
parentba98e932657a6a8f9d5139a571bb77ef5de1beca (diff)
digital/avr/modules/flash:
Added in the initialize part of the dump memory the possibility to find where is the last trace.
Diffstat (limited to 'digital')
-rw-r--r--digital/avr/modules/flash/flash.c37
-rw-r--r--digital/avr/modules/flash/flash.h3
-rw-r--r--digital/avr/modules/flash/test/Makefile3
-rw-r--r--digital/avr/modules/flash/test/flash-dump.c10
-rw-r--r--digital/avr/modules/trace/trace.c2
5 files changed, 48 insertions, 7 deletions
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)