Quote by Lschreyer
Ich habe eine Frage zur DownLoaderID beim Flashloader oder BootID beim FAT Bootloader.
Beim Flashloader heißt es:
Die Konstante DownLoaderID muss vorhanden sein und muss in der BootApplication und in der
downloadbaren Main identisch sein.
In der Doku zum Flashloader steht, dass man im Programm ein
"const
// this constant must be the same as in the Main app
DownLoaderID : word = $1234; // mandatory constant
"
stehen haben muss.
Beim FAT Bootloader gibt es die DownloadID nicht, da gibt es stattdessen die
function UpdateFirmware(BootID : word) : boolean;
Ich gehe davon aus, das hier BootID = DownloaderID ist?
Wie definiere ich die "BootID" im zu ladenden Programm für den FAT Loader?
Was passiert wenn er nicht identisch ist? Bricht der Loader dann ab?
Ist es möglich vom FAT Bootloader her die ID des zu ladenden DLD auszulesen und ggf. eine Fehlermeldung (Sowas wie: "Ungültige Programmversion") auszugeben?
Hallo Lschreyer,
hast Du Dir schon mal die Demos dazu angeschaut?
Die meisten Antworten Deiner Fragen sind in den Demos enthalten.
Schau Dir die Demo-Projekte mal an, das ist recht gut erklärt.
Mein SD-Bootloader ist etws umfangreicher, da ich noch mein LCD-Display in der BootApp ansteuere.
Hier mal ein paar Schnippsel zur Fehlerabfrage:
Code
...
procedure CheckError;
begin
if BootErr = bootNoErr then OutStr:= '00 no Error'; // Keine Fehler alles OK
elsif BootErr = bootInvCardType then OutStr:= '01 inv.Card Type'; // Falscher SD-Card Typ
elsif BootErr = bootInvBootType then OutStr:= '02 inv. Boot Type';
elsif BootErr = bootReadFail then OutStr:= '03 read Fail'; // Lesefehler
elsif BootErr = bootClusterNotfound then OutStr:= '04 Cluster not Found';// Cluster Fehler evtl. defekte Firmwaredatei oder SDCard
elsif BootErr = bootFalseID then OutStr:= '05 wrong ID'; // Falsche LoaderID
elsif BootErr = bootFalseCPU then OutStr:= '06 wrong CPU'; // Firmware nicht für diese CPU geeignet
elsif BootErr = bootAESerr then OutStr:= '07 AES Error'; // AES entschlüsselungsfehler
endif;
PrintString('ERR:'+OutStr,4,1); // LCD-Ausgabe Fehler
loop
// gehe in Wartestellung und mache nichts weiter
endloop;
end CheckError;
Code
...
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
// Optional a port pin can be checked for a forced download
// If Pin.x = false then skip the EEprom checks
// ...
Debug_Break;
if EEprom[EEpromEnd] = $00 then
// If a Download failed or the app was never programmed then there is no $00
// If the main app forces a download then the last byte in the EEprom must be $FF
Application_Startup;
endif;
Debug_Break;
// Nur Init, wenn der Flash gemacht werden soll..
// InitPort
WDOff; // Schalte Hardware WatchDog AUSF !!!
//HxDispData Define für Data-Pin LCD-Display
DDRE.2:= 1; // 0=EINGANG 1=Ausgang
I2CInit; // Init für LCD-Beleuchtung EIIN und Tastenabfrage
// Ziehe Pointer für LCD-CHARS
ptrLoadChars := @gLoadChars;
// LCD aktivieren
LCDInit;
//Start-Meldung
PrintString('Mein XYZ-Bootloader V1.01',1,1);
// mDelay(10000);
// at first check the Card detect switch, if present!
// if ...
// Initialize the MMC and check for a valid FAT16 file system
if not FATInit then
// big problem !!
CheckError;
endif;
{$IfDef FAT_bootModeAES}
AES_Init(@DecryptKey); // necessary if AES encryption is used
{$endif}
// Firmwareupdate einleiten
PrintString('Flash Firmware...',3,1); // Ausgabe LCD-Display
// This reads the UpdateFile and flashes it into the application area.
// If selected then also EEprom and UserRow are reprogrammed.
// The filename can have upto 8 chars, the extension must be ".dld"!
// The extension must not be included and is always ".dld"
if not UpdateFirmware($1234) then // BootLoader ID
// es gab einen Fehler
CheckError; // Fehlerabfrage
endif;
...