Forum: Mikrocontroller und Digitale Elektronik AtMega32U4 Lock Bits mit updatefähigen Bootloader


von Fpdragon F. (fpdragon)


Lesenswert?

Hallo,

Ich spiele mich schon länger mit dem AtMega32U4 Arduino Bootloader und 
habe eine modifizierte Version erstellt mit der es möglich ist ein 
Arduino Sketch Update zu sperren bzw. explizit mit Kommandos 
freizuschalten. Das funktioniert eigentlich ganz gut.

Zusätzlich soll mittels Lock Bits das Auslesen der SW bzw. der EEPROM 
Daten verhindert werden.

Ich habe nun schon seit vielen Monaten immer wieder herumgesucht weil 
ich auch aus dem Datenblatt (Kapitel 27.4 Boot Loader Lock Bits) nicht 
so recht schlau werde.

Setzen kann ich folgende Bits: LB1 (0), LB2 (1), BLB01 (2), BLB02 (3), 
BLB11 (4), BLB12 (5)

Bei meiner aktuellen Konfiguration scheint die Lock Bit Konfiguration 
0x0C vielversprechend zu sein. Dabei wird BLB01 und BLB02 programmiert 
was theoretisch die "Application Section" betrifft. Fragt mich nicht wie 
ich auf diese Konfiguration gekommen bin weil es hauptsächlich durch 
herumprobieren war. Aber so scheint es nur noch möglich sein mit einem 
Chip Reset die Kontrolle über den Chip von außerhalb zu übernehmen. 
Dadurch wird alles gelöscht und weder die SW noch die EEPROM Daten 
können ausgelesen werden. Genau das will ich.

Mein AVR Dude aufruf:
1
-c arduino -p m32u4 -P COM8 -b 19200 -e -U flash:w:"bootloader.hex":i -U lfuse:w:0xFF:m -U hfuse:w:0xF8:m -U efuse:w:0xC8:m -U lock:w:0x0C:m

Aber wie gesagt: Keine Ahnung was ich da mache und ich hoffe jemand von 
euch kann mir das "deppensicher" erklären welche Lock Bit Konfiguration 
ich brauche.

Intuitiv hätte ich die Anforderungen so beschrieben:

1.) Fuse Bits oder Lock Bits sollen nicht mehr änderbar sein.

2.) Flash r/w, EEPROM r/w sollen vom Bootloader aus möglich sein.

3.) Wenn möglich soll es möglich sein aus der Application Area: Flash 
r/w, EEPROM r/w weil ich vl später mal auch im Flash Applikationsdaten 
speichern will. Ist aber noch Zukunftsmusik.

Ein Chip Reset macht natürlich alle Änderungen rückgängig und löscht 
alle Daten.

Im Prinzip würde das für mich bedeuten, dass ich nur das Schreiben der 
Fuse Bits und der Lock Bits unterbinden muss. In den Fuse Bits gebe ich 
ja bereits vor, dass man weder über Serial (SPIEN=0), noch über JTAG 
(JTAGEN=0) oder (HWBE=0) zugreifen kann. Das heißt aus meiner Sicht, 
dass weder auf den Flash, noch auf den EEPROM Speicher von außen 
zugegriffen oder verändert werden kann. (außer nach Chip Reset)

Vermutlich ist also meine Lock Bit Konfiguration falsch.

Ich kapier auch nicht was ein "LB Mode" ist und ein "BLB0 Mode" ist.
1
Further programming and verification of the Flash and EEPROM is disabled in Parallel and Serial Programming mode. The Boot Lock bits and Fuse bits are locked in both Serial and Parallel Programming mode.
Nach diesem Text hätte ich erwaretet, dass ich nur LB1 und LB2 
programmieren muss?

In diesem Fall bekomme ich aber immer eine Fehlermeldung mit AvrDude:

hfuse: 0xd8 != 0xf8

Was soviel bedeutet wie, dass Serial programming noch immer aktiv ist?! 
Oder ist das nur ein Fehler von AvrDude weil er die fuse bytes nicht 
mehr lesen kann?

Was ist der Unterschied zwischen "Lock bits" und "Boot Lock bits"?

Ich hoffe jemand kann mir Klarheit verschaffen weil ich scheine mich nur 
immer mehr zu verwirren.

Danke.

: Bearbeitet durch User
von Fpdragon F. (fpdragon)


Lesenswert?

Ich habe nun eine (meiner Meinung nach) bessere Website gefunden mit der 
man toolunterstützt die fuse bits und die lock bits bearbeiten kann.

Dabei ist mir (erstmalig xD) aufgefallen, dass die fuse bits und die 
lock bits unterschiedlich codiert sind:

fuse bits: aktiv = programmed = 0b0 = 0 (in AVRDUDESS)

lock bits: aktiv = programmed = 0b0 = checkbox checked (in AVRDUDESS)

Sprich in AVRDUDESS wird eine Programmierung unterschiedlich 
dargestellt. Das hatte bei mir auch für Verwirrung gesorgt. Letztendlich 
ist man auf der sicheren Seite wenn man die hex Zahlen verwendet.

Das ist die Konfiguration auf die ich nun gekommen bin:

https://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega32u4&LOW=FF&HIGH=D8&EXTENDED=F9&LOCKBIT=F4

Meine Gedanken waren folgende:

1.) SPIEN muss aktiviert bleiben, alle anderen Programmierinterfaces 
sollen deaktivert werden. Ich glaube es ist technisch nicht möglich 
diese Bit auf 0b1 zurückzusetzen.

2.) Application Protection Mode 4: Vom Applications-Code soll es möglich 
sein auf die Applications Flash Area schreibend zuzugreifen. Der Zugriff 
auf die Bootloader Area soll blockiert werden. (Lockbit2 = 0b1; Lockbit3 
= 0b0)

3.) Boot Loader Protection Mode 1: Der Bootloader soll auf beide 
Sektionen zugriff haben. Loader Area und Application Area. (Lockbit4 = 
0b1; Lockbit5 = 0b1)

4.) Mode 3, prog and verification disabled: Ich vermute, das bezieht 
sich auf das SPI Interface. Keine weitere Programmierung soll möglich 
sein. Chip reset wäre notwendig um eine SPI-Programmierung wieder zu 
ermöglichen. (Lockbit0 = 0b0; Lockbit1 = 0b0)

Was meint ihr? Hab ich es jetzt richtig interpretiert? Aus dem 
Datenblatt werde ich noch immer nicht so recht schlau aber mit der 
Website hab ich zu mindest eine gewisse Vorstellung bekommen wie die 
Lockbits organisiert sein könnten.

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.