summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-24 21:18:22 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-24 21:18:22 +0000
commit606c798b9b890037486ad3491656244ee5c1cfad (patch)
tree1538ffc01f20edd59d6300ccffd1b365b46b0539
parentced10d4db18947c724d25dfc923a22c9aff3f629 (diff)
downloadrockbox-606c798b9b890037486ad3491656244ee5c1cfad.tar.gz
rockbox-606c798b9b890037486ad3491656244ee5c1cfad.zip
Jz4740 USB tool:
* Add preliminary support for NAND & ROM dump git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18341 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--utils/jz4740_tools/jz4740_usbtool.c120
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
516int 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
575int 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
514int jzconnect(int address, unsigned char* buf, int len, int func) 624int 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: