 |
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 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.
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:
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:
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.
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.
Download
|