ich hab da ein kleines Problem mit bereits im Feld eingesetzen Modulen. Die Module mit einem ATMEga328 haben alle einen Bootloader mit 2048 Words (also 4K). Dieser kann eine neue Firmware von SD ins Flash programmieren.
Leider habe ich mit dem Bootloader ein kleines Problem, weswegen jetzt ein Update des Bootloaders nötig wird.
Ist es möglich, den Bootloader selber auszutauschen? Also eine Firmware schreiben, die zunächst per altem Bootloader installiert wird. Diese schreibt dann einen neuen Bootloader, der dann später wieder die richtige Firmware installiert.
Die Fueses kann ich natürlich nicht ändern, logisch, aber geht das Bootloader programmieren vom Programm aus?
NEin Du kannst keinen Bootloader mit dem Bootloader draufschreiben. Du brauchst einen ICSP-Programmierer. Kostet wenig oder Du kannst auch einen Arduino dazu mißbrauchen.
arduino.cc/en/Tutorial/ArduinoISP
Wird ein bisschen schwierig, 150 Geräte in aller Welt per ICP zu programmieren.
Wenn ich das richtig verstanden habe, kann ein Programm im NRWW sowohl RWW wie auch NRWW beschreiben.
Auch ein normales Programm kann das Flash beschreiben. Die Frage ist nur, kann ich auch den Bootloader verändern? Das wird im Datenblatt nicht wirklich klar...
Am besten ich teste das mal.
PS.: So, jetzt bin ich schlauer, es geht, aber nur bedingt. Nur der Bootloader kann sich selber überschreiben, bzw. etwas ins Flash schreiben. Man muss jetzt also über den Bootloader einen Bereich im NRWM mit einem Minibootloader, einem der nur den SPM Befehl ausführt, progrmmieren. Den kann man dann dazu verwenden, um aus dem Flash den restlichen Bootloader zu überschreiben.
Jetzt schau ich erst mal, ob ich eine entsprechend ansprechbaren Einsprungpunkt im jetzigen Bootloader finde...
Nur der Bootloader kann sich selber überschreiben, bzw. etwas ins Flash schreiben
Klingt interessant, aber woher weiss ein Code, dass er ein Bootloader ist ?
Es gibt fuses (BOOTSZ0 / BOOTSZ1), die bestimmen wie groß der bootloader ist ( am Ende des Flash ) :
Wie hängt das mit der Startadresse bei Reset zusammen ?
Macht es einen Unterschied, ob Code in diesem Bootloader-Bereich oder woanders ausgeführt wird ?
Nur der Bootloader kann sich selber überschreiben, bzw. etwas ins Flash schreiben
Klingt interessant, aber woher weiss ein Code, dass er ein Bootloader ist ?
Es gibt fuses (BOOTSZ0 / BOOTSZ1), die bestimmen wie groß der bootloader ist ( am Ende des Flash ) :
Wie hängt das mit der Startadresse bei Reset zusammen ?
Macht es einen Unterschied, ob Code in diesem Bootloader-Bereich oder woanders ausgeführt wird ?
Ist dein SD-Card bootloader public ?
Es gibt 2 Bereiche im Flash, einmal den NRWW (non Read while write) Bereich, der geht beim 328 bis 28kB. Und den RWW (read while write) Bereich. Das sind die letzen 4Kb. Und ein Bootloader liegt immer im RWW, sonst könnte er nicht das flash programmieren. Die Bootsz geben nur an, wo beim Booten der Bootloader angesprungen werden soll. Und natürlich muss überhaupt der Bootloader aktiv sein. (BOOTRST)
Nur Code der im RWW ausgeführt wird, kann das Flash beschreiben... (So interpretiere ich das Datenblatt...)
Ja, mein Bootloader ist public, ist der 2Boot von Thomas Seiler (embedded/avr/2boots at master · thseiler/embedded · GitHub)
Leider hat der ein Problem mit SDHC Karten, die eine etwas andere Initialisierung brauchen. Aber da sind wir dran...
Danke ! Werd ich im Auge behalten.
2GB (FAT16) Karten habe ich noch. Mit denen hast du gute Erfahrungen ?
Was ist der Unterschied zwischen
2boots-arduino-atmega328p-16000000L-nommc.hex
2boots-arduino-atmega328p-16000000L-MD4.hex
(beide aus dem embedded / avr / 2boots / build / Verzeichnis )
Das sind beides fertige Bootloader für einen normalen UNO, die durch die Kennung "ARDUINO" am eeprom - Ende aktiviert werden, richtig ?
willie1968:
Leider hat der ein Problem mit SDHC Karten, die eine etwas andere Initialisierung brauchen. Aber da sind wir dran...
Als Workaround kannst du > 2 GB Karten mit einer 2 GB Partition am Anfang des Datenträgers versehen und FAT16 formatieren. Das sollte wohl für eine Firmware ausreichen
Der Trick klappt jedenfalls mit Kameras und anderen Dingen, die nur kleine Karten mögen. Kartenleser und ein Programm wie Paragon Partition Manager oder die Suite, wo alles drin ist, oder Acronis Disk Director z.B.
Wenn das funzt, die SD-Karte mit einem Imageproggi (Freeware) sichern und das Image kannste dann an die betreffenden Leute verschicken, so das sie sich es dann auf die Karte draufzimmern, die dann automatisch richtig formattiert ist. Das Imange wird keine 4 GB groß, so man nicht unbenutzten Platz mitsichern läßt (ist aber per Default nicht so)
das Image kannste dann an die betreffenden Leute verschicken, so das sie sich es dann auf die Karte draufzimmern
Das ist viel einfacher: "Die Leute" haben ja schon eine passende Karte, auf der nur eine kleine .HEX Datei ausgetauscht wird.
Die Frage hier war ja, ob/wie man mit diesem Verfahren den vorhandenen 2boot bootloader ersetzen kann.
Aber da wird wohl extra Hardware gebraucht: Entweder ein ISP Programmer oder ( falls "die Leute" mehr als einen Arduino haben )
eine Prozedur wie die sich "gegenseitig" den bootloader über ISP aktualisieren können.
Als Workaround kannst du > 2 GB Karten mit einer 2 GB Partition am Anfang des Datenträgers versehen und FAT16 formatieren.
Guter Vorschlag, müsste man in der SD (bzw. der sdfat) Library und im 2boot bootloader checken, ob die mehrere Partitionen ( oder wenigstens die erste bei mehreren ) kann.
willie1968:
Leider hat der ein Problem mit SDHC Karten, die eine etwas andere Initialisierung brauchen. Aber da sind wir dran...
Als Workaround kannst du > 2 GB Karten mit einer 2 GB Partition am Anfang des Datenträgers versehen und FAT16 formatieren. Das sollte wohl für eine Firmware ausreichen
Der Trick klappt jedenfalls mit Kameras und anderen Dingen, die nur kleine Karten mögen. Kartenleser und ein Programm wie Paragon Partition Manager oder die Suite, wo alles drin ist, oder Acronis Disk Director z.B.
Wenn das funzt, die SD-Karte mit einem Imageproggi (Freeware) sichern und das Image kannste dann an die betreffenden Leute verschicken, so das sie sich es dann auf die Karte draufzimmern, die dann automatisch richtig formattiert ist. Das Imange wird keine 4 GB groß, so man nicht unbenutzten Platz mitsichern läßt (ist aber per Default nicht so)
Gruß Gerald
Richtig. Ich hab ein PC Programm geschrieben, was das automatisiert. Also Karte einlegen und der macht die Partion drauf und lädt die richtige Firmware. Ich hab diese EEprom kennung ausgeschaltet. Stattdessen wird nur nach einer speziellen Datei gesucht. Die zus. Sicherheit brauch ich in meinem Umfeld nicht.
Mein FAT16 Image ist übrigens nur 128MB groß. Ich verwende dabei eine von mir modifizierte Version vom win32DiskImager.
Mit dem knall ich das Image dann auf die 4GB Karte und gut ists danach. Allerdings geht das bei manchen Karten eben trotzdem nicht. Vor allem SDHC. Aber wie gesagt da ist der Herr Seiler schon dran.