,---------[ teledat.sourceforge.net ]---------- | Autor: Felix Schwarz | Webseite: teledat.sourceforge.net | |--------- Changelog --------- | 20.07.03 fs Anpassung der Protokollnummerierung (v3.0 und v3.1) | 11.05.03 fs Hinweise von Jörg Friedrich zum Dateiformat | 19.04.03 fs kleine Anpassungen bez. Kommentaren | 27.02.03 fs diese Datei erstellt | `--------- -------------------------------------------------------------------------------- Im folgenden geht es um die Kodierung der AVM-Firmware sowie das Protokoll für den Firmware-Upload. [Dateiformat] Hinweis: Das Dateiformat scheint der Spezifikation des "Intel Hex-32"-Formats zu entsprechen. Eine Spezifikation findet sich unter www.intel.com/design/zapcode/Intel_HEX_32_Format.doc Alle Zeilen, die mit einem Semikolon ';' beginnen, enthalten keine direkte Firmware, sondern sind Meta-Informationen. Die Firmware beginnt immer mit einem Doppelpunkt. Außerdem sind die Firmware-Zeilen alle einheitlich 520 Zeichen lang (effektive Größe also 260 Zeichen, s.u.). Dies dürfte seinen Grund in der Pufferung haben. Die erste Zeile besteht immer aus " ;[Anlagenkennung]\n", wobei die Anlagenkennung um 7 Zeichen lang ist (entweder "F!X-USB" oder "ALADIN1"). In der nächsten Zeile kommt die Firmware-Version, z.B. also " ;011642\n" für Version 01.16.42 . Die beiden ersten Zeilen sind obligatorisch, es darf kein anderer Kommentar davor oder dazwischen erscheinen. Das Leerzeichen vor dem Semikolon ist nicht so wichtig. Ansonsten dürfen Kommentare an beliebiger Stelle in der Firmware-Datei auftauchen. Irgendwo in der Firmware ist auch noch die richtige Versionsnummer gespeichert, die unabhängig von dem Kommentar am Anfang ist (wenn man in den Kommentar am Anfang eine beliebige Nummer schreibt, meldet die Anlage nach dem Flashen trotzdem nicht die beliebige Nummer). Die Firmware der Fritz!X PC v2/v3, der Fritz!X USB v1/v2, der 1&1 NetXXL sowie der Teledat USB ist bis auf die Anlagenkennung in der ersten Zeile identisch. Die Firmware ist in mehrere Blöcke aufgeteilt. Ein Block enthält max. 255 Zeilen oder wird aufgetrennt in mehrere Abschnitte à max. 255 Zeilen. Auffällig sind die ersten vier Bytes jeder Datenzeile (Ausnahme kann die letzte Zeile eines Blocks/Abschnitts sein): Die erste Zeile beginnt mit FF 00 00 00. Ab der zweiten sieht es folgendermaßen aus: FF (a) (b) 00 (a) ist ein Byte-Zähler, der bei 0x00 startet und bis 0xFF hochläuft. (b) funktioniert wie a, nur dass e von 0xFF bis 0x00 läuft. Die Summe von a und b sollte also immer 0xFF ergeben. Vermutlich enthalten die letzten Zeilen jedes Blocks immer noch eine Prüfsumme, die von der Anlage verwendet wird. Sollte eine der Prüfsummen nicht mit den Daten übereinstimmen, schlägt das Update fehl. Es ist übrigens kein Problem, wenn dies passiert: Verbindung trennen, Anlage den Strom abdrehen, wieder einstecken und neu flashen. Ansonsten sind alle Zeichen in der eigentlichen Firmware in Ascii kodiert (wie man leicht sieht, gibt es kein einziges Binärzeichen in der Firmware): Für jedes Zeichen wird einfach sein Hex-Code in die Firmware geschrieben. Folglich ist die Firmware also nur halb so groß. [Schematischer Firmware-Aufbau] " ;[Anlagenkennung]\n" - nur für die Software zur Überprüfung gedacht " ;[Firmware-Version]\" - dito :020001030000FA :02000002A0005C :FF000000... - Start der Firmware :FF (Hochzähler) (Runterzähler) 00 ... - Firmware-Daten ... (die letzte Zeile fängt nicht mit FF an, sondern es kommen gleich die Daten) :02000002AFFF4E # Meta-Daten für die Anlage! :10000000EA000057A74D415454FF55A0A547BA0038 # ebenso :00000001FF # und hier vermutlich auch ;block2 :020001030000FA :02000002B0004C :FF00000053CB000000000000800676258BB18078480E8BB1207AB01D8BB120067A0D8BB1200E5A0D8BB14006EC2D8BB1800AE8298BB180026C2A8BB1800CA22D8BB18004C62B8BB1200ACE288BB1200CD82C8BB18010D02D8BB1802CAA1463C18032BA1463C18034C01363C180364C1463C100000000000002000000010002000300040007000800090000000100020003000400050007000800090000000100020003000400070008000900000007000000020003000000060000000100040000000100020003000400050007000800090000000700000007000000080000000800000007000000070000000900000007000800000007000800000007000800000007D5 :FF (Hochzähler) (Runterzähler) 00 ... - Firmware-Daten ... (die letzte Zeile fängt nicht mit FF an, sondern es kommen gleich die Daten) # jetzt gibt es mehr als 255 Zeilen in einem Block, also "Werbepause" :FFFF0000B183C402509AD8DC8BB18B5E0A83C4048907E9920090C746F80100C746FE88AAFF76069A08DC8BB183C4028946FC0BC074528B5EFE8B1F2AE48A07FF4EFC3B46FC7531FF76069AB2DB8BB183C4028946FA0BC0742F8B5EFE8B4EFC8B1F8D7F011E078BF0D1E91BC03BC9F3A775042BC8F3A67416FF46F88346FE02817EFE90AA729EEB1D33C05E5FC9CB8B5E088B46F889078B5EFA8B76FC8A008B5E0A2AE48907837EF80573DDB801005E5FC9CB803E92AA007505C60692AA01A092AAFE0692AA98CB00C80E000057568B76068A04241F3C11740733C05E5FC9CB908D7C01579A5EDB8BB183C4028946F20BC074E68A052AE42DA1007416487503E9AA014810 :01FFFF00758C :02000002C0003C :FF00000003E94C03487503E99004E99A0590579AB2DB8BB183C4028BF00BF074B8569A08DC8BB183C40250569AB2DB8BB183C402509AD8DC8BB183C4048BF8569A5EDB8BB183C4028BF00BF0748B803C80752E569A08DC8BB183C40250569AB2DB8BB183C402509AD8DC8BB183C404569A5EDB8BB183C4028BF00BF07503E958FF8D46F8508D46F450569A20E68BB183C4060BC07503E940FF569A5EDB8BB183C4028BF00BF07503E92EFF897EFA8976FE8B7EF28B4EFA8B46F40BC0741C487503E99C00487503E9C600487503E9C800487503E9D000E9D204908B46F82D06003D1E007603E9C30403C0932EFFA73CE87AE88AE88AE88AE88AE88AE88AE88AE88AE88ADA :FFB34C00560A89470889570A8B47060B47047505C747020000C9CA0C0000558BEC57568B760656578BDE8B57028B7F088B770A9CFAFF5F045F5E5E5FC9CA0200558BEC568B7606C7041CB5C744020000569A4E9E63C15EC9CA020000FF3630B09A029263C1CB558BECFF7606FF3630B09A429263C1C9CB00558BEC8B5E068B4702C9CA020000558BEC568B7606569A589D63C1F64608017407569A7E9D63C15B8BC65EC9CA040000558BEC568B7606569A4E9E63C1F64608017407569A668A63C15B8BC65EC9CA040000B80100CA0200558BEC8B460C8B5E068B560E894702895704C9CA0A00558BEC8B46088B5E068B560A894702895704C9CA0600558BEC8B5E068B8A :D6B44B0047028B5704C9CA0200558BEC8B46088B560AC9CA060000FF3632B09A029263C1CB558BECFF7606FF3632B09A429263C1C9CB00558BEC8B5E06C7072CB5C9CA020000000000FAFC8CD38BCC8CDAB800018ED0BCAC0D2E8E1E8F008C069EA42E8E068F00891EA0A4890EA2A48916A4A48936A6A4893EA8A4B800B08ED8BE0000BFB0A4B940B52BCFE304D1E9F3A52E8E068F00BF0000B99EA42BCFE30633C0D1E9F3AB2E8E1E8F002E8E068F00FB9A44023DB12E8E1E8F008E069EA4FA8B36A6A48B3EA8A48E16A0A48B26A2A48B1EA4A48EDBFBCB0001FB :02000002CFFF2E :10000000EA000049CB4D415454FF55B0BDE30B010C :00000001FF ;block3 :020001030000FA :02000002D0002C :FF00000000000000000002800000B82900704E3231583423000601004E323158302A000601004E3231315923000601004E3231314E23000601004E3231325923000601004E3231324E23000601004E3231583123000600004E3231583223000600004E3231583623000600004E5858392300000500004E313030332300060000000000000000000000009833A13000000040000000000000000200FF01020408102040800000010002000100030001000200010004000100020001000300010002000100050001000200010003000100020001000400010002000100030001000200010006000100020001000300010002000100040001000200010003000100020001DF :FF (Hochzähler) (Runterzähler) 00 ... - Firmware-Daten ... (die letzte Zeile fängt nicht mit FF an, sondern es kommen gleich die Daten) :FFF50A00C603D803DB8B87308EA3C28E3B060CC57422FF06DE90C98B1E0CC583C40489278C57028B1EC28E891E0CC58B278E5702071F61CFC9CB8B1EC63E891EB840807F050F7447FA837F0600742EFF4F068B1EB840837F06007521F647040875168A470D0806C83E8A470C8A5F0B2AFF0887CA3EEB0690C747060100FB8B1EB8408B5F12891EB840807F050F75B9CB00000000000000000000FAFCBA28FFB8FFFFEFBA2AFFB80700EFBAA0FFB8BC80EFBAF4FFED80E4F080FC30741780FC207409BAA2FFB8BC7FEFEB37BAACFFB8FF03EFEB2EBA70FFB80000EFBA76FFEFBA72FFB80F7CEFBA78FFB8FFFEEFBAE2FFB87002EFBAE4FFB80080EFBAA2FFB8FC7FEFB833 :41F6090000708ED0BC0001BB00708EC3B800D08ED8BE0000BFD0C5B910CE2BCFE304D1E9F3A5BF0000B9C4C52BCFE30633C0D1E9F3AB8EDB8C1E000EFB9A4C8D9CD0E956FF87 :02000002EFFF0E :10000000EA00005ADF4D415454FF55D0183A7901A7 :00000001FF [Ablauf eines Firmware-Uploads] (an Hand einer 1&1 NetXXL) Die Software muss mindestens prüfen, ob die Anlagenkennung in der Firmware-Datei passt (ev. riskante Prüfung, in dem kompatible Anlagen wie Fritz!X PC v1/v2 oder Fritz!X USB und 1&1 NetXXL als gleichwertig erkannt werden). Außerdem sollte geprüft werden, ob die Firmware-Version der Datei tatsächlich höher ist als die bisherige (ansonsten Warnung). Grundlegende Prüfung der Datei auf: (+) richtiges Format: Fängt jede Zeile mit ":" oder ";" an? (+) Fangen die Datenzeilen mit ":FF" an (oder nur mit ":" an den richtigen Stellen?) (+) Sind alle Zeilen genau 512 + 3 +2 Bytes lang? (+) Stimmt die Anfangsnummerierung? (+) Sind alle Blöcke mit den richtigen Vorspann und Abspann umgeben? (+) Weitergehende Integritätsprüfungen sind vermutlich möglich (Prüfsummen?), die Mechanismen hierfür jedoch unbekannt. (+) Stimmt die Angabe der Versionsnummer am Anfang mit der irgendwo in der Firmware gespeicherten Nummer überein? Start der Übertragung (für jeden Block gleich): 7E FF 90 01 3E A0 7E Antwort der Anlage: 7E FF D0 00 69 4F 7E Abschließend zwei Requests für den Vorspann: 7E FF 91 (Daten) (CRC) 7E Antwort der Anlage: 7E FF D1 00 70 97 7E Die Daten sind direkt der Firmware-Datei entnommen, jedoch wird das letzte Byte der Firmware-Datei nicht übertragen, hier vermute ich eine einfache Prüfsumme (CRC 8? Bitsumme?). Die Daten werden ggf. maskiert wie in protokoll_v31.txt beschrieben. <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E Jetzt beginnt der erste Block <- 7E FF 91 (Daten) (CRC) 7E Die Daten sind genau 259 Bytes lang, außer beim letzten Block -> 7E FF D1 00 70 97 7E Sollte ein Block mehr als 255 Zeilen beinhalten, gibt es eine "Werbepause", <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E (Die Daten stammen wiederum aus der Firmware-Datei) Danach geht es normal weiter bis zum Ende des Blocks. Hier gibt es einen 3zeiligen Abspann, der wieder in der gewohnte Weise übertragen wird: <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E <- 7E FF 91 (Daten) (CRC) 7E -> 7E FF D1 00 70 97 7E Nach dem letzten Block ist der Upload einfach zu Ende. Sinnvollerweise überprüft die Software (ggf. nach einer kleinen Wartezeit, damit die Anlage sich reseten kann), ob die Firmware wirklich richtig übertragen wurde. Hierzu bietet sich das Identifizierungskommando an, in dem auch die Firmware-Version übertragen wird. -------------------------------------------------------------------------------- TODO: Was passiert, wenn eine Zeile durch Escaping länger als 259 Bytes wird? Werden die restlichen Bytes dann in den nächsten Request gepackt oder die Zeile einfach länger? Verifikation des Protokolls mit anderen Anlagen -------------------------------------------------------------------------------- Dank an: Jörg Friedrich (Hinweis auf Intel Hex-32) -------------------------------------------------------------------------------- ,---------- [ COPYING ] ----------- | Permission is granted to copy, distribute and/or modify this document | under the terms of the GNU Free Documentation License, Version 1.1 or | any later version published by the Free Software Foundation; with no | Invariant Sections, no Front-Cover Texts and no Back-Cover Texts. A | copy of the license can be obtained under | http://www.gnu.org/licenses/fdl.txt `----------------------------------