Arduino: detektera att firmware flashats om

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Arduino: detektera att firmware flashats om

Inlägg av JanErik »

Ä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.
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: Arduino: detektera att firmware flashats om

Inlägg av LHelge »

Spara en checksumma av flash i EEPROM och nolla räknaren om den ändras.
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: Arduino: detektera att firmware flashats om

Inlägg av LHelge »

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.

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;
    }
  }
}
variabeln flashHash innehåller här 32 bytes som med allra största sannolikhet uppdateras om du laddar ny mjukvara.
Skriv svar