Forum: Compiler & IDEs USB DFU Bootloader


von Daniel H. (Firma: Selbst ist der Mann) (boesling)


Lesenswert?

Hallo Forum,
Ich habe vor, den USB Bootloader von Atmel über Flip in den 
ATXMega128AU3U zu integrieren.
Jetzt meine Frage, da die Hardware der Anwendung schon fertig ist wollte 
ich die Möglichkeit nutzen, den Bootloader aus der Applikation heraus 
anzuspringen.
Wäre es möglich, bei dem entsprechenden Pin (E3) des Xmega den Pulldown 
zu setzen und dann den Reset über die Software auszulösen, oder wird der 
Pulldown beim Reset wieder gelöst?

Danke für Eure Ideen
VG Daniel

von Ralf (Gast)


Lesenswert?

> Wäre es möglich, bei dem entsprechenden Pin (E3) des Xmega den Pulldown
> zu setzen und dann den Reset über die Software auszulösen, oder wird der
> Pulldown beim Reset wieder gelöst?
Der Reset dient dazu die Register in einen definierten Zustand zu 
versetzen - IO-Register gehören i.d.R. ebenfalls dazu (das Datenblatt 
kann's dir sagen, ob's bei deinem Controller auch so ist).
Ich kenne die (X)Mega's nicht im Detail, aber soweit ich weiss 
implementieren diese eine Bootloader-Fuse, d.h. wenn du die setzt 
springt der Controller beim Reset erstmal in die Bootloader-Sektion.
Du könntest einen Bootloader schreiben, der dann den Pin prüft und 
entsprechend agiert.
Zusätzlich könntest du nette Features wie eine Integritätsprüfung des 
Firmware-Images etc. einbauen uswusf.

Ralf

von Timmo H. (masterfx)


Lesenswert?

Du kannst per Software einfach an "BOOT_SECTION_START/2 + 0x1FC/2" 
springen, so wie in der dfu Doku beschrieben (zumindest musst du bei gcc 
durch zwei teilen wegen der Wort-Adressierung)

von Daniel H. (Firma: Selbst ist der Mann) (boesling)


Lesenswert?

Vielen Dank Timmo :-)

Das nüsste sich doch dann so realisieren lassen, oder?
1
void (* boot_loader) (void);
2
3
boot_loader = (BOOT_SECTION_START >> 1) + (0x1FC >> 1);
4
5
boot_loader();
(Code im Forum gefunden und etwas angepasst)
Danke.
Daniel

von Daniel H. (Firma: Selbst ist der Mann) (boesling)


Lesenswert?

Dank natürlich auch an Ralf :-)

von Daniel H. (Firma: Selbst ist der Mann) (boesling)


Lesenswert?

Ich habe noch etwas recherchiert und im ASF etwas Beispielcode gefunden.
Funktioniert perfekt :-)
Die Bootloader Fuse ist auf "Application" gesetzt.
1
void(* start_bootloader)(void) = (void (*)(void))(BOOT_SECTION_START/2+0x1FC/2);
2
3
void UpdateFW(void)
4
{
5
  udc_stop();
6
  EIND = BOOT_SECTION_START>>17;
7
  start_bootloader();
8
}

Danke nochmal an die Mithelfer :-)

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.