summaryrefslogtreecommitdiff
path: root/digital/avr
diff options
context:
space:
mode:
authorNélio Laranjeiro2008-11-10 21:10:26 +0100
committerNélio Laranjeiro2008-11-10 21:10:26 +0100
commite15619e199eed4a40aa401f1f6db8c1d81d87c65 (patch)
tree5602d420ebd22483e146dae52d7f15b1ab1ac32f /digital/avr
parentb8bcbaebba4c29cd5ac5ca01262d3be4245c482b (diff)
avr/modules/trace: Driver to store traces into the flash memory.
This modules is in charge to store values of any type of data in the flash memory.
Diffstat (limited to 'digital/avr')
-rw-r--r--digital/avr/modules/trace/avrconfig.h4
-rw-r--r--digital/avr/modules/trace/trace.c124
-rw-r--r--digital/avr/modules/trace/trace.h66
3 files changed, 164 insertions, 30 deletions
diff --git a/digital/avr/modules/trace/avrconfig.h b/digital/avr/modules/trace/avrconfig.h
index 56d64ced..4cef71a7 100644
--- a/digital/avr/modules/trace/avrconfig.h
+++ b/digital/avr/modules/trace/avrconfig.h
@@ -1,7 +1,7 @@
#ifndef avrconfig_h
#define avrconfig_h
/* avrconfig.h */
-/* avr.flash - Flash SPI AVR module. {{{
+/* avr.flash - Trace AVR module. {{{
*
* Copyright (C) 2008 Nélio Laranjeiro
*
@@ -25,7 +25,7 @@
*
* }}} */
-/* flash - Flash SPI AVR module. */
+/* trace - Trace AVR module. */
/** Flash PORT used. */
#define AC_FLASH_PORT PORTX
diff --git a/digital/avr/modules/trace/trace.c b/digital/avr/modules/trace/trace.c
index 42f8bdd0..1f761796 100644
--- a/digital/avr/modules/trace/trace.c
+++ b/digital/avr/modules/trace/trace.c
@@ -22,27 +22,147 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
+#include "common.h"
+#include "modules/utils/byte.h"
#include "modules/flash/flash.h"
#include "trace.h"
+#define TRACE_CODE_START 0xF33FF22F
+#define TRACE_CODE_END 0xF44FF55F
+
+#define TRACE_ARGS_MAX 6
+#define TRACE_MAX_ARGS (TRACE_ARGS_MAX * TRACE_ARGS_MAX)
+
+struct trace_t
+{
+ /** Flash status. */
+ uint8_t flash_status;
+ /** Flash address. */
+ uint32_t flash_addr;
+ /** Flash next sector */
+ uint32_t flash_next_sector;
+};
+typedef struct trace_t trace_t;
+
static trace_t trace_global;
+
+/** Verify the stat of the next sector.
+ * If the next sector is not empty it shall send an erase command on the
+ * sector of the flash memory.
+ */
+static void
+trace_next_sector_prepare (void)
+{
+ uint32_t addr_next;
+ uint8_t data;
+ if (trace_global.flash_status)
+ {
+ addr_next = FLASH_PAGE(trace_global.flash_addr) + FLASH_PAGE_SIZE;
+ data = flash_read (addr_next);
+
+ if (data != 0XFF)
+ flash_erase (FLASH_ERASE_4K, addr_next);
+ }
+}
+
+void
+trace_print_arg_1(uint8_t arg)
+{
+ trace_print (arg);
+}
+
+void
+trace_print_arg_2(uint16_t arg)
+{
+ trace_print (arg >> 8);
+ trace_print (arg);
+}
+
+void
+trace_print_arg_4(uint32_t arg)
+{
+ trace_print (arg >> 24);
+ trace_print (arg >> 16);
+ trace_print (arg >> 8);
+ trace_print (arg);
+}
+
+
void
trace_init (void)
{
+ uint8_t i;
trace_global.flash_status = flash_init ();
/* Get the first sector to write. */
if (trace_global.flash_status)
{
trace_global.flash_addr = flash_sector_next (0);
+ trace_global.flash_next_sector =
+ FLASH_PAGE (trace_global.flash_addr + FLASH_PAGE_SIZE);
+
+ /* If the next sector is not empty erase it. */
+ trace_next_sector_prepare ();
+
+ /* Store the start code. */
+ for (i = 0; i < 4; i ++)
+ {
+ flash_write (trace_global.flash_addr,
+ v32_to_v8(TRACE_CODE_START, i));
+ trace_global.flash_addr =
+ FLASH_ADDRESS_INC(trace_global.flash_addr);
+ }
}
}
void
-trace_print_word (uint8_t arg)
+trace_uninit (void)
{
+ uint8_t i;
if (trace_global.flash_status)
- flash_write (trace_global.flash_addr++, arg);
+ {
+ /* Store the end code of traces. */
+ for (i = 0; i < 4; i ++)
+ {
+ flash_write (trace_global.flash_addr,
+ v32_to_v8 (TRACE_CODE_END, i));
+ trace_global.flash_addr =
+ FLASH_ADDRESS_INC(trace_global.flash_addr);
+ }
+ }
}
+
+void
+trace_print (uint8_t arg)
+{
+ /* Store the arg on flash */
+ if (trace_global.flash_status)
+ {
+ flash_write (trace_global.flash_addr, arg);
+ trace_global.flash_addr = FLASH_ADDRESS_INC(trace_global.flash_addr);
+ }
+
+ if ((trace_global.flash_next_sector - trace_global.flash_addr)
+ < TRACE_MAX_ARGS)
+ trace_next_sector_prepare ();
+}
+
+/** Get the current status of the trace module.
+ * \return 0x1 if the module is activate, 0x0 if the module is not active.
+ */
+uint8_t
+trace_status (void)
+{
+ return trace_global.flash_status;
+}
+
+/** Get the current address.
+ * \return addr the current address managed by the trace module.
+ */
+uint32_t
+trace_addr_current (void)
+{
+ return trace_global.flash_addr;
+}
diff --git a/digital/avr/modules/trace/trace.h b/digital/avr/modules/trace/trace.h
index 230e8ab0..d2077d66 100644
--- a/digital/avr/modules/trace/trace.h
+++ b/digital/avr/modules/trace/trace.h
@@ -80,46 +80,60 @@
#define TRACE_PRINT_ARG_TYPE(arg)\
do\
{\
- if (sizeof(arg) == sizeof(uint8_t)) TRACE_PRINT_ARG_1(arg);\
- else if (sizeof(arg) == sizeof(uint16_t)) TRACE_PRINT_ARG_2(arg);\
- else if (sizeof(arg) == sizeof(uint32_t)) TRACE_PRINT_ARG_4(arg);\
+ if (sizeof(arg) == sizeof(uint8_t)) trace_print_arg_1(arg);\
+ else if (sizeof(arg) == sizeof(uint16_t)) trace_print_arg_2(arg);\
+ else if (sizeof(arg) == sizeof(uint32_t)) trace_print_arg_4(arg);\
}while (0)
-#define TRACE_PRINT_ARG_1(arg)\
- ({trace_print_word(arg);})
-
-#define TRACE_PRINT_ARG_2(arg)\
- ({ trace_print_word(arg >> 8);\
- trace_print_word(arg);})
-
-#define TRACE_PRINT_ARG_4(arg)\
- ({ trace_print_word (arg >> 24);\
- trace_print_word (arg >> 16); \
- trace_print_word (arg >> 8); \
- trace_print_word (arg);})
+/** Print an argument of one byte.
+ * \param arg the one byte argument to print.
+ */
+void
+trace_print_arg_1(uint8_t arg);
+/** Print an argument of two bytes.
+ * \param arg the two bytes argument.
+ */
+void
+trace_print_arg_2(uint16_t arg);
-struct trace_t
-{
- /** Flash status. */
- uint8_t flash_status;
- /** Flash address. */
- uint32_t flash_addr;
- /** Flash next sector */
- uint32_t flash_next_sector;
-};
-typedef struct trace_t trace_t;
+/** Print an argument of four bytes.
+ * \param arg the four bytes argument.
+ */
+void
+trace_print_arg_4(uint32_t arg);
/** Initialise the trace module.
+ * Find the first sector writable and store the following start code
+ * 0xF33FF22F this indicate the beginning of traces.
*/
void
trace_init (void);
+/** Ends the trace.
+ * Store at the next address the following ending code 0xF44FF55F to end
+ * traces.
+ */
+void
+trace_uninit (void);
+
/** Print the trace.
* \param arg the argument to print.
*/
void
-trace_print_word (uint8_t arg);
+trace_print (uint8_t arg);
+
+/** Get the current status of the trace module.
+ * \return 0x1 if the module is activate, 0x0 if the module is not active.
+ */
+uint8_t
+trace_status (void);
+
+/** Get the current address.
+ * \return addr the current address managed by the trace module.
+ */
+uint32_t
+trace_addr_current (void);
#endif /* trace_h */