u8 *part_num, struct part_info **part);
#endif
-extern nand_info_t nand_info[]; /* info for NAND chips */
-
static int nand_dump_oob(nand_info_t *nand, ulong off)
{
return 0;
off &= ~(nand->oobblock - 1);
i = nand_read_raw(nand, buf, off, nand->oobblock, nand->oobsize);
if (i < 0) {
- printf("Error (%d) reading page %08x\n", i, off);
+ printf("Error (%d) reading page %08lx\n", i, off);
free(buf);
return 1;
}
- printf("Page %08x dump:\n", off);
+ printf("Page %08lx dump:\n", off);
i = nand->oobblock >> 4; p = buf;
while (i--) {
printf( "\t%02x %02x %02x %02x %02x %02x %02x %02x"
}
static int
-arg_off_size(int argc, char *argv[], nand_info_t *nand, ulong *off, ulong *size)
+arg_off_size(int argc, char *argv[], nand_info_t *nand, ulong *off, size_t *size)
{
int idx = nand_curr_device;
#if defined(CONFIG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)
}
*off = part->offset;
if (argc >= 2) {
- if (!(str2long(argv[1], size))) {
+ if (!(str2long(argv[1], (ulong *)size))) {
printf("'%s' is not a number\n", argv[1]);
return -1;
}
}
if (argc >= 2) {
- if (!(str2long(argv[1], size))) {
+ if (!(str2long(argv[1], (ulong *)size))) {
printf("'%s' is not a number\n", argv[1]);
return -1;
}
if (*size == nand->size)
puts("whole chip\n");
else
- printf("offset 0x%x, size 0x%x\n", *off, *size);
+ printf("offset 0x%lx, size 0x%x\n", *off, *size);
return 0;
}
int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
int i, dev, ret;
- ulong addr, off, size;
+ ulong addr, off;
+ size_t size;
char *cmd, *s;
nand_info_t *nand;
#ifdef CFG_NAND_QUIET
putc('\n');
for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) {
if (nand_info[i].name)
- printf("Device %d: %s, sector size %lu KiB\n",
+ printf("Device %d: %s, sector size %u KiB\n",
i, nand_info[i].name,
nand_info[i].erasesize >> 10);
}
printf("\nDevice %d bad blocks:\n", nand_curr_device);
for (off = 0; off < nand->size; off += nand->erasesize)
if (nand_block_isbad(nand, off))
- printf(" %08x\n", off);
+ printf(" %08lx\n", off);
return 0;
}
opts.quiet = quiet;
ret = nand_write_opts(nand, &opts);
}
+ } else if (s != NULL && !strcmp(s, ".oob")) {
+ /* read out-of-band data */
+ if (read)
+ ret = nand->read_oob(nand, off, size, &size,
+ (u_char *) addr);
+ else
+ ret = nand->write_oob(nand, off, size, &size,
+ (u_char *) addr);
} else {
if (read)
ret = nand_read(nand, off, &size, (u_char *)addr);
if (off == nand->size - nand->oobblock
|| (s != last_status && off != 0)) {
- printf("%08x - %08x: %8d pages %s%s%s\n",
+ printf("%08lx - %08lx: %8lu pages %s%s%s\n",
block_start,
off-1,
(off-block_start)/nand->oobblock,
{
int r;
char *ep, *s;
- ulong cnt;
+ size_t cnt;
image_header_t *hdr;
int jffs2 = 0;
+#if defined(CONFIG_FIT)
+ const void *fit_hdr = NULL;
+#endif
s = strchr(cmd, '.');
if (s != NULL &&
}
show_boot_progress (56);
- hdr = (image_header_t *) addr;
+ switch (genimg_get_format ((void *)addr)) {
+ case IMAGE_FORMAT_LEGACY:
+ hdr = (image_header_t *)addr;
- if (ntohl(hdr->ih_magic) != IH_MAGIC) {
- printf("\n** Bad Magic Number 0x%x **\n", hdr->ih_magic);
+ show_boot_progress (57);
+ image_print_contents (hdr);
+
+ cnt = image_get_image_size (hdr);
+ break;
+#if defined(CONFIG_FIT)
+ case IMAGE_FORMAT_FIT:
+ fit_hdr = (const void *)addr;
+ puts ("Fit image detected...\n");
+
+ cnt = fit_get_size (fit_hdr);
+ break;
+#endif
+ default:
show_boot_progress (-57);
+ puts ("** Unknown image type\n");
return 1;
}
- show_boot_progress (57);
- print_image_hdr(hdr);
-
- cnt = (ntohl(hdr->ih_size) + sizeof (image_header_t));
if (jffs2) {
nand_read_options_t opts;
memset(&opts, 0, sizeof(opts));
}
show_boot_progress (58);
+#if defined(CONFIG_FIT)
+ /* This cannot be done earlier, we need complete FIT image in RAM first */
+ if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
+ if (!fit_check_format (fit_hdr)) {
+ show_boot_progress (-150);
+ puts ("** Bad FIT image format\n");
+ return 1;
+ }
+ show_boot_progress (151);
+ fit_print_contents (fit_hdr);
+ }
+#endif
+
/* Loading ok, update default load address */
load_addr = addr;
if (strncmp (argv[1], "read", 4) == 0 ||
strncmp (argv[1], "write", 5) == 0) {
- ulong addr = simple_strtoul (argv[2], NULL, 16);
- ulong off = simple_strtoul (argv[3], NULL, 16);
- ulong size = simple_strtoul (argv[4], NULL, 16);
- int cmd = (strncmp (argv[1], "read", 4) == 0) ?
- NANDRW_READ : NANDRW_WRITE;
- int ret, total;
+ ulong addr = simple_strtoul (argv[2], NULL, 16);
+ off_t off = simple_strtoul (argv[3], NULL, 16);
+ size_t size = simple_strtoul (argv[4], NULL, 16);
+ int cmd = (strncmp (argv[1], "read", 4) == 0) ?
+ NANDRW_READ : NANDRW_WRITE;
+ size_t total;
+ int ret;
char *cmdtail = strchr (argv[1], '.');
if (cmdtail && !strncmp (cmdtail, ".oob", 2)) {
/* read out-of-band data */
if (cmd & NANDRW_READ) {
ret = nand_read_oob (nand_dev_desc + curr_device,
- off, size, (size_t *) & total,
+ off, size, &total,
(u_char *) addr);
} else {
ret = nand_write_oob (nand_dev_desc + curr_device,
- off, size, (size_t *) & total,
+ off, size, &total,
(u_char *) addr);
}
return ret;
return 1;
}
- printf ("\nNAND %s: device %d offset %ld, size %ld ...\n",
+ printf ("\nNAND %s: device %d offset %ld, size %lu ...\n",
(cmd & NANDRW_READ) ? "read" : "write",
- curr_device, off, size);
+ curr_device, off, (ulong)size);
ret = nand_legacy_rw (nand_dev_desc + curr_device,
cmd, off, size,
- (size_t *) & total,
+ &total,
(u_char *) addr);
printf (" %d bytes %s: %s\n", total,
ulong offset = 0;
image_header_t *hdr;
int rcode = 0;
+#if defined(CONFIG_FIT)
+ const void *fit_hdr = NULL;
+#endif
+
show_boot_progress (52);
switch (argc) {
case 1:
}
show_boot_progress (56);
- hdr = (image_header_t *)addr;
-
- if (ntohl(hdr->ih_magic) == IH_MAGIC) {
+ switch (genimg_get_format ((void *)addr)) {
+ case IMAGE_FORMAT_LEGACY:
+ hdr = (image_header_t *)addr;
+ image_print_contents (hdr);
- print_image_hdr (hdr);
-
- cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
+ cnt = image_get_image_size (hdr);
cnt -= SECTORSIZE;
- } else {
- printf ("\n** Bad Magic Number 0x%x **\n", ntohl(hdr->ih_magic));
+ break;
+#if defined(CONFIG_FIT)
+ case IMAGE_FORMAT_FIT:
+ fit_hdr = (const void *)addr;
+ puts ("Fit image detected...\n");
+
+ cnt = fit_get_size (fit_hdr);
+ break;
+#endif
+ default:
show_boot_progress (-57);
+ puts ("** Unknown image type\n");
return 1;
}
show_boot_progress (57);
}
show_boot_progress (58);
+#if defined(CONFIG_FIT)
+ /* This cannot be done earlier, we need complete FIT image in RAM first */
+ if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
+ if (!fit_check_format (fit_hdr)) {
+ show_boot_progress (-150);
+ puts ("** Bad FIT image format\n");
+ return 1;
+ }
+ show_boot_progress (151);
+ fit_print_contents (fit_hdr);
+ }
+#endif
+
/* Loading ok, update default load address */
load_addr = addr;