I2C Bootloader: Unterschied zwischen den Versionen
Biff (Diskussion | Beiträge) K (typos) |
Rdnzl (Diskussion | Beiträge) |
||
Zeile 1: | Zeile 1: | ||
[[Category:Zerties]] | [[Category:Zerties]] | ||
+ | [[Category:Bootloader]] | ||
== Atmega8 i2c Bootloader == | == Atmega8 i2c Bootloader == | ||
Aktuelle Version vom 4. Februar 2011, 12:32 Uhr
Atmega8 i2c Bootloader
Der Bootloader ist jetzt lauffähig und zigfach getestet.
Die aktuelle Entwicklung des Bootloaders findet man unter http://git.brokenpipe.de/cgi-bin/gitweb.cgi?p=bricolage/i2cloader;a=summary
Der Bootloader setzt nun voll auf die LibI2C es ist aber noch unter "no-libi2c" ein branch "nur für Kernel Devices" vorhanden.
Nachdem er mit einem normalen Brenner in den Atmega geschrieben ist kann man mit
./i2cloader -f dasupload.hex
die App in den Flash laden.
Um den Bootloader zu beenden und die App zu starten führt man folgendes aus
./i2cloader -e FF
Am Beispiel unseres ir-linvdr-on, es verwendet den Bootloader-Startcode 0102FF, sieht ein Upload einer neuen Version dann so aus (bei mir wird /dev/i2c-1 verwendet)
./i2cloader -d /dev/i2c-1 -f ir-linvdr-on.hex -s 0101FF -e FF
Auslesen des Flashs geht so:
./i2cloader -d /dev/i2c-1 -r 0x0000 -s 0101FF -e FF
Ohne Blinkende LED passt er in 512 bytes (256w)
Entstehung
Ziel war und ist einen BootLoader für den twi/i2c/SMBus zu schreiben.
Eigentlich wollte ich darüber keine eigene Seite erstellen aber nach den ganzen Hürden habe ich mir gedacht es könnte vielleicht doch jemand helfen. Wenn das so sein sollte lasst es mich wissen.
! *Update*
Ok (:eek:) nachdem er scheinbar recht gerne verwendet wird hab ich ihn nochmal Überarbeitet. Die 1024w Version wurde abgeschafft. Dafür gibts jetzt eine 256w Version (teensy) und die Ledanzeige steht als Alternative in der 512w Version zur Verfügung 8-)
Ziel ist es eventuelle Software Updates des IREinSchalter für den DigitalerVideorekorder über den SMBus einspielen zu können ohne den AVR in der Schaltung anfassen zu müssen.
- Adressproblem (Datenblatt vs Binutils)
Unbedingt beachten das die avr-binutils mit Bytewerten und das Datenblatt mit Wortwerten arbeitet. Ich bin darüber gestolpert das der Bootbereich laut Datenblatt bei 0xC00 beginnt d.h. das man 0x1800 setzen muss. Der Wert 0xC00 muss also *2 genommen werden.
- Interrupt Problem
Die Interrupt Tabelle des AVR muss in den Bootbereich umgeschaltet werden. Sonst gibts bei jedem Interrupt einen Hänger (Absturz). GICR = _BV(IVCE); // enable wechsel der Interrupt Vectoren GICR = _BV(IVSEL); // Interrupts auf Boot Section umschalten
- Compiler Sektionen
Damit der Compiler/Linker den Code auch im Bootloaderbereich adressiert und platziert muss man die .text Section auf die Adresse des Bootloader setzen. Makefile: avr-gcc Option -Wl,--section-start=.text=0x1800
- Start des Bootloaders aus der Applikation
Nach einer Codesequenz, bei mir 00FF00FF am I2c Bus springt man mit hilfe eines Funktionspointers zur Bootloaderstartadresse (0x1800).
- Timing
Ich habe das so gelöst das der i2c-Bus vom Bootloader solange blockiert wird bis er mit dem Flashen des Blocks fertig ist.
- Restart der Applikation
Das wird ganz einfach mit ich der Codesequenz F0FF ausgelöst
- Bootloader ohne App
Löste sich von alleine da der Atmega8 die FF im Speicher als Ilegal-Instruction ansieht und sie überspringt bis er beim Bootloader landet.
- Aufgrund der großen Protokollunterschiede zwischen SMBus und reinem i2c musste der Bootloadercode nochmal neu geschrieben werden. Damit funktioniert der Bootloader nun aber auch am SMBus im PC. Wie man an den SMBus kommt ist unter http://www.andreas-lenz.de/casemods/de/max1668.php recht gut beschrieben