diff options
Diffstat (limited to 'bootloader/x1000/utils.c')
-rw-r--r-- | bootloader/x1000/utils.c | 75 |
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 | |||
425 | static 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 | |||
482 | void 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 | } | ||