www.mikrocontroller.net

Forum: Compiler & IDEs Bootloader-lockbits im ATmega64 zur laufzeit setzen


Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich kämpfe immer noch mit der Bootloaderei.

Weiss jemand, was ich hier falschmache:


wenn ich folgende Zeile aufrufe (diese liegt in der Bootloader
Section)

   boot_lock_bits_set(0xCF);


, dann sollte doch anschlieesend irgendein LockBit gesetzt sein. Mit
dem JTAGICE sehe ich immer nur nicht gesetzte Lockbits.

mußß ich da noch irgendwas drumherumbauen oder was mache ich verkehr?


Gruß Martin

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, sollte sich da noch ein Bug im GCC Compiler befinden??

in den Headerfiles gibts eine __BOOT_LOCK_BITS_MASK, die wohl
verhindern soll, dass man die anderen beiden Bits (LB2, LB1) mit setzt
bzw löscht.

Die Lockbits werden aber mit einer 0 gesetzt (sehr logisch!), so dass
die MASK meines Erachtens invertiert werden müsste.


jedenfalls kann man an die boot_lock_bits_set()-Funktion übergeben was
man will, die Lockbits bleiben auf 1 (also ungesetzt) kleben, bzw
fallen sogar ungewollt auf 1 zurück.

Die LB1 und 2 Bits dagegen kann man schön verändern!


habe ich recht oder bin ich auf dem Holzweg?


Gruß Martin

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft es, die Maske einfach erstmal zu deaktivieren.
Hier ein aus boot.h herausgschnittenes Makro ohne die Maske.

#define _boot_lock_bits_set_alternate_bf(lock_bits)        \
({                                                         \
    boot_spm_busy_wait();                                  \
    _asm__ __volatile_                                   \
    (                                                      \
        "mov r0, %2\n\t"                                   \
        "sts %0, %1\n\t"                                   \
        "spm\n\t"                                          \
        ".word 0xffff\n\t"                                 \
        "nop\n\t"                                          \
        : "=m" (__SPM_REG)                                 \
        : "r" ((unsigned char)__BOOT_LOCK_BITS_SET),       \
          "r" ((unsigned char) lock_bits)                  \
        : "r0"                                             \
    );                                                     \
    boot_spm_busy_wait();                                  \
})

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, ich denke auch, dass man erstmal die Maske weglässt, man
setzt/löscht dann halt alle 6 Lockbits.



Gruß
martin

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unsinn, man kann nicht alle 6, sondern nur die 4 BLB's verändern!!!

(der SPM-Befehl greift nur auf die BLB's zu)


jedenfalls hat mthomas' Beispiel funktioniert - vielen Dank


Gruß Martin

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und kann man die Bits hin- und zurück setzen ?

Wenn man sie wieder rücksetzen kann, sind sie sinnlos.

Die heißen ja deshalb Lockbits, weil sie den Inhalt gegen fremde Augen
sperren (=lock) sollen.
Ein Rücksetzen außer durch ein Full-Erase, d.h. mit Erhalt des
Flashinhalts sperrt aber rein gar nichts.


Ich habe deshalb meinen Bootloader so geschrieben, daß er alle
Funktionen verweigert, sobald das letzte Wort unter ihm ungleich 0xFFFF
ist.
Nur ein Erase-Kommando ist noch erlaubt, welches erst den EEPROM und
dann den Flash von unten anfangend mit 0xFFFF beschreibt.


Peter

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HM,

ich denke es ist so:

Man flasht den Bootloader und evtl eine Firmware, setzt die Boot reset
Fuse und die LB0 und LB1-Lockbits.


Somit kann man nicht mehr per SPI oder JTAG das Programm lesen oder
schreiben, der Code ist vor fremden augen geschützt.

Nur der Bootloader kann noch den Code ändern. Nur sollte dieser so
geschrieben sein, dass er keinen Einblick in den App-Bereich gestattet,
und die BLB-Bits sollten gesetzt werden.


Wenn der Bootloader auch noch über eine Verschlüsselung verfügt, ist
alles im Lack:
ein Fremder kann keine "Hackerfirmware" hineinladen, die irgendwas
seriell heraustackert, weil er dazu ja die Verschlüsselung kennen muß.


Du hast aber recht:
über einen Bootloader ohne verschlüsselung kann man quasi alles in den
Chip hineinbekommen, und die BLB-Bits wären hinfällig


Gruß Martin

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.