Hallo
hat schon jemand den Bootloader hier zum Laufen gekriegt?
http://www.recherche.enac.fr/paparazzi/wiki/index.php/DevGuide/USBDownload
hab das ganz mal für winarm portiert. allerdings habe ich probleme
damit, die ram-version zu erzeugen... hat das schon jemand gemacht?
den firmware-upgrader von tnkernel kenne ich zwar, allerdings ist er so
in den kernel eingebunden, dass mir schwer fällt, ihn ohne das os zu
benutzen...
vielleicht gibts ja auch noch weitere alternativen?
Ich hab mir beim tnkernel bootloader das Prinzip abgeschaut,
und ein eigenes Kommunikations- und Update-Protokoll draufgesetzt.
Ganz ohne tnkernel Kram.
Ist im nicht so wild.
Die IAP Routinen und die Exception-Vektor-Verbiegerei sind
schon das Wesentliche. Oder solls auch über USB sein?
Was ich damit sagen wollte... warum compilierst du ihn dir denn
nicht selbst? Sonst kannst du damit doch eh nichts anfangen, wenn
die Applikation, die du noch schreiben willst nicht dazu "paßt".
Einsprungadresssen, etc.
Ich bin gerade dabei mir meinen eingenen Bootloader zusamemn zu
stricken: Die IAP funktionen konnte ich alle erfolgreich integerieren.
Der Bootloader befindet sich in den Sektoren 1-2.
Zum Testen habe ich folgendes versucht: Ab 0x3000 wird eine
Bsp.-Applikation in den Flash geschrieben. (Startup-file, linker-file
aus winarm => beginnt bei Adresse 0; keine Interrupts verwendet). Nun
springe ich über die Vectortabelle am Anfang des Codes (0x3020).
-> Folge: der LPC bleibt hängen.
Wenn nich auf Adresse 0x3000 springe, wo der ResetHandler (0x0000)
steht, wird ein Reset ausgelöst; funktioniert also. Die Daten werden
korrekt im Flash abgelegt (extra mit pointern auf die entsprechenden
Adressen) ausgelesen.
Muss ich das Linkerfile/den Startupcode auch anpassen, wenn ich in der
Applikation keine Interrupts verwende. (Die restlcihen
Sprünge/Verzeigungen müssten doch alle relativ, bezogen auf den pc sein;
oder?)
Was muss ich denn alles verändern (für die Nutzung von Interrupts)?
Vektortabelle mit Offsets (=Startadresse der Appliaktion) sowie im
Linkerfile für den ROM-Bereich die StartAdresse für die Applikation?
z.B. so:
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. Anzahl Bytes steht
im Manual (wenn richtig erinnert 0x40). Length entsprechend verringern.
Also in der Art (nicht getestet!):
1
MEMORY
2
{
3
ROM (rx) : ORIGIN = 0x00000000+0x3000, LENGTH = 500k-0x3000
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.
Das Ganze kann man auch etwas anders angehen ("vectors"-section), das
wäre mglw. etwas eleganter aber die beschriebene Vorgehensweise sollte
funktionieren.
Martin Thomas
Hi Martin,
dickes Dankeschön. Mit ein paar Stichwörtern (re-mappen) übersieht man
dann die wichtigen Teile im Datenblatt nicht mehr... ;-)
Ich findes das eigentlich schon recht elegant: exception vector an den
Anfang vom RAM kopieren und dann die Vektoren auf das RAM zu mappen.
(lagst übrigens mit 0x40 richtig)
Gruß Andreas
Anbei mal hex-file des bootloaders, ner bl-applikation und ner
pc-software passend für das olimex-board.
das ganze befindet sich noch in ner frühen beta-phase; muss im code erst
mal aufräumen, bevor ich's in der codesammlung präsentier ;-)
trotzdem können eigene programme damit auch geladen werden. (einfach
linker-file aus dem bl-applikations-ordner verwenden bzw. die
linker-einstellungen, die martin thomas erläutert hat selbst einstellen)
beide taster müssen bei einem reset gedrückt werden, damit in den
bootloader gesprungen wird, andernfalls wird die applikation
angesprungen.
Hallo
Nachdem hier das Thema Bootloader aktuell ist.
Ich habe ein Olimex-Board mit dem LPC2148, hier vom Shop. In dieser
Kombination eine Frage:
Kennt jemand von Euch einen Bootloader, mit dem man dem späteren
Benutzer die Möglichkeit geben kann, Firmware-Updates selbst
aufzuspielen, andererseits, die Software aber schützen kann, damit sie
nur auf eigenen LPC-Boards läuft.
Der Bootloader dürfte auch was kosten
Freundliche Grüsse
Klaus
Hallo Klaus
Das ist eigentlich gar nicht so kompliziert.
Lege im Bootloader und in der Firmware einen Bereich, Linkerscript, an
zb 4Byte die einen definierten Inhalt haben müssen.
Dann Vergleicht der Bootloader diese beiden Felder, und nur wenn beide
identisch sind oder in einem von dir zu definierenden Verhältnis stehen,
wird die Firmware vom Bootloader gestartet.
Hallo Ralph und Andreas
Zuerst mal vielen Dank für Eure rasche Rückmeldung!
@Ralph: Den Ansatz verstehe ich nicht ganz. Wenn jemand z.B. meine
Firmware downloadet und auf sein Board spielt (also nicht eines von
mir), dann gibt es ja keinen Bootloader, welcher die Prüfung der 4
Bytes durchführt und das Programm startet. Müsste es nicht eher
umgekehrt sein, dass die "neue" Firmware in einem gesschützten
Speicherbereich die 4 Bytes ausliest und dann erkennt ob es sich um ein
Original-Board von mir handelt...?
@Andreas: Ich habe den Code von dir heruntergeladen. Vielen Dank. Ich
kann den Code von int USBHwEPRead(U8 bEP, U8 *pbBuf, int iMaxLen) nicht
finden. Gibt es dafür einen Grund? Wenn ich IAP-Bootloader.exe ohne
Parameter starte, dann erhalte ich von Windows einen Error-Dialog mit
Exeption P9: system.io.filenotfoundexception. Vielleicht kommt der
Fehler auch von der USB-Library weil im Fehlerdialog das USB-Symbol
gezeigt wird. Mache ich da etwas falsch? Eine kurze Beschreibung der
Nutzung wäre sehr hilfreich.
Vielen Dank und beste Grüsse
Klaus
Hallo zusammen
@Ralph: Ach so, verstehe. Was passiert aber, wenn jemand den bootloader
ausliest?
@Andreas: Im entpackten rar-file habe ich nichts gefunden. S.w.
verwendest du aber den USB-Stack von Betrik Sikken - stimmts:)?
Freundliche Grüsse
Klaus
Hallo Klaus
1. gibt es in vielen µC die Möglichkeit das Auslesen zu verhindern.
Protection
2. ohne zu Wissen wo und was im Bootloader stehen muss, hat da kaum
einer eine Chance die Stelle zu finden. ==> das heißt das du das
Linkerfile auf keinen Fall rausgeben darfst, weil darin die Position
deiner Schutzbytes steht.
Garantiert verhindern kannst du es nicht. Aber du kannst es so schwer
machen, dass der Auswand für denjenigen zu groß wird.
Hallo zusammen
@Andreas: Vielen Dank, beim Entpacken hat bei mir etwas nicht geklappt.
Deshalb hat dat Verzeichnis mit den entsprechenden Dateien gefehlt:),
Danke.
.net2 habe ich nun installiert und siehe da, das Programm lässt sich nun
starten.
muss nun noch Winarm installieren:)
@Ralph:
Ok, kann das nachvollziehen. Ich hätte versucht, die Variable direkt im
C-Code zu definieren.
Ich habe nun etwas recherchiert und diese Artikel gefunden. Vielleicht
sind sie für den Einen oder Anderen interessant
http://water.cse.unsw.edu.au/esdk/http://www.koders.com/noncode/fid96F9BDDD9E7BD89E2F155E052A80EDD542344038.aspx
Freundliche Grüsse
Klaus