WICHTIG - Wireless Chat for Texas Instruments Graphical Calculators Copyright (C) 2008 Paul Wilhelm http://wichtig.mosfetkiller.de/ This file is part of WICHTIG. WICHTIG is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. WICHTIG is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with WICHTIG. If not, see . Dokument Titel: Aufbau der Update-Dateien Letzte Änderung: 24.12.2008 Einführung Um die Anwendungssoftware und den Systemspeicher von WICHTIG auf dem neusten Stand zu halten bzw. eigene Daten in den Benutzer- speicher zu laden, existieren Update-Dateien. Sie werden über eine herkömmliche, mit dem verwendeten Gerät kompatible Link-Software (wie z.B. TiLP) und dem dazugehörigen Link-Kabel (wie z.B. TI-SilverLink(tm)) vom Computer an das WICHTIG-Modul geschickt. Das Update wird als String verpackt verschickt. Null-Bytes wür- den den String terminieren, daher werden alle Datenbytes als Hex-Werte übertragen. Auch beim Header sind nur alphanumerische Zeichen und Ziffern zu verwenden (ASCII). Header Name Größe Wert SIGNATURE 2 "WI" Dient zum Erkennen einer gültigen WICHTIG-Updatedatei. PROTOVER 2 "00" Dieses Feld ist ein 8-Bit Hex-Wert. Die Bits 0..6 geben die Version des verwendeten Update- Protokolls an. Das höherwertigste Bit Nr. 7 (CHUNKADDR) gibt an, ob die Chunks eine Adressenangabe besitzen sollen. CHUNKADDR = 0 Das Feld ADDRESS entfällt in allen Chunks CHUNKADDR = 1 Das Feld ADDRESS ist in jedem Chunk vor- handen (Siehe weiter unten.) Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Funktion |CA | UPDATE PROTOCOL VERSION | (CA = CHUNKADDRESS) ACHTUNG: Dieses Feld darf NICHT gleich Null sein! Jedes Nullbyte im Datenstrom würde selbigen terminieren! TARGET 4 "AVRE" / "I2CA" / "I2CU" Gibt das Zielgerät an, auf dem dieses Update gespeichert werden soll. Gültige Ziele sind: AVRE EEPROM-Speicher des AVR I2CA Anwendungsspeicher (APP) (I2C-EEPROM #1) I2CU Benutzerspeicher (USR) (I2C-EEPROM #2) DATAVER 4 "0000" Die Versionsnummer des Updates. DATASIZE 4 "XXXX" Die Anzahl der zu übertragenden Datenbytes. Vorsicht: Hiermit sind die realen Bytes und NICHT die Anzahl der Buchstaben der Hex-Codierten Datenbytes ge- meint. ACHTUNG: Dieses Feld ist ein 16-Bit INTEGER-Wert in Hex- Schreibweise! CHUNKSIZE 4 "XXXX" Die Größe eines Chunks minus eins. Ist dieses Feld gleich NUll, so besteht jeder Chunk aus nur einem Byte. Siehe weiter unten für eine nähere Erläuterung der Chunk-Größen. ACHTUNG: Dieses Feld ist ein 16-Bit INTEGER-Wert in Hex- Schreibweise! CRC16HEADER 4 "XXXX" Die CRC-16 Prüfsumme aller Bytes im Header. Generatorpolynom: 0xA001 ACHTUNG: Dieses Feld ist ein 16-Bit INTEGER-Wert in Hex- Schreibweise! Data Die DATA-Section besteht aus sog. Chunks, also kleineren Datenpaketen. Diese werden in der Updatedatei nahtlos hinter den Header gereiht. Hier ist der Aufbau eines einzigen Chunks beschrieben: ADDRESS 4 "XXXX" Dieses Feld ist nur vorhanden, wenn CHUNKADDR = 1. DATA 1..512 Daten Die Datenbytes als Hex-Werte. CRC16DATA 4 "XXXX" Die CRC-16 Prüfsumme aller Bytes im DATA-Feld. Generatorpolynom: 0xA001 ACHTUNG: Dieses Feld ist ein 16-Bit INTEGER-Wert in Hex- Schreibweise! Chunks Jeder Chunk beginnt mit einer Adresse, falls CHUNKADDR = 1. Diese Adresse gibt die Position des Chunks im späteren Speicher an. Ist dieser Wert gleich Null, so wird dieser Chunk an die letzte Speicherposition geschrieben, also an den vorgegangenen Chunk angehängt. Ist die Adresse des ersten Chunks gleich Null, so wird an Speicherposition 0 begonnen. Jedem Chunk wird eine Prüfsumme angehängt. Die Behandlung einer falschen Prüfsumme wird weiter unten beschrieben. Die Größe der Chunks wird über das Feld "Chunk Size" angegeben. Sie ist maßgebend für die Übertragungsfehler in einem Transfer. Der Wert dieses Feldes + 1 ergibt die Größe der Chunks. Mit Chunk Size gleich Null, also einer Chunk-Größe von 1 Byte, entsteht zwar ein großer Overhead an Daten in der Update-Datei (ADDRESS (falls CHUNKADDR = 1) und CRC16DATA nehmen dann mehr Platz als die Nutzdaten im Chunk ein), auf diese Weise kann jedoch jedes einzelne Byte im Speicher positioniert werden (wenn CHUNKADDR = 1). Die Anzahl der Chunks und die Länge des letzten Chunks lässt sich über das "DATASIZE"-Feld im HEADER ausrechnen. NUM_CHUNKS = DATASIZE / CHUNKSIZE; LAST_CHUNK = DATASIZE % CHUNKSIZE; if (LAST_CHUNK > 0) NUM_CHUNKS++; if (LAST_CHUNK == 0) LAST_CHUNK = CHUNK_SIZE; Falsche Prüfsummen Stimmt entweder die Prüfsumme des Headers oder auch nur eines der Data-Chunks nicht mit der vom AVR aus den gesendeten Daten berechneten Prüfsumme überein, so wird die Übertragung "blind" fortgeführt, sie wird ungültig. Der Variablentransfer vom TI zum AVR wird ordnungsgemäß beendet, alle Datenbytes werden jedoch komplett ignoriert. Der Transfer der Update-Datei muss in so einem Fall komplett neu gestartet werden.