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!