Andreas Weschenfelder, AVR, ATMEGA, PSoC, ARM, LPC2148, FPGA, SPARTAN 3E, PC, Programmierung Bootloader für den LPC2148

Einführung

Der LPC2148 besitzt zwar einen internen Bootloader (über RS232), allderings wäre es wünschenswert auch über USB Programme in den LPC2148 zu laden.


Memory Map

Anbei das Memory Map für den LPC214x. Beim LPC2148 liegt der Flashbereich in den ersten 512KB (0x0.0000-0x7.FFFF). Das SRAM beginnt ab der Adresse 0x4000.0000 und ist 32KB groß (0x4000.7FFF). Des weiteren ist zum Verständnis der Bootloader-Bereich (nxp-Bootloader) wichtig: er liegt an der Adresse 0x7FFF.E000 und endet auf 0x7FFF.FFFF.

Memory Map

Memory Re-Mapping

An den ersten Adressen eines Programms (0x00-0x40) stehen die Exception Vectors. Die sind die Sprungadressen für den Reset-, Interrupt- oder Fehlerfall. Damit alle Programme im Flash -egal an welcher Stelle im Flash es steht- die Exception Vectors nutzen können, sind diese remappbar. Sinnvoll für den Nutzer sind dabei vor allem 3 Ziele: Den Anfang des ROMs, RAMs und des NXP-Bootloaders.

Memory Mapping

IAP - In Application Programming

Die IAP-Funktion ist im NXP-Bootloaderbereich des LPC2148 integriert. Sie ist über einen Funktionspointer (Adresse: 0x0x7ffffff1) erreichbar. Der Funktion werden der Command-Code sowie eine Variable für den Rückgabewert der IAP-Funktion. Die PLL muss während dem Aufruf der IAP-Funktion deaktiviert sein! Dies könnte folgendermaßen aussehen:

Memory Map

Der CommandCode ist wie folgt definiert:
  - PREPARE_SECTOR_FOR_WRITE_OPERATION = 50
  - COPY_RAM_TO_FLASH = 51
  - ERASE_SECTOR = 52
  - BLANK_CHECK_SECTOR = 53
  - READ_PART_ID = 54
  - READ_BOOT_CODE_VERSION = 55
  - COMPARE = 56

Die Parameter und Rückgabewert für die IAP-Funktion können dem User Manual entnommen werden:
Chapter 21: flash memory system and programming - IAP commands


Beschreibung Bootloader

Bootloader-Firmware (Linker-File, Hex-File)

Damit die BL-Firmware die Exception-Tabelle der BL-Applikation an den Anfang des RAMs kopieren kann, ohne eigene Daten zu überschreiben, müssen die unteren 0x40 für die BL-Firmware gesperrt werden.

Hex-File

Das INTEL Hex-Format dient zum Übertragen von binären Daten z.B. über eine serielle Schnittstelle. Die Daten werden dabei ASCII-codiert, so dass die Übertragung nur aus druckbaren Zeichen besteht. Die Daten werden in Blocks aufgeteilt und übertragen. Ein Block im INTEL Hex-Format hat folgenden Aufbau:

MAP-File

Jeder Kasten in der Grafik steht für ein Byte. Vor der ersten Startmarkierung dürfen beliebig viele Füllzeichen stehen. Zwischen der Prüfsumme und der nächsten Startmarkierung können ebenfalls beliebig viele Füllzeichen stehen; in der Regel sind dies CR und LF.

"n" bedeutet, dass dieses Byte eine ASCII-codierte Hex-Ziffer enthält, also eines der Zeichen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

Die einzelnen Teile des Records haben folgenden Bedeutung:

Datenlänge Gibt die Anzahl der Datenbytes an.
Adresse Adresse (16 Bit), an die die Daten dieses Records geschrieben werden sollen. Ist dem Datensatz ein erweiterter Address-Record (vgl. unten) vorausgegangen, ist diese Adresse auf die durch den erweiterten Address-Record angegebene Basis-Adresse zu addieren.
Record-Typ
00: Der Record enthält Daten.
01: Dies ist der letzte Record der Übertragung.
02: Erweiterter Segment-Address-Record, d.h. das Adressfeld enthält 0 und die Daten geben eine Segment-Adresse an, wie sie z.B. beim 8086 verwendet wird. Die nachfolgenden Daten-Records sind in dieses Segment zu laden.
03: Start-Segment-Address-Record, d.h. das Adressfeld enthält 0 und die Daten geben den Einsprungpunkt für die Programmausführung als CS:IP an.
04: Erweiterter Linear-Address-Record, d.h. das Adressfeld enthält 0 und die Daten geben die oberen 16 Bit einer 32-bit Linear-Adresse an, ab der die folgenden Daten-Records zu laden sind.
05: Start-Linear-Address-Record, d.h. das Adressfeld enthält 0 und die Daten geben den Einsprungpunkt für die Programmausführung als EIP an.
Daten Die Datenbytes (immer 2 übertragene Bytes ergeben ein Datenbyte).
Prüfsumme Das 2er-Komplement der Modulo-256-Summe über alle vorangegangenen Bytes außer der Startmarkierung. Bildet man also die Modulo-256-Summe über alle Bytes außer der Startmarkierung, muss sich bei korrekter Übertragung 0 ergeben (Empfangsprüfung). Anm.: Das 2er-Komplement wird gebildet, indem man alle Bits des Bytes invertiert und dann 1 addiert.


Applikation-Firmware (Linker-File, Memory-Map)

1. Abschnitt Memory im Linker-Script der mittles Bootloader zu übertragenen Anwendung so anpassen, dass Origin für Flash/ROM die erste Addresse ist, die vom Bootloader veschrieben wird. Length um diesen Offset verringern für die Prüfung auf Größenüberschreitung.

2. Ebenfalls im Abschnitt Memory für RAM die Origin so anpassen, dass diese hinter dem 'remappbaren' Speicherbereich liegt (0x40 Bytes). Length entsprechend verringern.

Memory Bereich Applikation

3. Code an den ersten Speicherstellen des Anwenderprogramms für Vektoren weiter im üblichen verschiebbare Aufbau mit LDR von PC für die Core Vectoraddressen gefolgt von den eigentliche Sprungzielen als Konstanten (.word).

4. Startup um eine Kopierroutine ergänzen, die 0x40 Bytes vom Start des Anwendungsprogramms (0x3000) an den Start des RAMs kopiert (0x40000000). Dann Remapping aktivieren. [Wenn die Bootloader-Firmware den RAM-Bereich 0x40000000-0x40000040 nicht nutzt, kann dies auch in der Bootloader-Firmware gemacht werden, bevor an die Adresse 0x3000=Start der Bootloader-Applikation gesprungen wird]

MAP-File

Im Map-File der Bootloader-Applikation kann die richtige Positionierung des RAM- und ROM-Speicher überprüft werden. Gut erkennbar ist, dass die Applikation ab Adresse 0x3000 beginnt.

MAP-File

Download

 
• http://wesche.we.ohost.de/ •