OTA Bootloader und Urflashen der Firmware

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

harvey
Beiträge: 88
Registriert: 01.12.2013, 13:19

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von harvey » 08.01.2019, 20:28

ok, wieder da :-)

also mit der Länge stimmt noch was nicht:
- ich habe den Sketch (durch brutales Reduzieren der Texte, ich will aktuell ja DEBUG machen) auf 28748 Bytes gedrückt, sollte also passen.
- dann über makeota.html generiert und geflashed.

Aber klappt nicht, siehe alter CRC FEhler.
Dann also die generierte .hex angesehen, da ist in der Tat etwas doppelt:

Code: Alles auswählen

1790: :106FD000006C6F774261743A20007478446576548F
1791: :106FE00072794D61783A20007570644379636C65FD
1792: :106FF0003A2000616C743A200054656D703A2000AC
1793: :1070000045525220637263004272696768743A2085
1794: :10701000004572726F72206174200020657870657F
1795: :10702000637465643A200020726561643A2000430D
1796: :107030005243204661696C6564005061636B6574FE
1797: :107000000C9420390C94003B0C9432390C94323996
1798: :107010000C9432390C9432390C9432390C94323944
1799: :107020000C9432390C9432390C9432390C94323934
1800: :107030000C9432390C9432390C9432390C94323924
Klar zu erkennen ist der Bootloader ab Zeile 1797, er beginnt ja auch bei 7000, ok. Am Ende des Bootloaders, hier nicht angezeigt,
kann man auch ModelType, DEviceID, Seriel erkennen, alles richtig.

Es Irritert mich allerdings des letzte Ende des Sketches. In der Original sketch.hex sieht das etwas anders aus.
Da ist eine Zeile KÜRZER:

Code: Alles auswählen

1769: :106E8000FE010E94FA352196C33AD107C9F7F8945A
1770: :026E9000FFCF32
1771: :106E9200A80FA80F010000000000D4058000000028
1772: :106EA20000003C10A90FD30F89100410E20FF60F57
Das sieht eigentlich auch ok aus, aber macht aber den Vergleich etwas schwer.

Jedenfalls finde ich die Inhalte richtig wieder, Adresse und CRC sind halt anders. Das scheint das makeota.html zu machen, aber ok.

Der eigentliche Fehler ist dann ab Zeile 1793 - 1796, dass die Adresse 7000 - 7030 doppelt beschrieben wird, zusätzlich
durch den Bootloader in Zeile 1797++.

Also mache ich den Sketch noch ettwas kleiner :-) aber irgendwie scheinen die Länge 28760 nicht zu passen

bis gleich
Harvey
Homematic raspberrymatic, iobroker, Asksinpp und Arduinos - rund 40 Geräte

harvey
Beiträge: 88
Registriert: 01.12.2013, 13:19

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von harvey » 08.01.2019, 20:49

ok, kleiner ist er jetzt, und es ist ok!

Code: Alles auswählen

:106F9000435243204661696C6564005061636B65D0
:106FA0007420746F6F206269673A2000FFFFFFFF53
:106FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
:106FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
:106FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
:106FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
:106FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFF3F73ED
:107000000C9420390C94003B0C9432390C94323996
:107010000C9432390C9432390C9432390C94323944
:107020000C9432390C9432390C9432390C94323934
:107030000C9432390C9432390C9432390C94323924
Schön erkennt man das Ende des Sketches bei 0x6FA0 ... 0x6FAB, danach kommt nur noch 0xFF.
Im reinen sketch.hex sind dies auch die letzten Zeichen, allerdings folgt kein padding auf 0xFF, aber Inhalt ist sonst identisch.

Code: Alles auswählen

:106F880020726561643A2000435243204661696C6F
:106F98006564005061636B657420746F6F2062696B
:046FA800673A200024
:00000001FF
Allerdings sagt arduino IDE jetzt Sketch Länge 28558 Byte! Also nix mit 28670 :-(
Ich kann schon berechnen, dass 0x7000 (minus 2 Byte CRC) = 28670 Byte sind, aber irgendwas ist im Output wohl zusätzlich dran,
was nicht gezählt wird.

Da habe ich im boards.txt was gesehen von "eight analog inputs" - ist das Kunst oder kann das weg?

Fazit: Mit etwas fummeln und leicht unterhalb der eigentlich richtigen Länge klappt es!

ciao
Harvey

PS: @Jerome+papa: die berechnete Länge 0x7000 minus 2 Byte CRC ist 28670 Byte und nicht 28760 Byte, wie oben geschrieben ...
Homematic raspberrymatic, iobroker, Asksinpp und Arduinos - rund 40 Geräte

papa
Beiträge: 348
Registriert: 22.05.2018, 10:23
Danksagung erhalten: 11 Mal

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von papa » 08.01.2019, 23:00

Komisch - aber scheint ja jetzt zu klappen.
Anfragen zur AskSin++ werden nur im Forum beantwortet

stan23
Beiträge: 634
Registriert: 13.12.2016, 21:14
Wohnort: Altmühltal
Hat sich bedankt: 40 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von stan23 » 09.01.2019, 11:10

Ich kenne mich mit den ATMegas nicht so gut aus, deswegen nur eine blöde Frage:

beginnt denn der normale Sketch wirklich an 0x0000 oder liegt davor noch was anderes? (Reset Vektor, Abort Vektoren?)

EDIT: typos
Zuletzt geändert von stan23 am 09.01.2019, 12:56, insgesamt 1-mal geändert.
Viele Grüße
Marco

RaspberryMatic
~60 Geräte (HM, HmIP, HMW, HBW, AskSin)

deimos
Beiträge: 3039
Registriert: 20.06.2017, 10:38
Wohnort: Leimersheim
Hat sich bedankt: 10 Mal
Danksagung erhalten: 54 Mal
Kontaktdaten:

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von deimos » 09.01.2019, 11:23

Hi,
stan23 hat geschrieben:
09.01.2019, 11:10
Ich kenne mich mit den ATMegas nicht so gut aus, deswegen nur eine blöde Frage:

beginnt denn der normale Sketch wirklich an 0x0000 oder liegt davor noch was anderes? (Reset Vektor, Abert Verktoren?)
Der eigentliche Sketch fängt bei 0x00 an, innerhalb des Sketches sind am Anfang aber u.A. die Interrupt Vektoren, da muss man sich aber nicht weiter drum kümmern.
Je nachdem wie die Fuses eingestellt sind, wird beim Start direkt 0x00 ausgeführt oder der Bootloader. Beim Bootloader kommt es wiederum auf die Fuses und auf den konkreten Chip an, an welcher Position der liegen muss. Hat den Vorteil, dass man je nach Erfordernis größere oder kleinere Bootloader haben kann und dann mehr oder weniger Speicher für das eigentliche Programm hat.
Oder man programmiert nur mit einem ISP, dann kann man sich den Bootloader ganz sparen und hat den gesamten Flash für sich.

Viele Grüße
Alex

harvey
Beiträge: 88
Registriert: 01.12.2013, 13:19

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von harvey » 09.01.2019, 12:42

hi,

danke für die Erläuterungen, aber hier ging es konkret um die Verwendung mit dem OTA-Bootloader.
Und da passen ein paar Zahlen noch nicht zusammen.

Richtig ist (in diesem konkreten Fall, also atmel328p):
- der OTA-Bootloader beginnt an 0x7000, zu erkennen im .hex-File, Fuses passen ja auch dazu.
Der Bootloader funktioniert auch (immer), da er HINTER den Sketch kopiert wird und daher bei
einem Überlauf durch zu großen Sketch die Adressen ab 0x7000 erneut mit Bootloadercode überschrieben werden.

Ein zu langer Sketch wird am Ende, welches über 0x700 - 2 CRC hinausgeht erneut überschrieben, daher passt die
Gesamt-CRC nicht und der überlange Sketch startet nicht.

Noch im Detail nicht geklärt ist:
Der funktionierende Sketch behauptet, er wäre 28558 Byte lang, das ist die original Textausgabe des Arduino-IDE (1.8.8 ) nach dem kompilieren.
Das wären dann, begonnen mit 0x0000 also bis 0x6F8E.
Allerdings erkennt man, dass der Sektch bis 0x6FAB geht (letzte Bytes: ...673A2000). Der Bootloader und Sketch-CRC werden nicht überschrieben.
Und das sind dezimal 28587 Byte, also 29 Byte länger, als die IDE sagt.

Also irgendwer zwischen Textausgabe bei kompilieren und exportieren des HEX-Files vertut sich um 29 Byte.
Wenn das so statisch bleibt kann man ja im boards.txt die maximale Länge anpassen.
Also wären das dann (0x7000 - 2 Byte CRC - 30 Byte_was_auch_immer_) 28628 Byte.

Kann man ja mit leben, habe ich nur noch nicht verstanden, woher die Differenz kommt. Vielleicht vertut sich einfach
die Textausgabe des arduino-IDE?

ciao
Harvey
Homematic raspberrymatic, iobroker, Asksinpp und Arduinos - rund 40 Geräte

jp112sdl
Beiträge: 3346
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 34 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von jp112sdl » 09.01.2019, 13:35

harvey hat geschrieben:
09.01.2019, 12:42
Vielleicht vertut sich einfach die Textausgabe des arduino-IDE?
Reicht die Arduino IDE in dem Fenster unten nicht nur die Ausgabe von 'g++' durch?
Liegt es vielleicht an Compiler-Parametern?
Ich habe auf die Schnelle noch das hier gefunden: avr-gcc-producing-wrong-file-size

VG,
Jérôme

stan23
Beiträge: 634
Registriert: 13.12.2016, 21:14
Wohnort: Altmühltal
Hat sich bedankt: 40 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von stan23 » 09.01.2019, 16:34

jp112sdl hat geschrieben:
09.01.2019, 13:35
Ich habe auf die Schnelle noch das hier gefunden: avr-gcc-producing-wrong-file-size
Der größte Teil des Threads dreht sich um was anderes.
Der einzige Hinweis ist die Unterscheidung in Programmcode (.text) und nicht-Null initialisierte Variablen (.data).

edit:
nach dieses Theorie müsste das Delta noch größer werden, wenn du eine weitere globale Variable mit einem Wert ungleich Null initialisierst (und verwendest, damit der Compiler sie nicht wegoptimiert)

Code: Alles auswählen

// im globalen Teil
volatile uint32_t testVar = 0xDEADBEEF;  // volatile damit der Compiler sie nicht wegoptimiert, weil sie nur beschrieben aber nie gelesen wird

// in main()
testVar = 0xAFFEBABE;

edit2:
Was mich wundert ist dass es hier beim Flashen über den ISP zusammenpasst:

Code: Alles auswählen

Der Sketch verwendet 34006 Bytes (52%) des Programmspeicherplatzes. Das Maximum sind 64512 Bytes.
Globale Variablen verwenden 1246 Bytes (30%) des dynamischen Speichers, 2850 Bytes für lokale Variablen verbleiben. Das Maximum sind 4096 Bytes.
[...]
avrdude: 34006 bytes of flash verified
avrdude done.  Thank you.
Viele Grüße
Marco

RaspberryMatic
~60 Geräte (HM, HmIP, HMW, HBW, AskSin)

harvey
Beiträge: 88
Registriert: 01.12.2013, 13:19

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von harvey » 09.01.2019, 21:45

Hi,

das Phänomen des Unterschiedes taucht aktuell nicht mehr auf.
Hat vielleicht mit der späten Stunde zu tun, meine Augen ....

Also noch getestet:
Länge 28582 = 0x6fa6 = PASST
Länge 28574 = 0x6f9e = PASST,

Vermutlich habe ich eine falsche Länge aufgeschrieben, der Fehler war bei 28558 Länge, da ist aber ein
Zahlendreher (mea culpa) : richtig 28588 = 0x6fac = passt!

Also über Fehler viel gelernt - Danke für eure Unterstützung.

Damit ist (für mich) ein Pfad klar:
- Sketch übersetzten, maximale Länge (laut Aurduino-ide Ausgabe) = 28670 Byte!!!
- export als binär (erzeugt zwei ...hex, davon die ...ino.eightanaloginput.hex verwenden
- in dieser Datei zur Sicherheit checken, dass 0x6ffe nicht erreicht wird
- diese Datei mit makeota.html, den Werten DEVICE-ID, DEVICE-SERIAL als fertigen Bootloader schreiben
- in der fertigen Bootloaderdatei kann man die Länge des Sketches, des Bootloaders und der übergebeenn Werte sehen und prüfen
- die Datei mit "flash.sh" und einem usbasp o.ä. (also mit avrdude) flashen (Pfade!)
- usbasp entfernen, FTDI anstecken
- im seriellen Monitor taucht dann "AskSin OTA Bootloader V0.7.0", davor blinkt es
- dann startet der eigentliche Sketch, die Ausgabe ist also identisch mit dem direkt per FTDI geladenem sketch aus dem IDE
- dann wie gewohnt anlernen

Erzeugung eines updatefähigen Paketes (firmware.eq3, info, chnaglog.txt im ...tar.gz Archiv) ist ja schon beschrieben.

ciao
Harvey
Homematic raspberrymatic, iobroker, Asksinpp und Arduinos - rund 40 Geräte

jp112sdl
Beiträge: 3346
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 34 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: OTA Bootloader und Urflashen der Firmware

Beitrag von jp112sdl » 09.01.2019, 22:15

Musst nur aufpassen, wenn du die OTA-Möglichkeit bei Originalnachbauten (HM-... Geräte) anwendest und es tatsächlich mal eine neue offizielle FW für das Gerät gibt.
Da zu einem Gerät immer nur eine Firmwareupdatedatei auf der CCU hinterlegt werden kann, musst du (gerade bei Mischbetrieb von originalen und nachgebauten Geräten) aufpassen, welche Quelldatei du auf welches Gerät schiebst.

VG,
Jérôme

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“