* Initial implementation of the pretty-print config partition dumper
* Handled with the '-x' flag.
This commit is contained in:
1 parent
83b41f9371
commit
a3af55acb4
3 files changed
+88
-9
No files matched your search
+82
-7
@@ -119,7 +119,6 @@ int mtd_open(char *file, mtd_info_t *meminfo, int *oobinfochanged,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,11 +163,17 @@ int check_badblocks(char *mtddev)
|
|||||||
|
|
||||||
fd = mtd_open(mtddev, &meminfo, &oobinfochanged, &old_oobinfo, &eccstats, M_RDONLY);
|
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",
|
fprintf(stderr, "Block size %u, page size %u, OOB size %u\n",
|
||||||
meminfo.erasesize, meminfo.writesize, meminfo.oobsize);
|
meminfo.erasesize, meminfo.writesize, meminfo.oobsize);
|
||||||
fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
|
fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
|
||||||
meminfo.size, meminfo.flags, (int)meminfo.type);
|
meminfo.size, meminfo.flags, (int)meminfo.type);
|
||||||
|
|
||||||
|
|
||||||
oob.length = meminfo.oobsize;
|
oob.length = meminfo.oobsize;
|
||||||
for(i = 0; i < meminfo.size; i+= meminfo.writesize) {
|
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 */
|
/* Read the real oob length */
|
||||||
oob.length = meminfo.oobsize;
|
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)
|
if (flags & M_OMITECC) { // (noecc)
|
||||||
switch (ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW)) {
|
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;
|
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,
|
fprintf(stderr,
|
||||||
"Dumping data starting at 0x%08x and ending at 0x%08x...\n",
|
"Dumping data starting at 0x%08x and ending at 0x%08x...\n",
|
||||||
(unsigned int) start_addr, (unsigned int) end_addr);
|
(unsigned int) start_addr, (unsigned int) end_addr);
|
||||||
@@ -460,15 +464,85 @@ int is_n800()
|
|||||||
return 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)
|
int reverse_extract_pieces(char *dir)
|
||||||
{
|
{
|
||||||
char reply;
|
char reply;
|
||||||
chdir(dir);
|
chdir(dir);
|
||||||
|
|
||||||
|
// TODO: get values from /proc/mtd ???
|
||||||
|
|
||||||
//rf_extract("/dev/mtd0", is_n800()?0x200:0, 0x003600, "xloader.bin");
|
//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, 0, "xloader.bin");
|
||||||
//rf_extract("/dev/mtd0", 0x004000, 0x01ffff, "secondary.bin");
|
//rf_extract("/dev/mtd0", 0x004000, 0x01ffff, "secondary.bin");
|
||||||
nanddump("/dev/mtd0", 0x004000, 0, "secondary.bin");
|
nanddump("/dev/mtd0", 0x004000, 0, "secondary.bin");
|
||||||
|
nanddump("/dev/mtd1", 0x060000, 0, "config.bin");
|
||||||
//rf_extract("/dev/mtd2", 0x000800, 0x200000, "zImage");
|
//rf_extract("/dev/mtd2", 0x000800, 0x200000, "zImage");
|
||||||
nanddump("/dev/mtd2", 0x000800, 0, "zImage");
|
nanddump("/dev/mtd2", 0x000800, 0, "zImage");
|
||||||
//rf_extract("/dev/mtd3", 0x000000, 0x1D00000, "initfs.jffs2");
|
//rf_extract("/dev/mtd3", 0x000000, 0x1D00000, "initfs.jffs2");
|
||||||
@@ -493,6 +567,7 @@ int reverse_extract_pieces(char *dir)
|
|||||||
printf("\nIdentifying extracted files...\n");
|
printf("\nIdentifying extracted files...\n");
|
||||||
printf("%s: xloader\n", fpid_file("xloader.bin"));
|
printf("%s: xloader\n", fpid_file("xloader.bin"));
|
||||||
printf("%s: secondary.bin\n", fpid_file("secondary.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: zImage\n", fpid_file("zImage"));
|
||||||
printf("%s: initfs.jffs2\n", fpid_file("initfs.jffs2"));
|
printf("%s: initfs.jffs2\n", fpid_file("initfs.jffs2"));
|
||||||
printf("%s: rootfs.jffs2\n", fpid_file("rootfs.jffs2"));
|
printf("%s: rootfs.jffs2\n", fpid_file("rootfs.jffs2"));
|
||||||
|
|||||||
+5
-2
@@ -93,6 +93,7 @@ void show_usage()
|
|||||||
printf(" -d [vid:pid] injects a usb device into the supported list\n");
|
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(" -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(" -R reboot the omap board\n");
|
||||||
|
printf(" -x extract configuration entries from /dev/mtd1\n");
|
||||||
printf(" -v be verbose and noisy\n");
|
printf(" -v be verbose and noisy\n");
|
||||||
printf(" -V show 0xFFFF version information\n");
|
printf(" -V show 0xFFFF version information\n");
|
||||||
printf("Pieces are: ");
|
printf("Pieces are: ");
|
||||||
@@ -152,8 +153,10 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int c;
|
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) {
|
switch(c) {
|
||||||
|
case 'x':
|
||||||
|
return dump_config();
|
||||||
case 'c':
|
case 'c':
|
||||||
return console_prompt();
|
return console_prompt();
|
||||||
case 'd':
|
case 'd':
|
||||||
@@ -240,7 +243,7 @@ int main(int argc, char **argv)
|
|||||||
&& (root_device == -1))
|
&& (root_device == -1))
|
||||||
{
|
{
|
||||||
printf("Usage: 0xFFFF [-hvVRi] [-e path] [-U 0|1] [-p [piece%%]file [-p ...]]\n");
|
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");
|
printf(" [-D 0|1|2] [-F rd flags] [-s serial-dev] [-c] [-C mtd-dev]\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ int console_prompt();
|
|||||||
//
|
//
|
||||||
void cmd_info(char *line);
|
void cmd_info(char *line);
|
||||||
int check_badblocks(char *mtddev);
|
int check_badblocks(char *mtddev);
|
||||||
|
int dump_config();
|
||||||
|
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
#define D if (verbose)
|
#define D if (verbose)
|
||||||
|
|||||||
Reference in new issue
Block a user