Forum: Compiler & IDEs XMEGA DFU Bootloader und SPM aus Application Flash


von Simon K. (simon) Benutzerseite


Lesenswert?

Hi Leute :-D
Bei den XMEGAs ist ja SPM in den Application Flash nur noch aus der 
Bootloader Section erlaubt. Das heißt, wenn man den Flash im AVR als 
eine Art kleinen (internen) Dataflash nutzen will, muss man eine 
Hilfsfunktion in die Bootloader Section legen. Da tummelt sich aber bei 
meiner Anwendung Atmels DFU Bootloader (direkt das Binary hochgeladen - 
klappt).

Da die Sourcen des Bootloaders aber zugänglich sind und das Ganze das 
Atmel Software Framework (ASF) nutzt, würde ich gerne die entsprechende 
Funktion, die für das Schreiben des Flashes in dem Bootloader zuständig 
ist für meine Zwecke "missbrauchen" und aus der Application aufrufen.

Nach etwas Rumsucherei ist das die Funktion:
1
void nvm_flash_erase_and_write_buffer(flash_addr_t address, const void *buf,
2
  uint16_t len, bool b_blank_check)
in der Datei NVM.c aus dem Atmel Software Framework.
http://asf.atmel.com/docs/3.4.1/common.services.usb.class.msc.device.unit_tests.stk600_atxmega128a1u/html/nvm_8c_source.html

Da gibt es jetzt eine Reihe kleiner Probleme.
1. Wie finde ich am Besten heraus, an welcher Adresse diese Funktion im 
Binary abgelegt ist, wenn mir nur Sourcecode, Binary aber nicht der 
erforderliche KEIL Compiler zur Verfügung steht?

2. Gibt es unterschiede im Application Binary Interface (ABI) bezüglich 
des Funktionsaufrufes zwischen KEIL AVR Compiler (Womit Atmel den 
Bootloader kompiliert hat) und dem AVR-GCC (mit dem ich die Funktion 
aufrufen will)?
Wenn ja, gibt es Möglichkeiten das Anzupassen? Ich denke da gerade an 
eine (inline) Assembler Wrapper Funktion, die die Argumente entsprechend 
umsortiert.

3. Hat das schon mal jemand gemacht? ;-) ;-)

4. Kann es sein, dass es einfacher ist, die 150 verbleibenden Bytes in 
der Boot section (atxmega32A4U) mit meiner eigenen Variante zu füllen? 
Im prinzip würde es ja reichen dort ein einzelnes SPM unterzubringen, 
denn nur dieser Befehl kann nicht aus der App Section ausgeführt werden.

Vielen Dank für eure Hilfe schon mal!

: Bearbeitet durch User
von Simon K. (simon) Benutzerseite


Lesenswert?

Habe es jetzt anders gelöst. Da bei der kleinsten Variante 
(atxmega32a4u) immer noch 150 Byte in der Bootsection frei sind, habe 
ich im Prinzip nvm_common_spm aus dem ASF assembliert (sind 30 
Instruktionen) und ganz hinten an die Boot section drangehängt (mittels 
srec_cat).

Jetzt kann ich den Teil mit SPM (der nur aus der Boot section 
funktioniert) aus der Applikation anspringen.

Ein bisschen hacky, aber was solls ;-)

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.