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


von Martin Raffelsieper (Gast)


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

von Martin Raffelsieper (Gast)


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

von mthomas (Gast)


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();                                  \
})

von Martin Raffelsieper (Gast)


Lesenswert?

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



Gruß
martin

von Martin Raffelsieper (Gast)


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

von Peter D. (peda)


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

von Martin Raffelsieper (Gast)


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

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.