local: Fix image dumping (now dumping on N900 working)
This commit is contained in:
1 parent
8084f68b50
commit
9087b564ba
1 file changed
+92
-19
+92
-19
@@ -20,6 +20,14 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#ifdef WITH_CAL
|
#ifdef WITH_CAL
|
||||||
#include <cal.h>
|
#include <cal.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -117,19 +125,34 @@ int local_flash_image(struct image * image) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int local_nanddump(const char * file, int mtd, int offset) {
|
static int local_nanddump(const char * file, int mtd, int offset, int length) {
|
||||||
|
|
||||||
|
struct statvfs buf;
|
||||||
char * command;
|
char * command;
|
||||||
|
char * path;
|
||||||
size_t size;
|
size_t size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
size = snprintf(NULL, 0, "nanddump -s %d -f %s /dev/mtd%dro", offset, file, mtd);
|
path = strdup(file);
|
||||||
|
if ( ! path )
|
||||||
|
return 1;
|
||||||
|
|
||||||
command = malloc(size);
|
ret = statvfs(dirname(path), &buf);
|
||||||
|
|
||||||
|
free(path);
|
||||||
|
|
||||||
|
if ( ret == 0 && buf.f_bsize * buf.f_bfree < (long unsigned int)length ) {
|
||||||
|
ERROR("Not enought free space (have: %lu, need: %d)", buf.f_bsize * buf.f_bfree, length);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = snprintf(NULL, 0, "nanddump -i -o -b -s %d -l %d -f %s /dev/mtd%dro", offset, length, file, mtd);
|
||||||
|
|
||||||
|
command = malloc(size+1);
|
||||||
if ( ! command )
|
if ( ! command )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
snprintf(command, size, "nanddump -s %d -f %s /dev/mtd%dro", offset, file, mtd);
|
snprintf(command, size+1, "nanddump -i -o -b -s %d -l %d -f %s /dev/mtd%dro", offset, length, file, mtd);
|
||||||
|
|
||||||
ret = system(command);
|
ret = system(command);
|
||||||
|
|
||||||
@@ -143,48 +166,98 @@ struct nanddump_args {
|
|||||||
int valid;
|
int valid;
|
||||||
int mtd;
|
int mtd;
|
||||||
int offset;
|
int offset;
|
||||||
|
int length;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nanddump_args nanddump_n900[] = {
|
static struct nanddump_args nanddump_n900[] = {
|
||||||
[IMAGE_XLOADER] = { 1, 0, 0x00000000 },
|
[IMAGE_XLOADER] = { 1, 0, 0x00000000, 0x00004000 },
|
||||||
[IMAGE_SECONDARY] = { 1, 0, 0x00004200 },
|
[IMAGE_SECONDARY] = { 1, 0, 0x00004000, 0x0001C000 },
|
||||||
[IMAGE_KERNEL] = { 1, 3, 0x00000800 },
|
[IMAGE_KERNEL] = { 1, 3, 0x00000800, 0x001FF800 },
|
||||||
[IMAGE_INITFS] = { 1, 4, 0x00000800 },
|
[IMAGE_INITFS] = { 1, 4, 0x00000800, 0x001FF800 },
|
||||||
[IMAGE_ROOTFS] = { 1, 5, 0x00000000 },
|
[IMAGE_ROOTFS] = { 1, 5, 0x00000000, 0x0fb40000 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FIXME: Is this table correct? */
|
/* FIXME: Is this table correct? */
|
||||||
static struct nanddump_args nanddump[] = {
|
static struct nanddump_args nanddump[] = {
|
||||||
[IMAGE_XLOADER] = { 1, 0, 0x00000200 },
|
[IMAGE_XLOADER] = { 1, 0, 0x00000200, 0x00003E00 },
|
||||||
[IMAGE_SECONDARY] = { 1, 0, 0x00004000 },
|
[IMAGE_SECONDARY] = { 1, 0, 0x00004000, 0x0001C000 },
|
||||||
[IMAGE_KERNEL] = { 1, 2, 0x00000800 },
|
[IMAGE_KERNEL] = { 1, 2, 0x00000800, 0x001FF800 },
|
||||||
[IMAGE_INITFS] = { 1, 3, 0x00000800 },
|
[IMAGE_INITFS] = { 1, 3, 0x00000800, 0x001FF800 },
|
||||||
[IMAGE_ROOTFS] = { 1, 4, 0x00000000 },
|
[IMAGE_ROOTFS] = { 1, 4, 0x00000000, 0x0fb80000 },
|
||||||
};
|
};
|
||||||
|
|
||||||
int local_dump_image(enum image_type image, const char * file) {
|
int local_dump_image(enum image_type image, const char * file) {
|
||||||
|
|
||||||
|
int ret = -1;
|
||||||
|
int fd = -1;
|
||||||
|
unsigned char * addr = NULL;
|
||||||
|
off_t nlen, len;
|
||||||
|
|
||||||
|
if ( image == IMAGE_ROOTFS )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
printf("Dumping %s image to file %s...\n", image_type_to_string(image), file);
|
||||||
|
|
||||||
if ( device == DEVICE_RX_51 ) {
|
if ( device == DEVICE_RX_51 ) {
|
||||||
|
|
||||||
if ( image >= sizeof(nanddump_n900)/sizeof(nanddump_n900[0]) || ! nanddump_n900[image].valid ) {
|
if ( image >= sizeof(nanddump_n900)/sizeof(nanddump_n900[0]) || ! nanddump_n900[image].valid ) {
|
||||||
ERROR("Unsuported image type: %s", image_type_to_string(image));
|
ERROR("Unsuported image type: %s", image_type_to_string(image));
|
||||||
return -1;
|
goto clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
return local_nanddump(file, nanddump_n900[image].mtd, nanddump_n900[image].offset);
|
ret = local_nanddump(file, nanddump_n900[image].mtd, nanddump_n900[image].offset, nanddump_n900[image].length);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if ( image >= sizeof(nanddump)/sizeof(nanddump[0]) || ! nanddump[image].valid ) {
|
if ( image >= sizeof(nanddump)/sizeof(nanddump[0]) || ! nanddump[image].valid ) {
|
||||||
ERROR("Unsuported image type: %s", image_type_to_string(image));
|
ERROR("Unsuported image type: %s", image_type_to_string(image));
|
||||||
return -1;
|
goto clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
return local_nanddump(file, nanddump[image].mtd, nanddump[image].offset);
|
ret = local_nanddump(file, nanddump[image].mtd, nanddump[image].offset, nanddump[image].length);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
if ( ret != 0 )
|
||||||
|
goto clean;
|
||||||
|
|
||||||
|
fd = open(file, O_RDWR);
|
||||||
|
if ( fd < 0 )
|
||||||
|
goto clean;
|
||||||
|
|
||||||
|
len = lseek(fd, 0, SEEK_END);
|
||||||
|
if ( len == (off_t)-1 || len == 0 )
|
||||||
|
goto clean;
|
||||||
|
|
||||||
|
addr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
|
|
||||||
|
if ( addr == MAP_FAILED )
|
||||||
|
addr = NULL;
|
||||||
|
|
||||||
|
if ( ! addr )
|
||||||
|
goto clean;
|
||||||
|
|
||||||
|
for ( nlen = len; nlen > 0; --nlen )
|
||||||
|
if ( addr[nlen-1] != 0xFF )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( ( nlen & ( ( 1ULL << 7 ) - 1 ) ) != 0 )
|
||||||
|
nlen = ((nlen >> 7) + 1) << 7;
|
||||||
|
|
||||||
|
if ( nlen != len ) {
|
||||||
|
printf("Truncating file %s to %d bytes...\n", file, (int)nlen);
|
||||||
|
ftruncate(fd, nlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
if ( addr )
|
||||||
|
munmap(addr, len);
|
||||||
|
|
||||||
|
if ( fd >= 0 )
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user