From e15619e199eed4a40aa401f1f6db8c1d81d87c65 Mon Sep 17 00:00:00 2001 From: Nélio Laranjeiro Date: Mon, 10 Nov 2008 21:10:26 +0100 Subject: 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. --- digital/avr/modules/trace/avrconfig.h | 4 +- digital/avr/modules/trace/trace.c | 124 +++++++++++++++++++++++++++++++++- digital/avr/modules/trace/trace.h | 66 +++++++++++------- 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 */ -- cgit v1.2.3