MMC/SD Bootloader für AT Mega

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Beschreibung

Dieser Bootloader wird einmalig, z. B. per PonyProg, STK500, etc., in einen AVR Atmega geschrieben. Ab nun kann das Hauptprogramm mit Hilfe einer SD oder MMC Speicherkarte in den µC geschrieben werden. Um sicherzustellen dass das Gerät mit dem richtigen Update beschrieben wird, wird im Hauptprogramm mit Hilfe einer Section am Ende des Hauptprogramms eine eindeutige Hardware-ID, eine Software-Versionsnummer und eine Prüfsumme hinterlegt. Zum Aktualisieren des Hauptprogrammes wird im selbigen die Versionnummer erhöht, kompiliert, und mit einem kleinen Kommandozeilen-Tool die CRC berechnet und in die Datei geschrieben. Diese Datei wird dann auf eine Speicherkarte kopiert, an den µC angeschlossen, und der µC resettet.

Ausstattung

  • Passt in 2 kB Bootsection, also z. B. auch für Atmega8 geeignet
  • Liest von MMC und SD Karten mit oder ohne MBR, die mit FAT16 oder FAT12 formatiert sind
  • Anhand einer 4 Byte langen Kennung, die im Bootloader und im Hauptprogramm hinterlegt ist, wird die passende Datei auf der Karte geladen. So ist es möglich Updates für verschiedene Geräte gleichzeitig auf der Karte zu haben
  • CRC Überprüfung der eingespielten Software
  • Ohne Änderung an Geräten, die nur einen ISP Stecker haben verwendbar. Der CS Pin der Karte wird in diesem Fall auf GND gelegt.
  • Optional: Status-LED. Diese wird beim Start des Bootloaders aktiviert, flackert während eines Aktualisierungsvorgangs und verlischt schließlich, wenn die CRC-Prüfung erfolgreich war und das Hauptprogramm gestartet wird.

Erstellen und Anpassen

Bootloader

Der Bootloader muss zunächst an den verwendeten µC angepasst werden. Dazu öffnet man zunächst das makefile des Bootloaders und passt diesen Ausschnitt an:

DEVID = 0x12345678
TARGET = bootloader
BOOTLOADERSTARTADR = 0x3800
BOOTLDRSIZE = 0x800

Bei der DEVID handelt es sich um eine eindeutige Hardware-Kennung, die für jedes Gerät eindeutig vergeben werden muss. BOOTLOADERSTARTADR ist die Adresse, auf der der Bootloader liegt, im obigen Beispiel für einen ATMega 16. Dieser hat 16384 Bytes Flash, davon wird die Größe des Bootloaders (2048 Bytes) abgezogen und man erhält 14336 = 0x3800.

Nun muss noch in mmc_lib.h angegeben werden, wo die Speicherkarte angeschlossen ist:

#define MMC_PORT PORTB
#define MMC_DDR DDRB

#define SPI_MISO	PB3		//DataOut of MMC 
#define SPI_MOSI	PB6		//DataIn of  MMC
#define SPI_CLK  	PB7		//Clock of MMC
#define MMC_CS		PB4		//ChipSelect of MMC

Für CS der Speicherkarte sollte der SS Pin des µC verwendet werden. Der SS Pin muss sowieso auf Ausgang und Low gesetzt werden, weil sonst der SPI Master nicht funktioniert.

Hauptprogramm

Im Hauptprogramm müssen folgende Angaben an entsprechender Stelle im makefile gemacht werden:

FORMAT = binary
DEVID = 0x12345678
SWVERSIONMAJOR = 1
SWVERSIONMINOR = 0
BOOTLDRSIZE = 0x800
#FLASHSIZE - BOOTLDRSIZE - 8
BOOTLDRINFOSTART = 0x37F8
CDEFS += -DDEVID=$(DEVID)
CDEFS += -DSWVERSIONMAJOR=$(SWVERSIONMAJOR)
CDEFS += -DSWVERSIONMINOR=$(SWVERSIONMINOR)
LDFLAGS	+= -Wl,--section-start=.bootldrinfo=$(BOOTLDRINFOSTART)

Das Format muss zwingend auf binary gesetzt werden. Die DEVID muss mit der des Bootloaders übereinstimmen. Mit SWVERSIONMAJOR und SWVERSIONMINOR wird die Softwareversionsnummer eingestellt. Der Bootloader schreibt das Hauptprogramm nur dann, wenn die Versionnummer auf der Karte größer als im Flash ist. BOOTLDRINFOSTART ist die Adresse, auf der der Informationsblock (DEVID, Version, CRC) landet. Das Beispiel bezieht sich ebenfalls auf den ATMega16: 16384 Flash - 2048 Bootloader - 8 Bytes Info = 14328 = 0x37F8.

In main.c wird der Infoblock deklariert:

typedef struct
{
	unsigned long dev_id;
	unsigned short app_version;
	unsigned short crc;
} bootldrinfo_t;

const bootldrinfo_t bootlodrinfo __attribute__ ((section (".bootldrinfo"))) = {DEVID, SWVERSIONMAJOR << 8 | SWVERSIONMINOR, 0x0000};

Nun kann das Hauptprogramm compiliert werden. Die entstehende .hex Datei (binary Format!) wird anschließend noch mit dem Kommandozeilentool crcgen.exe behandelt (z. B. crcgen myflashfile.hex). Der Aufruf dieses Programmes kann auch vom makefile aus geschehen.

Das Update benennt man am besten etwa in der Form MeinApparat-v1.0-bin, darf aber beliebig (lang) sein .

Einschränkungen

  • Der Bootloader unterstützt nur FAT12 (Partitionstyp 1) und FAT16 (Partitionstyp 6). Große Karten die mit FAT32 formatiert wurden sind nicht geeignet, und müssen zunächst mit FAT16 formatiert werden.
  • Das Update muss im Hauptverzeichnis der Speicherkarte liegen.

Download und Diskussion

Der Sourcecode findet sich in der Codesammlung unter http://www.mikrocontroller.net/topic/67047#new Immer schön runterscrollen um die brandneueste Version zu erwischen!

Danke

an

  • Jörg
  • holger
  • Werner B.
  • Hagen Re

für die Codeoptimierung. So konnte die ursprüngliche Fassung, in der nur FAT16 implementiert war, um FAT12 erweitert werden.