Arduino: detektera att firmware flashats om
Arduino: detektera att firmware flashats om
Ä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.
Re: Arduino: detektera att firmware flashats om
Spara en checksumma av flash i EEPROM och nolla räknaren om den ändras.
Re: Arduino: detektera att firmware flashats om
Gjorde en liknande grej förra veckan för en Cortex-M0 där jag räknar ut en SHA256 hash av delen av flash som används för applikationskod.
Använde denna kod för att räkna fram SHA256 hashar:
http://bradconte.com/sha256_c
Något liknande detta gjorde jag. Fritt från minnet så med reservation för fel.
variabeln flashHash innehåller här 32 bytes som med allra största sannolikhet uppdateras om du laddar ny mjukvara.
Använde denna kod för att räkna fram SHA256 hashar:
http://bradconte.com/sha256_c
Något liknande detta gjorde jag. Fritt från minnet så med reservation för fel.
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;
}
}
}