diff options
-rw-r--r-- | utils/jz4740_tools/jz4740_usbtool.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/utils/jz4740_tools/jz4740_usbtool.c b/utils/jz4740_tools/jz4740_usbtool.c index 5667579f57..8a91b12ad9 100644 --- a/utils/jz4740_tools/jz4740_usbtool.c +++ b/utils/jz4740_tools/jz4740_usbtool.c | |||
@@ -511,6 +511,116 @@ int mimic_of(usb_dev_handle *dh, bool vx767) | |||
511 | return 0; | 511 | return 0; |
512 | } | 512 | } |
513 | 513 | ||
514 | #define SEND_NAND_COMMAND(cs, cmd, option) SEND_COMMAND(VR_NAND_OPS, ((cmd&0xF)|((cs&0xFF)<<4)|((option&0xFF)<<12)) ); | ||
515 | #define LENGTH 1024*1024*5 | ||
516 | int nand_dump(usb_dev_handle *dh) | ||
517 | { | ||
518 | int err; | ||
519 | unsigned int n; | ||
520 | FILE *fd; | ||
521 | unsigned char* buffer; | ||
522 | |||
523 | fd = fopen("nand_dump.bin", "wb"); | ||
524 | if (fd == NULL) | ||
525 | { | ||
526 | fprintf(stderr, "[ERR] Could not open nand_dump.bin\n"); | ||
527 | return 0; | ||
528 | } | ||
529 | |||
530 | buffer = (unsigned char*)malloc(LENGTH); | ||
531 | if (buffer == NULL) | ||
532 | { | ||
533 | fprintf(stderr, "[ERR] Could not allocate memory.\n"); | ||
534 | fclose(fd); | ||
535 | return 0; | ||
536 | } | ||
537 | memset(buffer, 0, LENGTH); | ||
538 | |||
539 | SEND_NAND_COMMAND(0, NAND_INIT, 0); | ||
540 | /* | ||
541 | fprintf(stderr, "[INFO] Querying NAND...\n"); | ||
542 | SEND_NAND_COMMAND(0, NAND_QUERY, 0); | ||
543 | GET_DATA(buffer, 4); | ||
544 | printf("[INFO] %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3]); | ||
545 | */ | ||
546 | SEND_COMMAND(VR_SET_DATA_ADDRESS, 0); | ||
547 | SEND_COMMAND(VR_SET_DATA_LENGTH, LENGTH); | ||
548 | SEND_NAND_COMMAND(0, NAND_READ, NO_OOB); | ||
549 | |||
550 | fprintf(stderr, "[INFO] Reading data...\n"); | ||
551 | err = usb_bulk_read(dh, USB_ENDPOINT_IN | EP_BULK_TO, (char*)buffer, LENGTH, TOUT); | ||
552 | if (err != (size)) | ||
553 | { | ||
554 | fprintf(stderr,"\n[ERR] Error writing data\n"); | ||
555 | fprintf(stderr,"[ERR] Bulk write error (%d, %s)\n", err, strerror(-err)); | ||
556 | return -1; | ||
557 | } | ||
558 | |||
559 | n = fwrite(buffer, 1, LENGTH, fd); | ||
560 | if (n != LENGTH) | ||
561 | { | ||
562 | fprintf(stderr, "[ERR] Short write.\n"); | ||
563 | fclose(fd); | ||
564 | free(buffer); | ||
565 | return 0; | ||
566 | } | ||
567 | fclose(fd); | ||
568 | free(buffer); | ||
569 | |||
570 | return n; | ||
571 | } | ||
572 | #undef LENGTH | ||
573 | |||
574 | #define LENGTH 0x1000*16 | ||
575 | int rom_dump(usb_dev_handle *dh) | ||
576 | { | ||
577 | int err; | ||
578 | unsigned int n; | ||
579 | FILE *fd; | ||
580 | unsigned char* buffer; | ||
581 | |||
582 | fd = fopen("rom_dump.bin", "wb"); | ||
583 | if (fd == NULL) | ||
584 | { | ||
585 | fprintf(stderr, "[ERR] Could not open rom_dump.bin\n"); | ||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | buffer = (unsigned char*)malloc(LENGTH); | ||
590 | if (buffer == NULL) | ||
591 | { | ||
592 | fprintf(stderr, "[ERR] Could not allocate memory.\n"); | ||
593 | fclose(fd); | ||
594 | return 0; | ||
595 | } | ||
596 | memset(buffer, 0, LENGTH); | ||
597 | |||
598 | SEND_COMMAND(VR_SET_DATA_ADDRESS, 0x1FC00000); | ||
599 | SEND_COMMAND(VR_SET_DATA_LENGTH, LENGTH); | ||
600 | |||
601 | fprintf(stderr, "[INFO] Reading data...\n"); | ||
602 | err = usb_bulk_read(dh, USB_ENDPOINT_IN | EP_BULK_TO, (char*)buffer, LENGTH, TOUT); | ||
603 | if (err != (size)) | ||
604 | { | ||
605 | fprintf(stderr,"\n[ERR] Error writing data\n"); | ||
606 | fprintf(stderr,"[ERR] Bulk write error (%d, %s)\n", err, strerror(-err)); | ||
607 | return -1; | ||
608 | } | ||
609 | |||
610 | n = fwrite(buffer, 1, LENGTH, fd); | ||
611 | if (n != LENGTH) | ||
612 | { | ||
613 | fprintf(stderr, "[ERR] Short write.\n"); | ||
614 | fclose(fd); | ||
615 | free(buffer); | ||
616 | return 0; | ||
617 | } | ||
618 | fclose(fd); | ||
619 | free(buffer); | ||
620 | |||
621 | return n; | ||
622 | } | ||
623 | |||
514 | int jzconnect(int address, unsigned char* buf, int len, int func) | 624 | int jzconnect(int address, unsigned char* buf, int len, int func) |
515 | { | 625 | { |
516 | struct usb_bus *bus; | 626 | struct usb_bus *bus; |
@@ -605,6 +715,12 @@ found: | |||
605 | case 7: | 715 | case 7: |
606 | err = mimic_of(dh, (func == 7)); | 716 | err = mimic_of(dh, (func == 7)); |
607 | break; | 717 | break; |
718 | case 8: | ||
719 | err = nand_dump(dh); | ||
720 | break; | ||
721 | case 9: | ||
722 | err = rom_dump(dh); | ||
723 | break; | ||
608 | } | 724 | } |
609 | 725 | ||
610 | /* release claimed interface */ | 726 | /* release claimed interface */ |
@@ -631,6 +747,8 @@ void print_usage(void) | |||
631 | fprintf(stderr, "\t\t5 -> same as 1 but do a stage 2 boot\n"); | 747 | fprintf(stderr, "\t\t5 -> same as 1 but do a stage 2 boot\n"); |
632 | fprintf(stderr, "\t\t6 -> mimic VX747 OF fw recovery\n"); | 748 | fprintf(stderr, "\t\t6 -> mimic VX747 OF fw recovery\n"); |
633 | fprintf(stderr, "\t\t7 -> mimic VX767 OF fw recovery\n"); | 749 | fprintf(stderr, "\t\t7 -> mimic VX767 OF fw recovery\n"); |
750 | fprintf(stderr, "\t\t8 -> do a NAND dump\n"); | ||
751 | fprintf(stderr, "\t\t9 -> do a ROM dump\n"); | ||
634 | #ifdef _WIN32 | 752 | #ifdef _WIN32 |
635 | fprintf(stderr, "\nExample:\n\t usbtool.exe 1 fw.bin 0x80000000\n"); | 753 | fprintf(stderr, "\nExample:\n\t usbtool.exe 1 fw.bin 0x80000000\n"); |
636 | fprintf(stderr, "\t usbtool.exe 2 save.bin 0x81000000 1024\n"); | 754 | fprintf(stderr, "\t usbtool.exe 2 save.bin 0x81000000 1024\n"); |
@@ -745,6 +863,8 @@ int main(int argc, char* argv[]) | |||
745 | case 4: | 863 | case 4: |
746 | case 6: | 864 | case 6: |
747 | case 7: | 865 | case 7: |
866 | case 8: | ||
867 | case 9: | ||
748 | return jzconnect(address, NULL, 0, cmd); | 868 | return jzconnect(address, NULL, 0, cmd); |
749 | break; | 869 | break; |
750 | default: | 870 | default: |