From 34c8fb057dd04a62131410d607d5d605f27115f1 Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 23 Jun 2012 10:43:20 +0200 Subject: * Apply Pali Rohár patch - Add support for device and hw revisions specified in hw pieces - Updated documentation - Fixed problems when unpacking - Ready for mmc and cold flashing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/fiasco | 19 ++++++++++-- src/devices.c | 22 +++++++------- src/fiasco.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- src/fpid.c | 11 +++++-- src/main.h | 19 ++++++++++-- 5 files changed, 132 insertions(+), 32 deletions(-) diff --git a/doc/fiasco b/doc/fiasco index ef8cf00..bf19f2f 100644 --- a/doc/fiasco +++ b/doc/fiasco @@ -16,13 +16,26 @@ FILE HEADER PIECE HEADER 1 byte = 0x54 -- piece signature - 6 bytes -- unknown + 1 byte -- unknown: + N800/N810: + 0x02 - initfs, rootfs, kernel (2007) + 0x03 - xloader, 2nd, secondary, kernel (DIABLO) + N900: + 0x03 - kernel, rootfs, cmt-2nd, cmt-algo, cmt-mcusw + 0x04 - xloader, 2nd, secondary + 0x05 - mmc + 5 bytes -- unknown (always 0x2e 0x19 0x01 0x01 0x00) 2 bytes -- checksum for the piece contents (xorpair) 12 bytes -- piece name (first byte is FF if is the last) 4 bytes -- piece size (big endian) - 4 bytes -- unknown + 4 bytes -- unknown (always 0x00 0x00 0x00 0x00) block { - 1 byte -- if (value '1'-'9') { ..there's a comment.. } + 1 byte -- if (value '1'-'4' or '/') { ..there's a comment.. } + '1' - version + '2' - device & hw revisions + '3' - layout + '4' - unknown + '/' - unknown 1 byte -- length of comment N bytes -- comment } diff --git a/src/devices.c b/src/devices.c index 0f15d47..50b7f69 100644 --- a/src/devices.c +++ b/src/devices.c @@ -1,6 +1,7 @@ /* * 0xFFFF - Open Free Fiasco Firmware Flasher * Copyright (C) 2007-2009 pancake + * Copyright (C) 2012 Pali Rohár * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,19 +30,20 @@ * * The following table shows this info: * - * boot os - * n770 0421:0105 0421:0431 - * n800 0421:0431 - * n900 0421:0105 0421:01c7 + * cold-flash flash emmc-flash mass-stor pc-suite + * n770 0421:0105 0421:0431 + * n800 0421:04c3 0421:0431 + * n810 0421:0105 + * n900 0421:0106 0421:0105 0421:???? 0421:01c7 0421:01c8 * */ struct devices supported_devices[SUPPORTED_DEVICES] = { - { "FFFF", 0x000, 0x0000, 0x0000 }, // dummy - { "unkn", 0x421, 0x3f00, 0x0000 }, // probably a development board - { "n770/n810/n900", 0x421, 0x0105, 0x0001 }, - { "n800", 0x421, 0x04c3, 0x0001 }, // a n800 -// { "n900", 0x421, 0x01c7, 0x0001 }, // a pre-production n900 -// { "n900", 0x421, 0x0105, 0x0001 }, // a pre-production n900 + { "FFFF", 0x0000, 0x0000, FLASH_NORMAL }, // dummy + { "unkn", 0x0421, 0x3f00, FLASH_NORMAL }, // probably a development board + { "n800", 0x0421, 0x04c3, FLASH_NORMAL }, // a n800 + { "n770/n810/n900", 0x0421, 0x0105, FLASH_NORMAL }, + { "n900", 0x0421, 0x0106, FLASH_COLD }, +// { "n900", 0x0421, 0x????, FLASH_EMMC }, { 0 }, { 0 } }; diff --git a/src/fiasco.c b/src/fiasco.c index bb9a69a..7fccc4b 100644 --- a/src/fiasco.c +++ b/src/fiasco.c @@ -1,6 +1,7 @@ /* * 0xFFFF - Open Free Fiasco Firmware Flasher * Copyright (C) 2007-2011 pancake + * Copyright (C) 2011-2012 Pali Rohár * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +40,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) off_t off, here; int i; + memset(&header, 0, sizeof(header)); header.fd = open(name, O_RDONLY); if (header.fd == -1) { @@ -77,9 +79,11 @@ int openfiasco(const char *name, const char *piece_grep, int v) i = 0; while(1) { - if (read(header.fd, buf, 7)<7) + if (read(header.fd, buf, 7)<7) { + printf("Next valid header not found\n"); return close(header.fd); - if (buf[0] == 0x54 /*&& buf[1] == 0x04*/ && buf[2] == 0x2E && buf[3] == 0x19 && buf[4] == 0x01 && buf[5] == 0x01 && buf[6] == 0x00) + } + if (buf[0] == 0x54 && buf[2] == 0x2E && buf[3] == 0x19 && buf[4] == 0x01 && buf[5] == 0x01 && buf[6] == 0x00) break; lseek(header.fd, -6, SEEK_CUR); ++i; @@ -99,7 +103,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) printf(" [eof]\n"); break; } else if (v) printf(" %s\n", data); - strcpy(header.name, (char *)data); + strcpy(header.type, (char *)data); if (v) { printf(" header: "); @@ -108,7 +112,7 @@ int openfiasco(const char *name, const char *piece_grep, int v) } if (read(header.fd, buf, 9)<9) - break; + return close(header.fd); memcpy(&header.size, buf,4); header.size = ntohl(header.size); if (v) { @@ -120,23 +124,61 @@ int openfiasco(const char *name, const char *piece_grep, int v) // buf[4], buf[5], buf[6], buf[7], buf[8]); /* XXX this is not ok */ //printf("BUF8: %02x\n", buf[8]); - while (buf[8] && buf[8]>'0' && buf[8] < '9') { + memset(header.device, 0, sizeof(header.device)); + memset(header.hwrev, 0, sizeof(header.hwrev)); + memset(header.version, 0, sizeof(header.version)); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } + while ((buf[8] >= '1' && buf[8] <= '4') || buf[8] == '/') { if (read(header.fd, data, 1)<1) - break; + return close(header.fd); i = data[0]; if (read(header.fd, data, i) %s\n", header.name); if (fiasco_callback != NULL) { fiasco_callback(&header); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } free(header.data); continue; } else { @@ -171,6 +232,10 @@ int openfiasco(const char *name, const char *piece_grep, int v) // XXX dup lseek(header.fd, off, SEEK_SET); lseek(header.fd, header.size, SEEK_CUR); + if (header.layout) { + free(header.layout); + header.layout = NULL; + } } return close(header.fd); } diff --git a/src/fpid.c b/src/fpid.c index f36b758..60c1381 100644 --- a/src/fpid.c +++ b/src/fpid.c @@ -1,6 +1,7 @@ /* * 0xFFFF - Open Free Fiasco Firmware Flasher * Copyright (C) 2007 pancake + * Copyright (C) 2012 Pali Rohár * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,12 +24,16 @@ /* global structs */ char *pieces[] = { "xloader", // xloader.bin - "2nd", // 2nd + "2nd", // 2nd.bin "secondary", // secondary.bin "kernel", // zImage - "initfs", // jffs'd initfs - "rootfs", // 80mB of blob + "initfs", // initfs + "rootfs", // rootfs "omap-nand", // 8kB of food for the nand + "mmc", // raw eMMC image + "cmt-2nd", // cmt-2nd + "cmt-algo", // cmt-algo + "cmt-mcusw", // cmt-mcusw "fiasco", // FIASCO IMAGE NULL }; diff --git a/src/main.h b/src/main.h index 766abea..05c92ad 100644 --- a/src/main.h +++ b/src/main.h @@ -62,11 +62,18 @@ struct piece_t { char *vers; }; +enum flash_mode { + FLASH_COLD, + FLASH_NORMAL, + FLASH_EMMC, + FLASH_ANY +}; + struct devices { char *name; unsigned short vendor_id; unsigned short product_id; - unsigned short flags; + enum flash_mode mode; }; #define SUPPORTED_DEVICES 6 @@ -83,6 +90,10 @@ enum { PIECE_INITFS, PIECE_ROOTFS, PIECE_OMAPNAND, + PIECE_MMC, + PIECE_CMT_2ND, + PIECE_CMT_ALGO, + PIECE_CMT_MCUSW, PIECE_FIASCO, PIECE_LAST }; @@ -90,11 +101,15 @@ enum { struct header_t { int fd; char fwname[128]; - char name[128]; char version[128]; + char type[128]; + char device[16]; + char hwrev[128]; + char name[128]; unsigned short hash; unsigned int size; unsigned char *data; + char *layout; }; extern char *pieces[]; -- cgit v1.2.3