Firmware aktualisiert sich selbst; SPM vom Prog.Speicher; SPMinterface

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Firmware aktualisiert sich selbst; SPM vom Prog.Speicher; SPMinterface

      Hallo Zusammen,

      ich (Atmega328) möchte das Speicherlayout des Controllers gern in Stage0-Bootloader (echter Bootloader), Stage1-Bootloader und Firmware aufteilen. Stage0 bleibt konstant; Stage1 und Firmware sollen sich untereinander updaten können.
      Problem - logisch - wie kann ich Flash schreiben der sich nicht im Bootloader befindet. Es muss (mindestens) eine Lösung Names spminterface geben und eine ominöse AN106 geben. Kennt sich damit jemand im Zusammenhang mit Bascom aus?

      Meine Idee war es die Update-Daten in den RAM abzulegen; mit goto an die Loaderadr. (Stage0-Bootloader) zu springen; dort SPM (spmcsr=0b11=3=page erase) auszuführen. Leider bleibt der controller an dieser Stelle für immer stehen. Vermutlich wird beim Aufruf von goto _RESET die Ausführung von SPM gesperrt.

      Dank und Gruß.
    • Ich sehe soeben, dass spmcsr=0b11=3=page erase auch vom Stage0-Bootloader aufgrufen nicht funktioniert. :/ Lockbits sind okay, interrupts sind aus, es wird binin 4Takten ausgeführt und hat schon beim Atmega168 funktioniert. Puh
    • Ich habe die Lösung bzw. das Problem gefunden. Ich habe Maxwordbit auf 7 gesetzt - es muss jedoch wie beim Mega168 6 sein.
      Fakt ist: es funktioniert. Der Atmega kann sich selbst Updaten.
      PS: Ein Update übers Netzwerk ist eine passende Anwendung; da hier der kleine Bootloader nie für ein Update reichen würde.
    • Entschuldigt, dass ich euch verwirrt habe:
      1) Ich habe das Projekt mit einem 168 begonnen (funktionierte), da in den Stage0 Bootloader eine MD5 Berechung sollte musste der M328 her.
      2) Durch meine falsche Annahme 'alles verdoppelt sich' bei der Migration habe ich das Maxwordbit von 6 (M168) auf 7 erhöht. Das war falsch, jedoch auslöser für diesen Beitrag hier)
      3) Zum Projekt an sich: Kundenwusch: Flash [$0000:Firmware][$2000:Stage1-Bootloader][$3800:Stage0-BL]
      Stage0 startet und geht bei einem Update direkt in die Stage1, die dann die Firmware aktualisiert oder Normalfall: startet als Firmware (und könnte Stage1 aktualisieren). Ist eine Partition durch ein Update fehlerhaft statet die andere (erkennung durch MD5).

      Vorteil: Es kann bei A) Updatefähigen (Stage1-)Bootloader das Gerät nicht B) unbrauchbar gemacht werden weil immer ein Image läuft. Zugegeben - ich finde es übertrieben. Aber der Kunde ist König...

      Das 'Besondere' daran: Ich habe Programmteile im Stage0 (SPM) die ich von Stage-1 oder Firmware aus hart anspringe. Und hier war ich mir nicht sicher ob das funktioniert - tut es.
      Code folgt im nä. Beitrag da beim Editieren kein Code hinzugefügt werden kann :/

      Jetzt möchte ich noch eine Sache: An einer definierten Stelle im Flash soll die Versionsnummer stehen. Wie kann man das Realisieren? Leider geht folgendes nicht:

      Source Code

      1. $Boot = _ADR_STAGE_0 - _PAGEWORDS -10 ' 2Byte Version; 8Byte Imagelänge für MD5 in letzter PAGE des Images
      2. VersionsData:
      3. Data _VERSION_SOFT_H, _VERSION_SOFT_L

      Mit $Boot möchte ich festlegen dass nachfolgender Code auf eine definierte Adresse im Flash geschrieben werden kann. Funktioniert bei Sub aber leider bei Data nicht. Ziel Ich kann von dem jeweils anderen Image bestimmen welche Version das Image hat / ob das Update geklappt hat.

      The post was edited 2 times, last by FlourHorn ().

    • Vielleicht nützt es jemand: Ich könnte mir vorstellen das man so über die Firmware Sprach-Dateien in den Flash nachladen / aktualisieren könnte. Selbst ein Filesystem wäre möglich.

      Source Code

      1. #IF _STAGE_0 = 1
      2. $boot = $3FEC ' 20 Adressen
      3. $ASM
      4. RJMP WriteData
      5. RJMP flash_write_done
      6. RJMP erase_page
      7. RJMP enable_page
      8. RJMP MD5_check
      9. $END ASM
      10. #Else
      11. WriteFlashData:
      12. Goto $3FEC
      13. flash_write_done:
      14. Goto $3FED
      15. erase_page:
      16. Goto $3FEE
      17. enable_page:
      18. Goto $3FEF
      19. MD5_check:
      20. Goto $3FF0
      21. #ENDIF
      Display All