summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpancake <pancake@dazo>2007-06-11 02:29:11 +0200
committerpancake <pancake@dazo>2007-06-11 02:29:11 +0200
commita3af55acb4141cd0d23f53b2ec0c5c1d2434aa22 (patch)
tree03cfa1c2e5d0c0cf39dae4be5373fb0ad4f36765
parent83b41f9371fa221ee701bb83cf5c72f5984dcfaa (diff)
download0xFFFF-a3af55acb4141cd0d23f53b2ec0c5c1d2434aa22.tar.bz2
* Initial implementation of the pretty-print config partition dumper
* Handled with the '-x' flag.
-rw-r--r--src/dump.c89
-rw-r--r--src/main.c7
-rw-r--r--src/main.h1
3 files changed, 88 insertions, 9 deletions
diff --git a/src/dump.c b/src/dump.c
index 67b3965..4b66e56 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -119,7 +119,6 @@ int mtd_open(char *file, mtd_info_t *meminfo, int *oobinfochanged,
return -1;
}
-
return fd;
}
@@ -164,11 +163,17 @@ int check_badblocks(char *mtddev)
fd = mtd_open(mtddev, &meminfo, &oobinfochanged, &old_oobinfo, &eccstats, M_RDONLY);
+ if (fd == -1) {
+ printf("cannot open mtd\n");
+ return 1;
+ }
+
fprintf(stderr, "Block size %u, page size %u, OOB size %u\n",
meminfo.erasesize, meminfo.writesize, meminfo.oobsize);
fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
meminfo.size, meminfo.flags, (int)meminfo.type);
+
oob.length = meminfo.oobsize;
for(i = 0; i < meminfo.size; i+= meminfo.writesize) {
@@ -261,6 +266,11 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
/* Read the real oob length */
oob.length = meminfo.oobsize;
+ fprintf(stderr, "Block size %u, page size %u, OOB size %u\n",
+ meminfo.erasesize, meminfo.writesize, meminfo.oobsize);
+ fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
+ meminfo.size, meminfo.flags, (int)meminfo.type);
+
if (flags & M_OMITECC) { // (noecc)
switch (ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW)) {
@@ -316,12 +326,6 @@ int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char
bs = meminfo.writesize;
- /* Print informative message */
- fprintf(stderr, "Block size %u, page size %u, OOB size %u\n",
- meminfo.erasesize, meminfo.writesize, meminfo.oobsize);
- fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
- meminfo.size, meminfo.flags, (int)meminfo.type);
-
fprintf(stderr,
"Dumping data starting at 0x%08x and ending at 0x%08x...\n",
(unsigned int) start_addr, (unsigned int) end_addr);
@@ -460,15 +464,85 @@ int is_n800()
return n800;
}
+int dump_config()
+{
+ mtd_info_t meminfo;
+ int fd = open("/dev/mtd1", O_RDONLY);
+ char buf[1024];
+ int i=0,j;
+ int ret;
+
+
+ if (fd == -1) {
+ perror("open /dev/mtd1");
+ return 1;
+ }
+ if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
+ perror("MEMGETINFO");
+ close(fd);
+ return 1;
+ }
+
+ while(i<0x60000) {
+ iniloop:
+ ret = read(fd, buf, 4);
+ if (ret == -1)
+ break;
+ if (!memcmp(buf,"ConF", 4)) {
+ loop:
+ read(fd, buf, 4);
+ if (ret == -1) break;
+ printf("\n0x%08x : ConF %02x %02x %02x %02x : ", i,
+ buf[0], buf[1], buf[2], buf[3]);
+ fflush(stdout);
+ while(1) {
+ ret = read(fd, buf, 4);
+ if (ret <1) {
+ printf("Unexpected eof\n");
+ break;
+ }
+ if (buf[0]=='\0'||buf[1]=='\0'||buf[2]=='\0'||buf[3]=='\0') {
+ printf("%s \t ", buf);
+ fflush(stdout);
+ while(1) {
+ ret = read(fd, buf, 4);
+ if (ret <1) {
+ printf("Unexpected eof\n");
+ break;
+ }
+ if (!memcmp(buf,"\xff\xff\xff\xff", 4))
+ goto iniloop;
+ if (!memcmp(buf,"ConF", 4))
+ goto loop;
+ printf ("%02x %02x %02x %02x ",
+ buf[0], buf[1], buf[2], buf[3]);
+ }
+ break;
+ } else {
+ write(1, buf,4);
+ }
+ }
+ }
+ j = lseek(fd, 0, SEEK_CUR);
+ if (j==i) break; i = j;
+ }
+ close(fd);
+ printf("\n");
+ return 0;
+}
+
int reverse_extract_pieces(char *dir)
{
char reply;
chdir(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");
//rf_extract("/dev/mtd0", 0x004000, 0x01ffff, "secondary.bin");
nanddump("/dev/mtd0", 0x004000, 0, "secondary.bin");
+ nanddump("/dev/mtd1", 0x060000, 0, "config.bin");
//rf_extract("/dev/mtd2", 0x000800, 0x200000, "zImage");
nanddump("/dev/mtd2", 0x000800, 0, "zImage");
//rf_extract("/dev/mtd3", 0x000000, 0x1D00000, "initfs.jffs2");
@@ -493,6 +567,7 @@ int reverse_extract_pieces(char *dir)
printf("\nIdentifying extracted files...\n");
printf("%s: xloader\n", fpid_file("xloader.bin"));
printf("%s: secondary.bin\n", fpid_file("secondary.bin"));
+ printf("%s: config.bin\n", fpid_file("config.bin"));
printf("%s: zImage\n", fpid_file("zImage"));
printf("%s: initfs.jffs2\n", fpid_file("initfs.jffs2"));
printf("%s: rootfs.jffs2\n", fpid_file("rootfs.jffs2"));
diff --git a/src/main.c b/src/main.c
index 045ad1f..4c66917 100644
--- a/src/main.c
+++ b/src/main.c
@@ -93,6 +93,7 @@ void show_usage()
printf(" -d [vid:pid] injects a usb device into the supported list\n");
printf(" -D [0|1|2] sets the root device to flash (0), mmc (1) or usb (2)\n");
printf(" -R reboot the omap board\n");
+ printf(" -x extract configuration entries from /dev/mtd1\n");
printf(" -v be verbose and noisy\n");
printf(" -V show 0xFFFF version information\n");
printf("Pieces are: ");
@@ -152,8 +153,10 @@ int main(int argc, char **argv)
{
int c;
- while((c = getopt(argc, argv, "C:cp:vVhRu:ib:U:r:e:ld:I:D:f:s:")) != -1) {
+ while((c = getopt(argc, argv, "C:cp:vVhRu:ib:U:r:e:ld:I:D:f:s:x")) != -1) {
switch(c) {
+ case 'x':
+ return dump_config();
case 'c':
return console_prompt();
case 'd':
@@ -240,7 +243,7 @@ int main(int argc, char **argv)
&& (root_device == -1))
{
printf("Usage: 0xFFFF [-hvVRi] [-e path] [-U 0|1] [-p [piece%%]file [-p ...]]\n");
- printf(" [-b boot-args] [-I piece [-I ...]] [-u fiasco-image]\n");
+ printf(" [-b boot-args] [-I piece [-I ...]] [-u fiasco-image] [-x]\n");
printf(" [-D 0|1|2] [-F rd flags] [-s serial-dev] [-c] [-C mtd-dev]\n");
return 1;
}
diff --git a/src/main.h b/src/main.h
index 0d8b16b..7895c5c 100644
--- a/src/main.h
+++ b/src/main.h
@@ -30,6 +30,7 @@ int console_prompt();
//
void cmd_info(char *line);
int check_badblocks(char *mtddev);
+int dump_config();
extern int verbose;
#define D if (verbose)