summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-10-10 00:11:47 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-10-10 00:11:47 +0200
commitf5807141b689808b70efd7fa9fc1a3be5b73a35d (patch)
tree4c579458d92d60d0aef3c5353fc35d30af383b9c
parent468aa959c79be818b8866a8eb03896effde74f41 (diff)
downloadrockbox-f5807141b689808b70efd7fa9fc1a3be5b73a35d.tar.gz
rockbox-f5807141b689808b70efd7fa9fc1a3be5b73a35d.zip
imxtools/scsitools: document some of the SCSI vendor commands
Change-Id: I534fc467aad960c61b54d202096823d5c2c9a5e9
-rw-r--r--utils/imxtools/scsitools/scsitool.c214
-rw-r--r--utils/imxtools/scsitools/stmp_scsi.h58
2 files changed, 204 insertions, 68 deletions
diff --git a/utils/imxtools/scsitools/scsitool.c b/utils/imxtools/scsitools/scsitool.c
index af06b7338c..d8d47f8b48 100644
--- a/utils/imxtools/scsitools/scsitool.c
+++ b/utils/imxtools/scsitools/scsitool.c
@@ -433,13 +433,64 @@ static const char *stmp_get_logical_drive_type_string(uint32_t type)
433{ 433{
434 switch(type) 434 switch(type)
435 { 435 {
436 case SCSI_STMP_DRIVE_TYPE_USER: return "User"; 436 case SCSI_STMP_DRIVE_TYPE_DATA: return "Data";
437 case SCSI_STMP_DRIVE_TYPE_SYSTEM: return "System"; 437 case SCSI_STMP_DRIVE_TYPE_SYSTEM: return "System";
438 case SCSI_STMP_DRIVE_TYPE_DRM: return "DRM"; 438 case SCSI_STMP_DRIVE_TYPE_HIDDEN: return "Hidden";
439 case SCSI_STMP_DRIVE_TYPE_UNKNOWN: return "Unknown";
439 default: return "?"; 440 default: return "?";
440 } 441 }
441} 442}
442 443
444static const char *stmp_get_logical_drive_tag_string(uint8_t type)
445{
446 switch(type)
447 {
448 case SCSI_STMP_DRIVE_TAG_STMPSYS_S: return "System";
449 case SCSI_STMP_DRIVE_TAG_HOSTLINK_S: return "Hostlink";
450 case SCSI_STMP_DRIVE_TAG_RESOURCE_BIN: return "Resource";
451 case SCSI_STMP_DRIVE_TAG_EXTRA_S: return "Extra";
452 case SCSI_STMP_DRIVE_TAG_RESOURCE1_BIN: return "Resource1";
453 case SCSI_STMP_DRIVE_TAG_OTGHOST_S: return "OTG";
454 case SCSI_STMP_DRIVE_TAG_HOSTRSC_BIN: return "Host Resource";
455 case SCSI_STMP_DRIVE_TAG_DATA: return "Data";
456 case SCSI_STMP_DRIVE_TAG_HIDDEN: return "Hidden";
457 case SCSI_STMP_DRIVE_TAG_BOOTMANAGER_S: return "Boot";
458 case SCSI_STMP_DRIVE_TAG_UPDATER_S: return "Updater";
459 default: return "?";
460 }
461}
462
463static const char *stmp_get_logical_media_state_string(uint8_t state)
464{
465 switch(state)
466 {
467 case SCSI_STMP_MEDIA_STATE_UNKNOWN: return "Unknown";
468 case SCSI_STMP_MEDIA_STATE_ERASED: return "Erased";
469 case SCSI_STMP_MEDIA_STATE_ALLOCATED: return "Allocated";
470 default: return "?";
471 }
472}
473
474static const char *get_size_suffix(unsigned long long size)
475{
476 int order = 0;
477 while(size >= 1024)
478 {
479 size /= 1024;
480 order++;
481 }
482 static const char *suffix[] = {"B", "KiB", "MiB", "GiB", "TiB"};
483 return suffix[order];
484}
485
486static float get_size_natural(unsigned long long size)
487{
488 float res = size;
489 while(res >= 1024)
490 res /= 1024;
491 return res;
492}
493
443static int do_info(void) 494static int do_info(void)
444{ 495{
445 cprintf(BLUE, "Information\n"); 496 cprintf(BLUE, "Information\n");
@@ -457,7 +508,7 @@ static int do_info(void)
457 cprintf_field(" Vendor: ", "%s\n", vendor); 508 cprintf_field(" Vendor: ", "%s\n", vendor);
458 cprintf_field(" Product: ", "%s\n", product); 509 cprintf_field(" Product: ", "%s\n", product);
459 } 510 }
460 511
461 struct scsi_stmp_protocol_version_t ver; 512 struct scsi_stmp_protocol_version_t ver;
462 ret = stmp_get_protocol_version(&ver); 513 ret = stmp_get_protocol_version(&ver);
463 if(ret) 514 if(ret)
@@ -505,11 +556,11 @@ static int do_info(void)
505 } 556 }
506 557
507 len = 2; 558 len = 2;
508 ret = stmp_get_logical_media_info(0, &u.u16, &len); 559 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_NR_DRIVES, &u.u16, &len);
509 if(!ret && len == 2) 560 if(!ret && len == 2)
510 { 561 {
511 u.u16 = fix_endian16be(u.u16); 562 u.u16 = fix_endian16be(u.u16);
512 cprintf_field(" Logical Media Info (0): ", "%#x\n", u.u16); 563 cprintf_field(" Number of Drives: ", "%d\n", u.u16);
513 } 564 }
514 565
515 len = 4; 566 len = 4;
@@ -522,43 +573,56 @@ static int do_info(void)
522 } 573 }
523 574
524 len = 1; 575 len = 1;
525 ret = stmp_get_logical_media_info(5, &u.u8, &len); 576 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_IS_INITIALISED, &u.u8, &len);
577 if(!ret && len == 1)
578 cprintf_field(" Is Initialised: ", "%d\n", u.u8);
579
580 len = 1;
581 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_STATE, &u.u8, &len);
582 if(!ret && len == 1)
583 cprintf_field(" State: ", "%s\n", stmp_get_logical_media_state_string(u.u8));
584
585 len = 1;
586 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_IS_WRITE_PROTECTED, &u.u8, &len);
526 if(!ret && len == 1) 587 if(!ret && len == 1)
527 cprintf_field(" Logical Media Info (5): ", "%#x\n", u.u8); 588 cprintf_field(" Is Write Protected: ", "%#x\n", u.u8);
528 589
529 len = 8; 590 len = 8;
530 ret = stmp_get_logical_media_info(1, &u.u64, &len); 591 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_SIZE, &u.u64, &len);
531 if(!ret && len == 8) 592 if(!ret && len == 8)
532 { 593 {
533 u.u64 = fix_endian64be(u.u64); 594 u.u64 = fix_endian64be(u.u64);
534 cprintf_field(" Logical Media Info (1): ", "%#llx\n", (unsigned long long)u.u64); 595 cprintf_field(" Media Size: ", "%llu B (%.3f %s)\n", (unsigned long long)u.u64,
596 get_size_natural(u.u64), get_size_suffix(u.u64));
535 } 597 }
536 598
599 int serial_number_size = 0;
537 len = 4; 600 len = 4;
538 ret = stmp_get_logical_media_info(7, &u.u32, &len); 601 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_SERIAL_NUMBER_SIZE, &u.u32, &len);
539 if(!ret && len == 4) 602 if(!ret && len == 4)
540 { 603 {
541 u.u32 = fix_endian32be(u.u32); 604 u.u32 = fix_endian32be(u.u32);
542 cprintf_field(" Logical Media Info (7): ", "%#x\n", u.u32); 605 cprintf_field(" Serial Number Size: ", "%d\n", u.u32);
606 serial_number_size = u.u32;
543 } 607 }
544 608
545 len = 52; 609 len = serial_number_size;
546 ret = stmp_get_logical_media_info(8, &u.buf, &len); 610 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_SERIAL_NUMBER, &u.buf, &len);
547 if(!ret && len != 0) 611 if(!ret && len != 0)
548 { 612 {
549 cprintf(GREEN, " Logical Media Info (8):"); 613 cprintf(GREEN, " Serial Number:");
550 /*
551 for(int i = 0; i < len; i++)
552 cprintf(YELLOW, " %02x", u.buf[i]);
553 printf("\n");
554 */
555 print_hex(u.buf, len); 614 print_hex(u.buf, len);
556 } 615 }
557 616
558 len = 1; 617 len = 1;
559 ret = stmp_get_logical_media_info(9, &u.u8, &len); 618 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_IS_SYSTEM_MEDIA, &u.u8, &len);
560 if(!ret && len == 1) 619 if(!ret && len == 1)
561 cprintf_field(" Logical Media Info (9): ", "%#x\n", u.u8); 620 cprintf_field(" Is System Media: ", "%d\n", u.u8);
621
622 len = 1;
623 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_IS_MEDIA_PRESENT, &u.u8, &len);
624 if(!ret && len == 1)
625 cprintf_field(" Is Media Present: ", "%d\n", u.u8);
562 626
563 len = 4; 627 len = 4;
564 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_VENDOR, &u.u32, &len); 628 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_VENDOR, &u.u32, &len);
@@ -592,6 +656,14 @@ static int do_info(void)
592 u.u32 = fix_endian32be(u.u32); 656 u.u32 = fix_endian32be(u.u32);
593 cprintf_field(" Logical Media Info (14): ", "%#x\n", u.u32); 657 cprintf_field(" Logical Media Info (14): ", "%#x\n", u.u32);
594 } 658 }
659
660 len = 4;
661 ret = stmp_get_logical_media_info(SCSI_STMP_MEDIA_INFO_ALLOC_UNIT_SIZE, &u.u32, &len);
662 if(!ret && len == 4)
663 {
664 u.u32 = fix_endian32be(u.u32);
665 cprintf_field(" Allocation Unit Size: ", "%d B\n", u.u32);
666 }
595 }while(0); 667 }while(0);
596 668
597 struct scsi_stmp_chip_major_rev_id_t chip_rev; 669 struct scsi_stmp_chip_major_rev_id_t chip_rev;
@@ -622,9 +694,12 @@ static int do_info(void)
622 cprintf_field(" Logical Table: ", "%d entries\n", table.header.count); 694 cprintf_field(" Logical Table: ", "%d entries\n", table.header.count);
623 for(int i = 0; i < table.header.count; i++) 695 for(int i = 0; i < table.header.count; i++)
624 { 696 {
625 cprintf_field2(" Drive No: ", "%2x", table.entry[i].drive_no); 697 cprintf(BLUE, " Drive ");
626 cprintf_field2(" Type: ", "%2x", table.entry[i].type); 698 cprintf_field("No: ", "%2x", table.entry[i].drive_no);
627 cprintf_field2(" Tag: ", "%2x", table.entry[i].tag); 699 cprintf_field(" Type: ", "%#x ", table.entry[i].type);
700 cprintf(RED, "(%s)", stmp_get_logical_drive_type_string(table.entry[i].type));
701 cprintf_field(" Tag: ", "%#x ", table.entry[i].tag);
702 cprintf(RED, "(%s)", stmp_get_logical_drive_tag_string(table.entry[i].tag));
628 unsigned long long size = table.entry[i].size; 703 unsigned long long size = table.entry[i].size;
629 int order = 0; 704 int order = 0;
630 while(size >= 1024) 705 while(size >= 1024)
@@ -633,7 +708,7 @@ static int do_info(void)
633 order++; 708 order++;
634 } 709 }
635 static const char *suffix[] = {"B", "KiB", "MiB", "GiB", "TiB"}; 710 static const char *suffix[] = {"B", "KiB", "MiB", "GiB", "TiB"};
636 cprintf_field2(" Size: ", "%llu %s", size, suffix[order]); 711 cprintf_field(" Size: ", "%llu %s", size, suffix[order]);
637 cprintf(OFF, "\n"); 712 cprintf(OFF, "\n");
638 } 713 }
639 714
@@ -651,19 +726,21 @@ static int do_info(void)
651 cprintf_field(" Drive ", "%02x\n", drive); 726 cprintf_field(" Drive ", "%02x\n", drive);
652 727
653 int len = 4; 728 int len = 4;
654 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SECTOR, &u.u32, &len); 729 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SECTOR_SIZE, &u.u32, &len);
655 if(!ret && len == 4) 730 if(!ret && len == 4)
656 { 731 {
657 u.u32 = fix_endian32be(u.u32); 732 u.u32 = fix_endian32be(u.u32);
658 cprintf_field(" Sector Size: ", "%#x\n", u.u32); 733 cprintf_field(" Sector Size: ", "%lu B (%.3f %s)\n", (unsigned long)u.u32,
734 get_size_natural(u.u32), get_size_suffix(u.u32));
659 } 735 }
660 736
661 len = 4; 737 len = 4;
662 ret = stmp_get_logical_drive_info(drive, 1, &u.u32, &len); 738 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVe_INFO_ERASE_SIZE, &u.u32, &len);
663 if(!ret && len == 4) 739 if(!ret && len == 4)
664 { 740 {
665 u.u32 = fix_endian32be(u.u32); 741 u.u32 = fix_endian32be(u.u32);
666 cprintf_field(" Info 1: ", "%#x\n", u.u32); 742 cprintf_field(" Erase Size: ", "%lu B (%.3f %s)\n", (unsigned long)u.u32,
743 get_size_natural(u.u32), get_size_suffix(u.u32));
667 } 744 }
668 745
669 len = 8; 746 len = 8;
@@ -671,23 +748,25 @@ static int do_info(void)
671 if(!ret && len == 8) 748 if(!ret && len == 8)
672 { 749 {
673 u.u64 = fix_endian64be(u.u64); 750 u.u64 = fix_endian64be(u.u64);
674 cprintf_field(" Total Size: ", "%#llx\n", (unsigned long long)u.u64); 751 cprintf_field(" Total Size: ", "%llu B (%.3f %s)\n",
752 (unsigned long long)u.u64, get_size_natural(u.u32),
753 get_size_suffix(u.u32));
675 } 754 }
676 755
677 len = 4; 756 len = 4;
678 ret = stmp_get_logical_drive_info(drive, 3, &u.u32, &len); 757 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SIZE_MEGA, &u.u32, &len);
679 if(!ret && len == 4) 758 if(!ret && len == 4)
680 { 759 {
681 u.u32 = fix_endian32be(u.u32); 760 u.u32 = fix_endian32be(u.u32);
682 cprintf_field(" Info 3: ", "%#x\n", u.u32); 761 cprintf_field(" Total Size (MB): ", "%lu MB\n", (unsigned long)u.u32);
683 } 762 }
684 763
685 len = 8; 764 len = 8;
686 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_COUNT, &u.u64, &len); 765 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SECTOR_COUNT, &u.u64, &len);
687 if(!ret && len == 8) 766 if(!ret && len == 8)
688 { 767 {
689 u.u64 = fix_endian64be(u.u64); 768 u.u64 = fix_endian64be(u.u64);
690 cprintf_field(" Sector Count: ", "%#llx\n", (unsigned long long)u.u64); 769 cprintf_field(" Sector Count: ", "%llu\n", (unsigned long long)u.u64);
691 } 770 }
692 771
693 len = 4; 772 len = 4;
@@ -700,55 +779,74 @@ static int do_info(void)
700 } 779 }
701 780
702 len = 1; 781 len = 1;
703 ret = stmp_get_logical_drive_info(drive, 6, &u.u8, &len); 782 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_TAG, &u.u8, &len);
704 if(!ret && len == 1) 783 if(!ret && len == 1)
705 { 784 {
706 cprintf_field(" Info 6: ", "%#x\n", u.u8); 785 cprintf_field(" Tag: ", "%#x", u.u8);
786 cprintf(RED, " (%s)\n", stmp_get_logical_drive_tag_string(u.u8));
707 } 787 }
708 788
709 len = 52; 789 len = 52;
710 ret = stmp_get_logical_drive_info(drive, 7, &u.buf, &len); 790 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_COMPONENT_VERSION, &u.buf, &len);
711 if(!ret && len != 0) 791 if(!ret && len != 0)
712 { 792 {
713 cprintf(GREEN, " Info 7:"); 793 cprintf(GREEN, " Component Version:");
714 for(int i = 0; i < len; i++) 794 print_hex(u.buf, len);
715 cprintf(YELLOW, " %02x", u.buf[i]);
716 printf("\n");
717 } 795 }
718 796
719 len = 52; 797 len = 52;
720 ret = stmp_get_logical_drive_info(drive, 8, &u.buf, &len); 798 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_PROJECT_VERSION, &u.buf, &len);
721 if(!ret && len != 0) 799 if(!ret && len != 0)
722 { 800 {
723 cprintf(GREEN, " Info 8:"); 801 cprintf(GREEN, " Project Version:");
724 for(int i = 0; i < len; i++) 802 print_hex(u.buf, len);
725 cprintf(YELLOW, " %02x", u.buf[i]);
726 printf("\n");
727 } 803 }
728 804
729 len = 1; 805 len = 1;
730 ret = stmp_get_logical_drive_info(drive, 9, &u.u8, &len); 806 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_IS_WRITE_PROTETED, &u.u8, &len);
731 if(!ret && len == 1) 807 if(!ret && len == 1)
732 { 808 {
733 cprintf_field(" Info 9: ", "%#x\n", u.u8); 809 cprintf_field(" Is Writed Protected: ", "%d\n", u.u8);
734 } 810 }
735 811
736 len = 2; 812 len = 2;
737 ret = stmp_get_logical_drive_info(drive, 10, &u.u16, &len); 813 int serial_number_size = 0;
814 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SERIAL_NUMBER_SIZE, &u.u16, &len);
738 if(!ret && len == 2) 815 if(!ret && len == 2)
739 { 816 {
740 u.u16 = fix_endian16be(u.u16); 817 u.u16 = fix_endian16be(u.u16);
741 cprintf_field(" Info 10: ", "%#x\n", u.u16); 818 cprintf_field(" Serial Number Size: ", "%d\n", u.u16);
819 serial_number_size = u.u16;
742 } 820 }
743 821
744 len = 52; 822 len = serial_number_size;
745 ret = stmp_get_logical_drive_info(drive, 11, &u.buf, &len); 823 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SERIAL_NUMBER, &u.buf, &len);
746 if(!ret && len != 0) 824 if(!ret && len != 0)
747 { 825 {
748 cprintf(GREEN, " Info 11:"); 826 cprintf(GREEN, " Serial Number:");
749 for(int i = 0; i < len; i++) 827 print_hex(u.buf, len);
750 cprintf(YELLOW, " %02x", u.buf[i]); 828 }
751 printf("\n"); 829
830 len = 1;
831 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_MEDIA_PRESENT, &u.u8, &len);
832 if(!ret && len == 1)
833 {
834 cprintf_field(" Is Media Present: ", "%d\n", u.u8);
835 }
836
837 len = 1;
838 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_MEDIA_CHANGE, &u.u8, &len);
839 if(!ret && len == 1)
840 {
841 cprintf_field(" Media Change: ", "%d\n", u.u8);
842 }
843
844 len = 4;
845 ret = stmp_get_logical_drive_info(drive, SCSI_STMP_DRIVE_INFO_SECTOR_ALLOCATION, &u.u32, &len);
846 if(!ret && len == 4)
847 {
848 u.u32 = fix_endian32be(u.u32);
849 cprintf_field(" Sector Allocation: ", "%lu\n", (unsigned long)u.u32);
752 } 850 }
753 } 851 }
754 } 852 }
@@ -796,7 +894,7 @@ void do_extract(const char *file)
796 } 894 }
797 int len = 4; 895 int len = 4;
798 uint32_t sector_size; 896 uint32_t sector_size;
799 ret = stmp_get_logical_drive_info(drive_no, SCSI_STMP_DRIVE_INFO_SECTOR, &sector_size, &len); 897 ret = stmp_get_logical_drive_info(drive_no, SCSI_STMP_DRIVE_INFO_SECTOR_SIZE, &sector_size, &len);
800 if(ret || len != 4) 898 if(ret || len != 4)
801 { 899 {
802 cprintf(GREY, "Cannot get sector size\n"); 900 cprintf(GREY, "Cannot get sector size\n");
diff --git a/utils/imxtools/scsitools/stmp_scsi.h b/utils/imxtools/scsitools/stmp_scsi.h
index 167c9a042d..f46bdb14b3 100644
--- a/utils/imxtools/scsitools/stmp_scsi.h
+++ b/utils/imxtools/scsitools/stmp_scsi.h
@@ -83,8 +83,22 @@ struct scsi_stmp_logical_table_t
83 uint16_t count; /* big-endian */ 83 uint16_t count; /* big-endian */
84} __attribute__((packed)); 84} __attribute__((packed));
85 85
86#define SCSI_STMP_MEDIA_INFO_TYPE 6 86#define SCSI_STMP_MEDIA_INFO_NR_DRIVES 0
87#define SCSI_STMP_MEDIA_INFO_VENDOR 12 87#define SCSI_STMP_MEDIA_INFO_SIZE 1 /* in bytes */
88#define SCSI_STMP_MEDIA_INFO_ALLOC_UNIT_SIZE 2 /* in bytes */
89#define SCSI_STMP_MEDIA_INFO_IS_INITIALISED 3
90#define SCSI_STMP_MEDIA_INFO_STATE 4
91#define SCSI_STMP_MEDIA_INFO_IS_WRITE_PROTECTED 5
92#define SCSI_STMP_MEDIA_INFO_TYPE 6
93#define SCSI_STMP_MEDIA_INFO_SERIAL_NUMBER_SIZE 7 /* in bytes */
94#define SCSI_STMP_MEDIA_INFO_SERIAL_NUMBER 8
95#define SCSI_STMP_MEDIA_INFO_IS_SYSTEM_MEDIA 9
96#define SCSI_STMP_MEDIA_INFO_IS_MEDIA_PRESENT 10
97#define SCSI_STMP_MEDIA_INFO_VENDOR 12
98
99#define SCSI_STMP_MEDIA_STATE_UNKNOWN 0
100#define SCSI_STMP_MEDIA_STATE_ERASED 1
101#define SCSI_STMP_MEDIA_STATE_ALLOCATED 2
88 102
89#define SCSI_STMP_MEDIA_TYPE_NAND 0 103#define SCSI_STMP_MEDIA_TYPE_NAND 0
90#define SCSI_STMP_MEDIA_TYPE_SDMMC 1 104#define SCSI_STMP_MEDIA_TYPE_SDMMC 1
@@ -111,14 +125,38 @@ struct scsi_stmp_logical_media_info_manufacturer_t
111 uint32_t type; /* big-endian */ 125 uint32_t type; /* big-endian */
112} __attribute__((packed)); 126} __attribute__((packed));
113 127
114#define SCSI_STMP_DRIVE_INFO_SECTOR 0 /** Sector Size (bytes) */ 128#define SCSI_STMP_DRIVE_INFO_SECTOR_SIZE 0 /** Sector Size (bytes) */
115#define SCSI_STMP_DRIVE_INFO_SIZE 2 /** Total Size (bytes) */ 129#define SCSI_STMP_DRIVe_INFO_ERASE_SIZE 1 /** Erase Size (bytes) */
116#define SCSI_STMP_DRIVE_INFO_COUNT 4 /** Sector Count */ 130#define SCSI_STMP_DRIVE_INFO_SIZE 2 /** Total Size (bytes) */
117#define SCSI_STMP_DRIVE_INFO_TYPE 5 /** Drive Type */ 131#define SCSI_STMP_DRIVE_INFO_SIZE_MEGA 3 /** Total Size (mega-bytes) */
118 132#define SCSI_STMP_DRIVE_INFO_SECTOR_COUNT 4 /** Sector Count */
119#define SCSI_STMP_DRIVE_TYPE_USER 0 133#define SCSI_STMP_DRIVE_INFO_TYPE 5 /** Drive Type */
120#define SCSI_STMP_DRIVE_TYPE_SYSTEM 1 134#define SCSI_STMP_DRIVE_INFO_TAG 6 /** Drive Tag */
121#define SCSI_STMP_DRIVE_TYPE_DRM 2 135#define SCSI_STMP_DRIVE_INFO_COMPONENT_VERSION 7 /** Component Version */
136#define SCSI_STMP_DRIVE_INFO_PROJECT_VERSION 8 /** Project Version */
137#define SCSI_STMP_DRIVE_INFO_IS_WRITE_PROTETED 9 /** Is Write Protected */
138#define SCSI_STMP_DRIVE_INFO_SERIAL_NUMBER_SIZE 10 /** Serial Number Size */
139#define SCSI_STMP_DRIVE_INFO_SERIAL_NUMBER 11 /** Serial Number */
140#define SCSI_STMP_DRIVE_INFO_MEDIA_PRESENT 12 /** Is Media Present */
141#define SCSI_STMP_DRIVE_INFO_MEDIA_CHANGE 13 /** Media Change */
142#define SCSI_STMP_DRIVE_INFO_SECTOR_ALLOCATION 14 /** Sector Allocation */
143
144#define SCSI_STMP_DRIVE_TYPE_DATA 0
145#define SCSI_STMP_DRIVE_TYPE_SYSTEM 1
146#define SCSI_STMP_DRIVE_TYPE_HIDDEN 2
147#define SCSI_STMP_DRIVE_TYPE_UNKNOWN 3
148
149#define SCSI_STMP_DRIVE_TAG_STMPSYS_S 0x00 /** Player drive */
150#define SCSI_STMP_DRIVE_TAG_HOSTLINK_S 0x01 /** USB MSC/MTP drive */
151#define SCSI_STMP_DRIVE_TAG_RESOURCE_BIN 0x02 /** Resource drive */
152#define SCSI_STMP_DRIVE_TAG_EXTRA_S 0x03 /** Extra system drive */
153#define SCSI_STMP_DRIVE_TAG_RESOURCE1_BIN 0x04 /** Extra resource drive */
154#define SCSI_STMP_DRIVE_TAG_OTGHOST_S 0x05 /** OTG drive */
155#define SCSI_STMP_DRIVE_TAG_HOSTRSC_BIN 0x06 /** USB MSC/MTP resource drive */
156#define SCSI_STMP_DRIVE_TAG_DATA 0x0a /** Data drive */
157#define SCSI_STMP_DRIVE_TAG_HIDDEN 0x0b /** Hidden data drive */
158#define SCSI_STMP_DRIVE_TAG_BOOTMANAGER_S 0x50 /** Boot manager drive */
159#define SCSI_STMP_DRIVE_TAG_UPDATER_S 0xff /** Recovery drive */
122 160
123struct scsi_stmp_logical_drive_info_sector_t 161struct scsi_stmp_logical_drive_info_sector_t
124{ 162{