Forum: Mikrocontroller und Digitale Elektronik TinySafeBoot Bootloader One-Wire Interface


von tsb (Gast)


Lesenswert?

Hallo,

ich setze auf einem Atmega 328p mit 8MHz den TinySafeBoot Bootloader [1] 
ein. Auf der Prototypen-Platine habe ich damit im "normalen Modus" über 
den UART mit 2 Pins (RX und TX) die Programmdateien übertragen. Auf der 
fertigen Platine steht aber nur ein Pin zur Verfügung, da der Anschluss 
der Platine mit Servo-Steckern aus dem Modellbau ausgeführt wird - also 
GND, VCC, SIG. RX und TX im Half-Duplex zusammen zu schalten ist kein 
Problem [2, Abschnitt "SWART Beispiel"]. Die letztendliche Verschaltung 
wird nach dem Fastboot TTL/FTDI-Beispiel aus dem Wiki realisiert [3].
Der TSB-Bootloader wird mit dem Kommando "tsb m328p d0d0" erzeugt.
Wenn ich diesen flashe kann ich allerdings keine Programm-Dateien mehr 
übertragen. Das Host-Programm erkennt zwar "ONE-WIRE Interface 
detected", aber fragt danach nach einem Passwort. Dieses habe ich beim 
Erstellen des Bootloaders allerdings nicht gesetzt und die Host-Software 
bricht mit "ERROR" nach leerer Eingabe ab. Ebenfalls fragt "tsb comX I" 
nach einem Passwort, welches allerdings normalerweise die 
Bootloader-Informationen ausgeben sollte.
Hat jemand ein ähnliches Problem? Auf der Homepage von TSB wird 
angegeben, dass im invertierten UART Half-Duplex übertragen wird, 
welches eigentlich mit dem Fastboot Adapter (Widerstand zwischen TX und 
RX, RX dann direkt nach "Außen") keine Probleme machen sollte.

Schöne Grüße

[1] http://www.jtxp.org/tech/tinysafeboot.htm
[2] http://www.gfai.de/~heinz/techdocs/swart.htm
[3] 
http://www.mikrocontroller.net/articles/AVR_Bootloader_FastBoot_von_Peter_Dannegger#One-Wire

von Julien T. (julien)


Lesenswert?

Hallo "tsb"!

Also, mit den von Dir genannten 8 MHz und 9600 Bd (Default der 
Host-Software) sollte es eigentlich funktionieren ;-) Vielleicht 
trotzdem mal mit 4800 probieren. Wenn es dann überraschenderweise geht, 
ist wohl ein Pullup erforderlich, weil die Signalflanken sonst zu 
wabbelig sind.

Wie war denn das Reset-Timing in der Two-Wire-Variante?
Notfalls sollte immer der Power-On-Reset funktionieren, um TSB 
aufzurufen. Nachdem mich etliche Leute darauf hingewiesen haben, dass 
sie /RESET in ihren Anwendungen für andere Zwecke nutzen wollen, habe 
ich schon vor einiger Zeit in TSB eine zusätzliche Warteschleife 
eingebaut, die nach einem Power-On-Reset erst stabile Bedingungen auf RX 
abwartet, und dann erst zum normalen Timeout (Warten auf "@@@") 
übergeht. Damit war TSB auch in scheinbar unmöglichen Anwendungen wieder 
erreichbar, es war also offenbar keine "Verschlimmbesserung". (Mal 
sehen, was noch kommt...)
Wenn TSB beim Aufruf feststellt, dass RX oder die kombinierte 
RX-TX-Leitung am Anfang keinen sauberen High-Pegel erreicht (entspr. 
Stoppbit/Leerlauf in RS232-TTL-Logik), dann wird natürlich zur 
Applikation weitergeleitet. Priorität hat immer, dass der Start der 
eigentlichen Anwendung nicht auf Dauer durch den Bootloader blockiert 
werden kann.

Natürlich macht TSB keinen Mucks, wenn eine oder alle nachfolgenden 
Bedingungen zutreffen:
- Zeitfenster verpasst (Hauptprogramm läuft bereits),
- Schnittstellenkommunikation unstabil, oder
- Passwort war definiert, aber der Anwender gibt was Falsches ein...

In keinem der oben genannten Fälle antwortet der Bootloader. Warum 
sollte er auch? Die Sicherheitsüberlegungen habe ich ja schon 
angesprochen. Der Chip soll durch Lockbits und physische Maßnahmen nach 
Bedarf komplett abgeschottet werden können.
Außerdem gibt es noch die in [2] so schön ausgebreitete Möglichkeit, 
mehrere Bausteine an einem One-Wire-Bus zu betreiben. Da wäre es 
fatal, wenn ein Device, das nicht persönlich angesprochen wurde, 
irgendwelche Zeichen raushaut...

(Diese Bus-Geschichte mit mehreren ATtinys funktioniert also definitiv 
auch mit TSB. Ich habe es mit bis zu 5 verschiedenen ATtinys auf 
derselben Leitung und nur einem gemeinsamen Pullup getestet. Die 
Timeouts müssen ungefähr übereinstimmen und alle sollten sich mit 
derselben Baudrate ansprechen lassen. Der Zeitpunkt des gemeinsamen 
Resets (einziger Schönheitsfehler im Grunde) ist nicht kritisch. Es 
sollten eben alle Devices ungefähr im selben Zeitfenster auf 
Synchro-Zeichen reagieren können. Auf dem Bus wird sich nur der TSB 
melden, dessen richtiges Passwort gesendet worden ist. Anstelle einer 
gemeinsamen Reset-Leitung geht auch die Brutalo-Methode mit einem 
gemeinsamen Power-On-Reset.)

So, das waren erstmal meine 50 Cent!

Viele Grüße,

Julien Thomas

von Stefan (Gast)


Lesenswert?

Moin Julien,

erstmal großes Lob an deine Software, gefällt mir sehr gut und habe ich 
mitlerweile auf einigen Controllern laufen.
Einen extra Pull-Up setze ich heute abend mal ein, hatte eigentlich 
angenommen, dass die Leitungen durch die internen Pull-Ups auf einem 
sauberen Pegel gehalten werden. UART im Half-Duplex aus der Applikation 
heraus funktioniert ansonsten.
Wie ist es eigentlich genau sichergestellt, dass der Bootloader nicht am 
Anfang auf irgendwelchen Datenwust antwortet? Auf deiner Seite ist ja 
beschrieben, dass auf ein spezielles Zeichen gewartet wird. Verstehe ich 
es richtig, dass damit bei einem Power-On-Reset auch der Bootloader in 
einen Time-Out laufen kann und dann die Applikation startet? Die Platine 
wird dauerhaft per UART mit einem anderen Controller verbunden sein, der 
definitiv vor dem Start des TSB Bootloaders schon Daten senden wird.

Schöne Grüße,
Stefan

von Julien T. (julien)


Lesenswert?

Hi!

Also ich befürchte ja, das ist mal wieder so ein Spezialfall...
Einerseits ist beim PW-gesicherten TSB die Wahrscheinlichkeit praktisch 
Null, dass dieser auf zufällig gesendete Zeichen in irgendeiner Weise 
reagiert. Selbst wenn der String mit "@@@" anfangen würde und in einer 
für TSB auswertbaren Baudrate vorliegt, dann müssten die nachfolgenden 
Zeichen schon genau dem Passwort entsprechen, damit TSB darauf ungewollt 
reagiert. Kollisionen sind in dem Sinne also nicht zu befürchten.
Andererseits bedeutet das wohl in Deiner Anwendung eine Blockade durch 
TSB:
Der TSB-Timeout läuft ja nur VOR dem Empfang möglicher Synchro-Zeichen. 
Sobald innerhalb des Zeitfensters irgendein serieller "Zeichenmüll" 
reinkommt, wird TSB intern bis zur Passwort-Testschleife weiterkommen, 
aber ungeachtet falscher Baudrate und Synchronisation weiterhin nicht 
reagieren und auch nicht an die App weiterleiten. Das ist eigentlich so 
gewollt, weil jede von außen sichtbare Reaktion möglicherweise einen 
Rückschluss darauf zuließe, wieviele der bereits gesendeten Zeichen nun 
doch richtig waren (Brute-Force-Angriffe).
Ein weiterer Timeout oder eine Erkennung von zu viel unsynchronisiertem 
Zeichenmüll wäre außerdem ein erheblicher Mehraufwand und würde das 
flache Energieprofil der Passwortauswertung sogar wieder infrage 
stellen.
Den Watchdog kann und möchte ich als "Notstopp" nicht verwenden. Dann 
würde die TSB-eigene WD-Konfiguration möglicherweise mit dem 
Hauptprogramm kollidieren. TSB erkennt aber, dass es sich um einen 
WD-Reset handelt (MCUSR) und leitet dann sofort zur Anwendung weiter. 
Auf diese Weise ließ sich das Problem mit manchen ATtinys lösen, bei 
denen der vom WD selbst ausgelöste Reset dann den WD-Prescaler 
zurücksetzt, sodass sich eine zu langsame Reset-Routine in einer 
Endlosschleife aufhängen kann. (Das wurde hier sicher schon mehrfach 
diskutiert.)
TSB ist aber immer über Power-On-, Extern- und Brown-out-Resets 
erreichbar. Die entsprechenden Flags bleiben auch unangetastet.

Also ich sehe für Deine Anwendung nur zweieinhalb Möglichkeiten, mit TSB 
zusammenzuspielen:
- Eine andere Leitung nehmen
- Der andere, ständig sendende Controller wird zusammen mit dem 
TSB-Controller resettet und und dessen Timeout ist geringfügig länger 
eingestellt, als der von TSB, er wartet also etwas länger, als TSB, 
bevor er erste Daten sendet
ODER
- Der andere Controller wird zusammen mit dem TSB-Controller resettet 
(muss nur ungefähr stimmen) und sendet aber zu Anfang immer einen 
längeren Low-Pegel auf der One-Wire-Leitung, was TSB dazu veranlasst, 
die Anwendung ohne den regulären Timeout zu starten. Deine Anwendung 
müsste dann ggf. in ihrer Reset-Routine das Ende dieses Low-Pegels 
abwarten, da dies kein gültiges serielles Zeichen ist.


Viel Glück!

Julien

: Bearbeitet durch User
von AleX (Gast)


Lesenswert?

Freunde,

ich habe das gleiche Problem wie du,
fragt nach einem Passwort und erzählt .ERROR.
aber alles, was in dem Paket ist erfolgreich ...
Bitte respektiert Autoren lag die früheren Versionen des TSB werden es 
Ihnen danken!

von AleX (Gast)


Lesenswert?

Freunde,

ich habe das gleiche Problem wie du,
fragt nach einem Passwort und erzählt .ERROR.
aber alles, was in dem Paket My TSB ist erfolgreich ...
Bitte respektiert Autoren lag die früheren Versionen des TSB werden es 
Ihnen danken!

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.