From 7d0022a22df3e472fcacc2ba41f1e58717c60172 Mon Sep 17 00:00:00 2001 From: Christian Kroll Date: Sun, 7 Sep 2014 21:06:25 +0200 Subject: [PATCH] persistentCounter.c etc.: made the persistent counter more versatile, it is not limited to hard reset counts anymore --- src/display_loop.c | 3 +- src/main.c | 4 +- src/random/persistentCounter.c | 108 +++++++++++++++++---------------- src/random/persistentCounter.h | 15 +++-- src/uart/uart_commands.c | 2 +- 5 files changed, 71 insertions(+), 61 deletions(-) diff --git a/src/display_loop.c b/src/display_loop.c index cda97a0..58ff68f 100644 --- a/src/display_loop.c +++ b/src/display_loop.c @@ -94,7 +94,8 @@ void display_loop(){ #ifdef RANDOM_SUPPORT { char a[28]; - sprintf(a,"B08_23), 0x0000); + for (i = 0; i < RING_SIZE; ++i) { eeprom_busy_wait(); - eeprom_write_byte(&(B0_7[i]), 0x00); + eeprom_write_byte(&(percnt->B0_7[i]), 0x00); } } #endif -void percnt_init(void){ +void percnt_init(percnt_t *percnt, uint8_t *ring_index) { uint8_t i; - uint8_t maxidx=0; - uint8_t t,max=eeprom_read_byte(&(B0_7[0])); - #ifdef INIT_EEPROM - if (eeprom_read_word(&B08_23)==0xFFFF){ /* test if the 2 MSB == 0xFFFF*/ - if (eeprom_read_word((uint16_t*)&(B0_7[0]))==0xFFFF) /* test the first to bytes of ringbuffer*/ - init_buffer(); - } - #endif - for(i=0; iB0_7[0])); +#ifdef INIT_EEPROM + /* test if the 2 MSB == 0xFFFF */ + if (eeprom_read_word(&(percnt->B08_23)) == 0xFFFF) { + /* test the first two bytes of ringbuffer */ + if (eeprom_read_word((uint16_t*) &(percnt->B0_7[0])) == 0xFFFF) + init_buffer(percnt, ring_index); + } +#endif + /* might be faster, but such optimizations are prone to timing attacks */ + for (i = 0; i < RING_SIZE; ++i) { eeprom_busy_wait(); - t=eeprom_read_byte(&(B0_7[i])); - if(t==max+1){ - max=t; - maxidx=i; + t = eeprom_read_byte(&(percnt->B0_7[i])); + if (t == max + 1) { + max = t; + maxidx = i; } } - ring_idx = (maxidx==RING_SIZE)?0:maxidx; + *ring_index = (maxidx == RING_SIZE) ? 0 : maxidx; } -uint32_t percnt_get(void){ - uint32_t ret=0; +uint32_t percnt_get(percnt_t *percnt, uint8_t *ring_index) { + uint32_t ret = 0; - if(ring_idx==0xff) - percnt_init(); + if (*ring_index == 0xff) + percnt_init(percnt, ring_index); cli(); eeprom_busy_wait(); - ret=eeprom_read_word(&B08_23)<<8; + ret = eeprom_read_word(&(percnt->B08_23)) << 8; eeprom_busy_wait(); - ret |= eeprom_read_byte(&(B0_7[ring_idx])); + ret |= eeprom_read_byte(&(percnt->B0_7[*ring_index])); sei(); return ret; } -void percnt_inc(void){ +void percnt_inc(percnt_t *percnt, uint8_t *ring_index) { /* we must make this resistant agaist power off while this is running ... */ uint32_t u; - - if(ring_idx==0xff) - percnt_init(); - u = percnt_get(); + if (*ring_index == 0xff) + percnt_init(percnt, ring_index); + + u = percnt_get(percnt, ring_index); cli(); /* it's important to write msb first! */ - if((u&0x000000ff) == 0xff){ - if((u&0x0000ffff) == 0xffff){ - if((u&0x00ffffff) == 0xffffff){ + if ((u & 0x000000ff) == 0xff) { + if ((u & 0x0000ffff) == 0xffff) { + if ((u & 0x00ffffff) == 0xffffff) { /* we can turn the lights off now. it's time to die */ - #ifdef ERROR_HANDLING +#ifdef ERROR_HANDLING error(PERSISTENT_COUNTER_OVERFLOW); - #endif +#endif } eeprom_busy_wait(); - eeprom_write_byte(&(((uint8_t*)&B08_23)[1]),((u+1)>>16)&0xff); + eeprom_write_byte(&(((uint8_t*) &(percnt->B08_23))[1]), + ((u + 1) >> 16) & 0xff); } eeprom_busy_wait(); - eeprom_write_byte(&(((uint8_t*)&B08_23)[0]),((u+1)>>8)&0xff); + eeprom_write_byte(&(((uint8_t*) &(percnt->B08_23))[0]), + ((u + 1) >> 8) & 0xff); } /* set least significant byte (in ringbuffer) */ - ring_idx = (ring_idx+1)%RING_SIZE; + *ring_index = (*ring_index + 1) % RING_SIZE; eeprom_busy_wait(); - eeprom_write_byte(&(B0_7[ring_idx]),(u+1)&0xff); + eeprom_write_byte(&(percnt->B0_7[*ring_index]), (u + 1) & 0xff); eeprom_busy_wait(); - - if(u+1 != percnt_get()){ - #ifdef ERROR_HANDLING + + if (u + 1 != percnt_get(percnt, ring_index)) { +#ifdef ERROR_HANDLING error(PERSISTENT_COUNTER_WRITER_ERROR); - #endif +#endif } - + sei(); } diff --git a/src/random/persistentCounter.h b/src/random/persistentCounter.h index 386fcd6..9e64140 100644 --- a/src/random/persistentCounter.h +++ b/src/random/persistentCounter.h @@ -9,15 +9,22 @@ #ifndef PERSISTENTCOUNTER_H_ #define PERSISTENTCOUNTER_H_ - #include +#include "../compat/eeprom.h" #define PERSISTENT_COUNTER_BITS 24 +#define RING_SIZE 168 -void percnt_init(void); -uint32_t percnt_get(void); -void percnt_inc(void); +typedef struct percnt_s { + uint16_t B08_23; + uint8_t B0_7[RING_SIZE]; +} percnt_t; +extern uint8_t g_reset_counter_idx; +extern percnt_t g_reset_counter EEMEM; +void percnt_init(percnt_t *percnt, uint8_t *ring_index); +uint32_t percnt_get(percnt_t *percnt, uint8_t *ring_index); +void percnt_inc(percnt_t *percnt, uint8_t *ring_index); #endif /*PERSISTENTCOUNTER_H_*/ diff --git a/src/uart/uart_commands.c b/src/uart/uart_commands.c index 877535e..f898b50 100644 --- a/src/uart/uart_commands.c +++ b/src/uart/uart_commands.c @@ -227,7 +227,7 @@ static void uartcmd_read_mode(void) { /** * Perform a MCU reset by triggering the watchdog. */ -static void uartcmd_reset_borg() { +static void uartcmd_reset_borg(void) { timer0_off(); }