diff options
Diffstat (limited to 'bootloader/x1000')
-rw-r--r-- | bootloader/x1000/recovery.c | 1 | ||||
-rw-r--r-- | bootloader/x1000/utils.c | 75 | ||||
-rw-r--r-- | bootloader/x1000/x1000bootloader.h | 1 |
3 files changed, 77 insertions, 0 deletions
diff --git a/bootloader/x1000/recovery.c b/bootloader/x1000/recovery.c index e6cc041d99..371500826f 100644 --- a/bootloader/x1000/recovery.c +++ b/bootloader/x1000/recovery.c | |||
@@ -69,6 +69,7 @@ static const struct menuitem debug_menu_items[] = { | |||
69 | {MENUITEM_ACTION, "Enable screenshots", &screenshot_enable}, | 69 | {MENUITEM_ACTION, "Enable screenshots", &screenshot_enable}, |
70 | #endif | 70 | #endif |
71 | {MENUITEM_ACTION, "Flash info", &show_flash_info}, | 71 | {MENUITEM_ACTION, "Flash info", &show_flash_info}, |
72 | {MENUITEM_ACTION, "Flash ONFI info", &show_flash_onfi_info}, | ||
72 | #ifdef OF_PLAYER_ADDR | 73 | #ifdef OF_PLAYER_ADDR |
73 | {MENUITEM_ACTION, "Dump OF player", &dump_of_player}, | 74 | {MENUITEM_ACTION, "Dump OF player", &dump_of_player}, |
74 | #endif | 75 | #endif |
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 | } | ||
diff --git a/bootloader/x1000/x1000bootloader.h b/bootloader/x1000/x1000bootloader.h index e74a6a3b68..ba2baa33b5 100644 --- a/bootloader/x1000/x1000bootloader.h +++ b/bootloader/x1000/x1000bootloader.h | |||
@@ -198,6 +198,7 @@ void dump_of_player(void); | |||
198 | void dump_of_recovery(void); | 198 | void dump_of_recovery(void); |
199 | void dump_entire_flash(void); | 199 | void dump_entire_flash(void); |
200 | void show_flash_info(void); | 200 | void show_flash_info(void); |
201 | void show_flash_onfi_info(void); | ||
201 | 202 | ||
202 | void recovery_menu(void) __attribute__((noreturn)); | 203 | void recovery_menu(void) __attribute__((noreturn)); |
203 | 204 | ||