Forum: Mikrocontroller und Digitale Elektronik LPC2148 usb bootloader


von Rupplyn (Gast)


Lesenswert?

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?

von ARM-Fan (Gast)


Lesenswert?

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?

von Rupplyn (Gast)


Lesenswert?

usb läuft bei mir schon unabhängig davon.
veröffentlichst du die source? dann könnt ich mir bei dir vielleicht ja 
was abschauen...

von Wulf Schlüter (Gast)


Lesenswert?

Hallo,
ich brauche das *.hex file von dem tnkernel bootloader. Wer hat es?
Gruß Wulf

von Wulf Schlüter (Gast)


Lesenswert?

Hallo,
habt Ihr das Hex File von dem TN Loader? Gruß Wulf

von ARM-Fan (Gast)


Lesenswert?

@Wulf: Hab ich nicht zur Hand, aber was soll dir das Hex-File dann 
helfen?

von Wulf Schlüter (Gast)


Lesenswert?

Wer hat son Bootloader?? mfG W. Schlüter

von ARM-Fan (Gast)


Lesenswert?

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.

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

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?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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
4
  RAM (rw)    : ORIGIN = 0x40000000+0x40,   LENGTH = 32k-0x40
5
}

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

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

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

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von Ralph B. (ralph-b)


Lesenswert?

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.

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?


von Klaus (Gast)


Lesenswert?

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

von Ralph B. (ralph-b)


Lesenswert?

Hallo Klaus

Bootloader und Firmware prüfen gegenseitig. und nur wenn es in beiden 
Richtungen stimmt, läuft die Software.

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Hi Klaus,

int USBHwEPRead(U8 bEP, U8 *pbBuf, int iMaxLen):
schau mal in die usbhw_lpc rein...

hast du .Net 2 installiert? Brauchst du.

von Klaus (Gast)


Lesenswert?

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

von Ralph B. (ralph-b)


Lesenswert?

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.

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

LPC2148_-_IAP_-_upload\LPC2148 - 
IAP\Firmware_BL\LPC_USB_STACK\usbhw_lpc.c

also viel genauer kann ich dir nicht sagen wo's steht...

von Klaus (Gast)


Lesenswert?

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

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.