summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpancake <pancake@dazo>2007-06-16 05:21:14 +0200
committerpancake <pancake@dazo>2007-06-16 05:21:14 +0200
commitc1d909c41587eb0f4b0581c5be9b70b2b72aefdb (patch)
treec55d4ab27cf372e9a9a336210c7862b745db2167
parent579dbe983733df293b620143d3a18f9bbcabcec7 (diff)
download0xFFFF-c1d909c41587eb0f4b0581c5be9b70b2b72aefdb.tar.bz2
* Fix the dump of xloader and secondary.bin
- Looks like they protect these blocks by marking this section as badblocks. - We just ignore badblock marks when dumping the bootloader * Handle feof (^D) on the prompt
-rw-r--r--src/dump.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/src/dump.c b/src/dump.c
index 4b66e56..af453a4 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -241,7 +241,7 @@ closeall:
return 1;
}
-int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char *dumpfile)
+int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char *dumpfile, int isbl)
{
unsigned char readbuf[2048];
int oobinfochanged = 0 ;
@@ -332,9 +332,6 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
/* Dump the flash contents */
for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
-
- progressbar(ofs, end_addr);
-
// new eraseblock , check for bad block
if (blockstart != (ofs & (~meminfo.erasesize + 1))) {
blockstart = ofs & (~meminfo.erasesize + 1);
@@ -344,7 +341,7 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
}
}
- if (badblock) {
+ if (!isbl && badblock) {
if (omitbad)
continue;
memset (readbuf, 0xff, bs);
@@ -376,10 +373,14 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
/* Write out page data */
//if (pretty_print) dump_bytes(readbuf, bs);
- write(ofd, readbuf, bs);
+ progressbar(ofs, end_addr);
- if (badblock) {
- printf("Oops badblock %d at 0x%lx !\n", badblocks++, ofs);
+ // OOB STUFF //
+ if (omitoob)
+ continue;
+
+ if (!isbl&&badblock) {
+ printf("Oops badblock %d *ignored* at 0x%lx !\n", badblocks++, ofs);
memset (readbuf, 0xff, meminfo.oobsize);
} else {
/* Read OOB data and exit on failure */
@@ -390,9 +391,6 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
}
}
- if (omitoob)
- continue;
-
/* Write out OOB data */
D dump_bytes(oobbuf, meminfo.oobsize);
write(ofd, oobbuf, meminfo.oobsize);
@@ -539,20 +537,20 @@ int reverse_extract_pieces(char *dir)
// TODO: get values from /proc/mtd ???
//rf_extract("/dev/mtd0", is_n800()?0x200:0, 0x003600, "xloader.bin");
- nanddump("/dev/mtd0", is_n800()?0x200:0, 0, "xloader.bin");
+ nanddump("/dev/mtd0", is_n800()?0x200:0, 0x4000, "xloader.bin", 1); // 0x3600 size?
//rf_extract("/dev/mtd0", 0x004000, 0x01ffff, "secondary.bin");
- nanddump("/dev/mtd0", 0x004000, 0, "secondary.bin");
- nanddump("/dev/mtd1", 0x060000, 0, "config.bin");
+ nanddump("/dev/mtd0", 0x004000, 0, "secondary.bin", 1);
+ nanddump("/dev/mtd1", 0, 0, "config.bin", 0);
//rf_extract("/dev/mtd2", 0x000800, 0x200000, "zImage");
- nanddump("/dev/mtd2", 0x000800, 0, "zImage");
+ nanddump("/dev/mtd2", 0x000800, 0, "zImage", 0);
//rf_extract("/dev/mtd3", 0x000000, 0x1D00000, "initfs.jffs2");
- nanddump("/dev/mtd3", 0x000000, 0, "initfs.jffs2");
+ nanddump("/dev/mtd3", 0x000000, 0, "initfs.jffs2", 0);
printf("\n\nExtract rootfs? (y/N): "); fflush(stdout);
read(0, &reply, 1);
if (reply=='y'||reply=='Y') {
//rf_extract("/dev/mtd4", 0x000000, 0x6000000, "rootfs.jffs2");
- nanddump("/dev/mtd4", 0x000000, 0, "rootfs.jffs2");
+ nanddump("/dev/mtd4", 0x000000, 0, "rootfs.jffs2", 0);
} else printf("*** Ignoring rootfs\n");
printf("\n\nStrip dumped files? (y/N): "); fflush(stdout);