I2C Bootloader: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
K
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 1: Zeile 1:
 
[[Category:Zerties]]
 
[[Category:Zerties]]
==  Atmeag8 i2c Bootloader ==
+
[[Category:Bootloader]]
 +
==  Atmega8 i2c Bootloader ==
  
 
''' Der Bootloader ist jetzt lauffähig und zigfach getestet.  '''
 
''' Der Bootloader ist jetzt lauffähig und zigfach getestet.  '''
Zeile 38: Zeile 39:
  
 
=== ! *Update*  ===
 
=== ! *Update*  ===
Ok (:eek:) nachdem er scheinbar recht gerne verwendet wird hab ich ihn nochmal Überarbeitet. Die 1024w Version wurde abgeschaft. Dafür gibts jetzt eine 256w Version (teensy) und die Ledanzeige steht als Alternative in der 512w Version zur Verfügung 8-)
+
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.  
+
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)
 
# 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.
 
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
 
# Interrupt Problem
Die Interrupt Tabelle des AVR muss in den Bootbereicht umgeschalten werden. Sonst gibts bei jedem Interrupt einen hänger (Absturz).
+
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(IVCE);  // enable wechsel der Interrupt Vectoren
 
GICR = _BV(IVSEL); // Interrupts auf Boot Section umschalten
 
GICR = _BV(IVSEL); // Interrupts auf Boot Section umschalten
 
# Compiler Sektionen
 
# Compiler Sektionen
Damit der Compiler/Linker den Code auch im Bootloader bereich adressiert und platziert muss man die .text Section auf die Adresse des Bootloader setzen.
+
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
 
Makefile: avr-gcc Option -Wl,--section-start=.text=0x1800
 
# Start des Bootloaders aus der Applikation
 
# Start des Bootloaders aus der Applikation
 
Nach einer Codesequenz, bei mir 00FF00FF am I2c Bus springt man mit hilfe eines Funktionspointers zur Bootloaderstartadresse (0x1800).
 
Nach einer Codesequenz, bei mir 00FF00FF am I2c Bus springt man mit hilfe eines Funktionspointers zur Bootloaderstartadresse (0x1800).
 
# Timing
 
# 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.  
+
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
 
# Restart der Applikation
 
Das wird ganz einfach mit ich der Codesequenz F0FF ausgelöst
 
Das wird ganz einfach mit ich der Codesequenz F0FF ausgelöst

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.

  1. 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.

  1. 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

  1. 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

  1. Start des Bootloaders aus der Applikation

Nach einer Codesequenz, bei mir 00FF00FF am I2c Bus springt man mit hilfe eines Funktionspointers zur Bootloaderstartadresse (0x1800).

  1. 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.

  1. Restart der Applikation

Das wird ganz einfach mit ich der Codesequenz F0FF ausgelöst

  1. 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.

  1. 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