/* see README.TXT for license information. You are bound by this license. */ //////////////////////////////////////////////////////////////// // Linksys VxWorks based firmware image format // Author: Jeremy Collake (jeremy@bitsum.com) // WARNING: Work In Progress. Mistakes and guesses are present. // // The firmware image header // // Revisions: // // 06/25/06 - Switched to bit size specific data types. // 06/23/06 - Added BOOTROM_BOOTP_DATA_SIZE (at end of BSP). // 06/22/06 - Identified TrailingFiles descriptors. // Added VX_FILE_ID_BOOTROM.BIN (1) // Minor tweaks // 06/21/06 - Put to use in code, found minor typos. // - Several fixes // 06/19/06 - Minor tweaks // 06/18/06 - Quick draft // // Basic format: // // VxLinksysHeader // VxFileDescriptor array // File1 // File2 // File3 // .... // TrailingFile1 // TrailingFile2 // TrailingFile3 // ... // // NOTES: // // 1. Files of pre-defined type ids are included in the firmware images // and indicate to the part of the flash they should be written. // For example, type 2 is vxworks.bin (the main OS). See // VX_FILE_ID_ definitions for a complete list. // // 2. Field sizes are for a 32-bit processor. // // 3. Example field values are taken from version 1.00.9_US: // wrt54gv5_v6_fw_1.00.9_US_code.bin // // 4. Many fields are stored big endian and operated // on my endian neutral code. // // 5. The file descriptor sizes sum up like so: // 1120664+183064+29432+28972+31280+33152+31644+30244 = 1488452 // 1488452 + 512 = 1488964 // // real file size is 1551880: // // 1551880 - 1488964 = 62916 // // The last 62916 (in the case of 1.00.9) is the // trailing parts/files, as indicated by the // TrailingFiles array of file descriptors. // // // // todo: add defintions for 64-bit systems #ifndef DWORD #define DWORD unsigned long #define WORD unsigned short #define BYTE unsigned char #endif ///////////////////////////////////////////////////////////////// // VxFileDescriptor // // file descriptor structure (array at end of VxLinksysHeader) // describes a file inside the firmware image // // fields are stored big endian, and should be read by // endian neutral code. typedef struct _VxFileDescriptor { DWORD nFileId_BigEnd; // file type (see below) DWORD nFileSize_BigEnd; } VxFileDescriptor, *pVxFileDescriptor; // Note: VX_FILE_ID_BOOTROMBIN can not be combined with any other types // of flash images. If it exists prior to other types, it will be the // only area updated, and if it exists subsequent to other types it // will not be flashed. #define VX_FILE_ID_BOOTROMBIN 1 #define VX_FILE_ID_VXWORKSBIN 2 #define VX_FILE_ID_IGWHTMDAT 3 #define VX_FILE_ID_LANGPAK_EN 6 // the BOOTP storage area holds the // serial number and boot string. // It exists at the end of the BSP. #define BOOTROM_BOOTP_DATA_SIZE 0x400 // hard coded bootrom size.. // shave off 0x400 bytes for reserved BOOTP area // at the end of the bootrom. #define BOOTROM_SIZE 327680 - 0x400 ///////////////////////////////////////////////////////////////// // VxLinksysHeader // // #pragma pack(push,1) typedef struct _VxLinksysHeader { DWORD nCodePattern; BYTE cUnknown_4[4]; BYTE cYear; BYTE cMonth; BYTE cDay; BYTE nProductVersion_0; BYTE nMinorVersion_0; BYTE cZUnknown_0D; BYTE cImageFormatVersion[4]; BYTE cZUnknown_12[238]; // // offset 0x100 -- begining of an secondary header? // // After this point, all integers are stored big endian // and should be read by endian neutral code // (that is, read as big endian). // BYTE nProductVersion_1; // orig byte byte word byte word dword byte word BYTE nMinorVersion_1; WORD nMajorVersion_1; BYTE cZUnknown_104[2]; WORD nHeaderSizeBigEnd;// 0x02, 0x00 DWORD nChecksumBigEnd; // checksum, big endian (0x611697AE) BYTE cZUnknown_10B[2]; WORD nUnknown_10D; // 0x00, 0x02 BYTE cZUnknown_110[0x30]; // 0x110 BYTE cModelName[0x20]; // 'WRT54G' BYTE cVendorName[0x20]; // 'LINKSYS' VxFileDescriptor TrailingFiles[8]; // parts of file that follow primary file descriptors VxFileDescriptor FileDescriptors[8]; // primary file descriptors, immediately follow header } VxLinksysHeader, *pVxLinksysHeader; #pragma pack(pop)