summaryrefslogtreecommitdiff
path: root/bootloader/x1000/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/x1000/utils.c')
-rw-r--r--bootloader/x1000/utils.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/bootloader/x1000/utils.c b/bootloader/x1000/utils.c
index a1d90dedbb..5bad511b23 100644
--- a/bootloader/x1000/utils.c
+++ b/bootloader/x1000/utils.c
@@ -421,3 +421,78 @@ void show_flash_info(void)
421 close(fd); 421 close(fd);
422 splashf(3*HZ, "Dumped flash info\nSee flash_info.txt"); 422 splashf(3*HZ, "Dumped flash info\nSee flash_info.txt");
423} 423}
424
425static int dump_flash_onfi_info(int fd)
426{
427 struct nand_drv* ndrv = nand_init();
428 nand_lock(ndrv);
429
430 int ret = nand_open(ndrv);
431 if(ret != NAND_SUCCESS) {
432 splashf(5*HZ, "NAND open failed\n");
433 nand_unlock(ndrv);
434 return ret;
435 }
436
437 nand_enable_otp(ndrv, true);
438
439 /* read ONFI parameter page */
440 ret = nand_page_read(ndrv, 0x01, ndrv->page_buf);
441 if(ret != NAND_SUCCESS) {
442 splashf(5*HZ, "Dump failed\nNAND read error");
443 goto out;
444 }
445
446 uint8_t* buf = ndrv->page_buf;
447
448 fdprintf(fd, "signature = %08lx\n", load_le32(buf));
449 fdprintf(fd, "revision = %04x\n", load_le16(buf+4));
450
451 char strbuf[32];
452 memcpy(strbuf, &buf[32], 12);
453 strbuf[12] = '\0';
454 fdprintf(fd, "manufacturer = \"%s\"\n", strbuf);
455
456 memcpy(strbuf, &buf[44], 20);
457 strbuf[20] = '\0';
458 fdprintf(fd, "device model = \"%s\"\n", strbuf);
459
460 fdprintf(fd, "JEDEC mf. id = %02x\n", buf[64]);
461
462 fdprintf(fd, "data bytes per page = %lu\n", load_le32(buf+80));
463 fdprintf(fd, "spare bytes per page = %u\n", load_le16(buf+84));
464 fdprintf(fd, "pages per block = %lu\n", load_le32(buf+92));
465 fdprintf(fd, "blocks per lun = %lu\n", load_le32(buf+96));
466 fdprintf(fd, "number of luns = %u\n", buf[100]);
467 fdprintf(fd, "bits per cell = %u\n", buf[102]);
468 fdprintf(fd, "max bad blocks = %u\n", load_le16(buf+103));
469 fdprintf(fd, "block endurance = %u\n", load_le16(buf+105));
470 fdprintf(fd, "programs per page = %u\n", buf[110]);
471 fdprintf(fd, "page program time = %u\n", load_le16(buf+133));
472 fdprintf(fd, "block erase time = %u\n", load_le16(buf+135));
473 fdprintf(fd, "page read time = %u\n", load_le16(buf+137));
474
475 out:
476 nand_enable_otp(ndrv, false);
477 nand_close(ndrv);
478 nand_unlock(ndrv);
479 return ret;
480}
481
482void show_flash_onfi_info(void)
483{
484 if(check_disk(true) != DISK_PRESENT)
485 return;
486
487 int fd = open("/flash_onfi_info.txt", O_WRONLY|O_CREAT|O_TRUNC);
488 if(fd < 0) {
489 splashf(5*HZ, "Cannot create log file");
490 return;
491 }
492
493 splashf(0, "Reading ONFI info...");
494 dump_flash_onfi_info(fd);
495
496 close(fd);
497 splashf(3*HZ, "Dumped flash ONFI info\nSee flash_onfi_info.txt");
498}