Arduino: detektera att firmware flashats om
Postat: 10 februari 2016, 17:11:44
Är det möjligt på nåt sätt? Jag har en reboot-counter i EEPROM som jag gärna skulle nolla varje gång mjukvaran laddats in igen.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
#include <stdint.h>
#include <stdbool.h>
#include "sha256.h"
typedef struct {
uint32_t startAddr;
uint16_t length;
bool calcHash;
} flashPage_t;
#define NUMBER_OF_FLASH_PAGES 16
static const flashPage_t flashTable[NUMBER_OF_FLASH_PAGES] = {
{ 0x08000000, 0x800, FALSE }, // Bootloader
{ 0x08000800, 0x800, FALSE }, // Bootloader
{ 0x08001000, 0x800, TRUE },
{ 0x08001800, 0x800, TRUE },
{ 0x08002000, 0x800, TRUE },
{ 0x08002800, 0x800, TRUE },
{ 0x08003000, 0x800, TRUE },
{ 0x08003800, 0x800, TRUE },
{ 0x08004000, 0x800, TRUE },
{ 0x08004800, 0x800, TRUE },
{ 0x08005000, 0x800, TRUE },
{ 0x08005800, 0x800, TRUE },
{ 0x08006000, 0x800, TRUE },
{ 0x08006800, 0x800, TRUE },
{ 0x08007000, 0x800, TRUE },
{ 0x08007800, 0x800, FALSE } // Parameters
};
static void calcHash(void) {
SHA256_CTX ctx;
uint8_t flashHash[32];
uint8_t eepromHash[32];
uint32_t i;
SHA256_init(&ctx);
for(i = 0; i < NUMBER_OF_FLASH_PAGES; i++) {
if(flashTable[i].calcHash) {
SHA256_update(&ctx, (uint8_t*)flashTable[i].startAddr, flashTable[i].length);
}
}
SHA256_final(&ctx, flashHash);
eepromRead(eepromHash, 32);
for(i = 0; i < 32; i++) {
if(flashHash[i] != eepromHash[i]) {
eepromResetBootCounter();
break;
}
}
}