/************************************************************/ /* Spidcom Technologies FILE NAME : boot_stats.c DESCRIPTION : boot stats management HISTORY : -------------------------------------------------------------- DATE | AUTHOR | Version | Description -------------------------------------------------------------- 05/10/05 | Petillon | 1.0 | Creation */ /************************************************************/ #include #include #include #include "flash_device.h" #include "platform.h" #include "bootloader.h" #include "boot_stats.h" #define MAGIC_LEN (16) #define MAGIC_KEY "SPIDCOMMAGICKEY " caddr_t boot_stats_addr; typedef struct { uint32_t boot; uint32_t manual_reset; uint32_t failure_reset; char magic[MAGIC_LEN]; } boot_counters_t; static void store_boot_stats(boot_counters_t *boot_counters) { int flash_result; caddr_t address; size_t size; address = (caddr_t )boot_stats_addr; size = sizeof(boot_counters_t); if ((flash_result=flash_get_area(flash_device,&address, &size))>=0) { if ((flash_result=flash_unlock_blocks(flash_device,address, size))>=0) { if ((flash_result=flash_erase_blocks(flash_device,address, size))>=0) { if ((flash_result=flash_write_area(flash_device, (caddr_t )boot_stats_addr, (caddr_t)boot_counters, sizeof(boot_counters_t)))>=0) flash_lock_blocks(flash_device, address, size); } } } } void boot_stats_init(caddr_t upper_addr) { size_t size; boot_counters_t boot_counters; size = sizeof(boot_counters_t); boot_stats_addr = upper_addr-size; flash_get_area(flash_device, &boot_stats_addr, &size); memcpy(&boot_counters,(boot_counters_t*)boot_stats_addr,sizeof(boot_counters_t)); if (strncmp(boot_counters.magic,MAGIC_KEY,MAGIC_LEN) || boot_counters.manual_reset>boot_counters.boot || boot_counters.failure_reset>boot_counters.boot) { // reset counters strncpy(boot_counters.magic,MAGIC_KEY,MAGIC_LEN); boot_counters.boot = 0; boot_counters.manual_reset = 0; boot_counters.failure_reset = 0; } // increment boot count boot_counters.boot++; if (!strncmp(BOOT_MAGIC_ADDR,HOT_BOOT_MAGIC_KEY,BOOT_MAGIC_LEN)) boot_counters.failure_reset++; strncpy(BOOT_MAGIC_ADDR,HOT_BOOT_MAGIC_KEY,BOOT_MAGIC_LEN); store_boot_stats(&boot_counters); }