* Initial implementation of the pretty-print config partition dumper

* Handled with the '-x' flag.
This commit is contained in:
pancake committed 2007-06-11 02:29:11 +02:00
1 parent 83b41f9371
commit a3af55acb4
3 files changed
+88 -9

No files matched your search

+82 -7
View File
@@ -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"));
+5 -2
View File
@@ -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;
}
+1
View File
@@ -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)