Forum: Mikrocontroller und Digitale Elektronik NXP LPC1788 kompilieren | Valid User Code Checksum


von M. Н. (Gast)


Lesenswert?

Hallo Leute,

ich habe ein Board mit einem LPC1788 drauf. Im Normalfall benutze ich 
die LPCxpresso IDE, die ich eigentlich recht schick finde (wäre da nicht 
das Debuglimit von (mittlerweile) 256k :/ ).

Wollte mir mit Eclipse und dem gcc-arm-none-eabi eine IDE selber basteln 
(hat für den STM32F4 bereits super funktioniert, bis auf ein paar Bugs 
mit dem Jlink-Plugin).

Ich habe mich also eine Weile durch Datenblätter/User Guides gewälzt.
Mir ist folgendes aufgefallen:

Sowohl bei ARM, also auch in den Dokumenten von NXP steht, dass der 
interne Bootloader einen Checksum der Vektortabelle überprüft. Diese 
befindet sich an Adresse 0x1C im Flash. Ohne diese Checksum, wird der 
Code als invalide eingestuft und der Bootloader startet ihn nicht.

Ist das korrekt?

Ebenfalls hab ich mich durch die Makefiles von LPCxpresso und durch das 
Startup- und Linkerskript geklickt.
Mir ist aufgefallen, dass im Startup Code die Vektortablle an der Stelle 
7 (Adresse 0x1C) auf 0 gesetzt ist mit dem Kommentar "Reserved".
Auch im Linkerskript und im Makefile taucht nichts auf, was auf eine 
Prüfsumme an dieser Stelle hinweist.

Ich habe irgendwo im Internet gelesen, dass das ELF/AXF-File nach dem 
Build noch duch ein extra Programm gejagt wird, welches dann die 
Prüfsumme "reinpatcht".
Das Makefile enthält aber keinen Befehl dazu.


Ich finde das sehr merkwürdig und verstehe das nicht. (Der Compiler kann 
die Prüfsumme ja auch nicht reinmachen, da er nur weiß, dass es sich um 
einen Cortex M3 handelt und nicht weiß, dass er von NXP ist, oder?

Das Projekt kompiliert in LPCXpresso und ist auch funktionsfähig.

Mein letzter Ansatz wäre, dass sowohl der interne Bootloader, als auch 
der Segger Jlink beim programmieren diese Checksum "on the fly" 
einbauen.

Kann mir dazu jemand was sagen?
Die Informationen die man so findet sind leider so zerstückelt...

Vielen Dank

M.H.

von Jim M. (turboj)


Lesenswert?

M. H. schrieb:
> Mein letzter Ansatz wäre, dass sowohl der interne Bootloader, als auch
> der Segger Jlink beim programmieren diese Checksum "on the fly"
> einbauen.

Segger JLink flasher: Ja, Checksumme wird korrigiert.
Bootloader: Nein!

Für den seriellen Bootloader braucht es aber auch ein Programm zur 
Steuerung, welches dann normalerweise auch die Checksumme berechnen 
kann.

Wenn man den in einigen NXP LPC vorhandenen USB-Mass Storage ROM 
Bootloader verwendet (keine Ahnung ob der im LPC1788 vorhanden ist), 
muss man die Checksumme vorher mit einem Tool berechnen lassen.

Ein Beispiel ist im Code der R0ket (https://github.com/r0ket/r0ket) in 
der tools/bootloader/lpcfix.c Datei.

von M. Н. (Gast)


Lesenswert?

OK

Vielen Dank :)

von temp (Gast)


Lesenswert?

M. H. schrieb:
> OK
>
> Vielen Dank :)

Wenn du mal eine Demoversion von Crossworks installierst, ist da das 
Programm Crossscript enthalten. Das kann per js elf-Dateien patchen. 
Dazu habe ich folgenden kurzen js-Code:

LPC1000_LinkPatch.js:
1
function patch(filename)
2
{
3
  backupFilename = filename + ".prepatch";
4
  CWSys.removeFile(backupFilename);
5
  CWSys.renameFile(filename, backupFilename);
6
  ElfFile.load(backupFilename);
7
  crc = 0;
8
  for (i = 0x00; i < 0x1C; i += 4)
9
    crc += ElfFile.peekUint32(i);
10
  ElfFile.pokeUint32(0x1C, ~crc + 1);
11
  ElfFile.save(filename);
12
}

und rufe das aus einer patchlpc.bat so auf:

call i:\tools\crossscript.exe 
"load(\"i:/tools/LPC1000_LinkPatch.js\");patch(\"%1\");"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.