📄 tpbulk.lst
字号:
C51 COMPILER V8.02 TPBULK 09/19/2006 15:01:23 PAGE 20
612 =2 UINT8 Reserved0 : 1;
613 =2 UINT8 WrongLenIndicator : 1;
614 =2 UINT8 EndofMedium : 1;
615 =2 UINT8 FileMark : 1;
616 =2
617 =2 UINT8 Info_0;
618 =2 UINT8 Info_1;
619 =2 UINT8 Info_2;
620 =2 UINT8 Info_3;
621 =2
622 =2 UINT8 AdditionalSenseLen;
623 =2
624 =2 UINT8 CommandSpecInfo_0;
625 =2 UINT8 CommandSpecInfo_1;
626 =2 UINT8 CommandSpecInfo_2;
627 =2 UINT8 CommandSpecInfo_3;
628 =2
629 =2 UINT8 ASC;
630 =2 UINT8 ASCQ;
631 =2 UINT8 FieldReplacableUnitCode;
632 =2 UINT8 SenseKeySpec_0 : 7;
633 =2 UINT8 SenseKeySpecValid : 1;
634 =2 UINT8 SenseKeySpec_1;
635 =2 UINT8 SenseKeySpec_2;
636 =2
637 =2 } REQUEST_SENSE_DATA, *pREQUEST_SENSE_DATA;
638 =2 */
639 =2 /*
640 =2 // Test Unit Ready
641 =2 */
642 =2 typedef struct _TEST_UNIT_SPC {
643 =2 UINT8 OperationCode; // 00H
644 =2 UINT8 Reserved[4];
645 =2 UINT8 Control;
646 =2 } TEST_UNIT_SPC, *pTEST_UNIT_SPC;
647 =2
648 =2 /*
649 =2 // Write Buffer
650 =2 */
651 =2
652 =2 typedef struct _WRITE_BUFFER_SPC {
653 =2 UINT8 OperationCode;
654 =2 UINT8 Mod:4 ;
655 =2 UINT8 Reserved0:4 ;
656 =2 UINT8 BufferID;
657 =2 UINT8 BufferOff_2;
658 =2 UINT8 BufferOff_1;
659 =2 UINT8 BufferOff_0;
660 =2 UINT8 ParameterLen_2;
661 =2 UINT8 ParameterLen_1;
662 =2 UINT8 ParameterLen_0;
663 =2 UINT8 Control;
664 =2 } WRITE_BUFFER_SPC, *pWRITE_BUFFER_SPC;
665 =2
666 =2 typedef union _CDB_RBC {
667 =2 GENERIC_CDB Cdb_Generic;
668 =2
669 =2 // RBC commands
670 =2 GENERIC_RBC RbcCdb_Generic;
671 =2
672 =2 FORMAT_RBC RbcCdb_Format;
673 =2 READ_RBC RbcCdb_Read;
C51 COMPILER V8.02 TPBULK 09/19/2006 15:01:23 PAGE 21
674 =2 READ_CAPACITY_RBC RbcCdb_ReadCapacity;
675 =2 START_STOP_RBC RbcCdb_OnOffUnit;
676 =2 SYNCHRONIZE_CACHE_RBC RbcCdb_SyncCache;
677 =2 VERIFY_RBC RbcCdb_Verify;
678 =2 WRITE_RBC RbcCdb_Write;
679 =2
680 =2
681 =2 // SPC-2 commands
682 =2
683 =2 INQUIRY_SPC SpcCdb_Inquiry;
684 =2 MODE_SELECT_SPC SpcCdb_ModeSelect;
685 =2 MODE_SENSE_SPC SpcCdb_ModeSense;
686 =2 MEDIA_REMOVAL_SPC SpcCdb_Remove;
687 =2 REQUEST_SENSE_SPC SpcCdb_RequestSense;
688 =2 TEST_UNIT_SPC SpcCdb_TestUnit;
689 =2 WRITE_BUFFER_SPC SpcCdb_WriteBuffer;
690 =2
691 =2 // ATAPI Commands
692 =2 READ_10 CmdRead10;
693 =2 WRITE_10 CmdWrite10;
694 =2 MODE_SELECT_10 CmdModeSel10;
695 =2 MODE_SENSE_10 CmdModeSen10;
696 =2 //////////////////////////////////////
697 =2 READ_LONG_CMD SpcCdb_ReadLong;
698 =2
699 =2 } CDB_RBC, *pCDB_RBC;
700 =2
701 =2
2 =1 ///////////////////////////////////
3 =1 #define CBW_SIGNATURE 0x55534243
4 =1 #define CSW_SIGNATURE 0x55534253
5 =1
6 =1 #define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
7 =1 #define CBW_wXferLen TPBulk_CBW.dCBW_DataXferLen
8 =1 #define RBC_CDB TPBulk_CBW.cdbRBC
9 =1 #define RBC_LUN TPBulk_CBW.bCBW_LUN
10 =1 #define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
11 =1
12 =1 typedef struct _COMMAND_BLOCK_WRAPPER{
13 =1 UINT32 dCBW_Signature;
14 =1 UINT32 dCBW_Tag;
15 =1 UINT32 dCBW_DataXferLen;
16 =1 UINT8 bCBW_Flag;
17 =1 UINT8 bCBW_LUN;
18 =1 UINT8 bCBW_CDBLen;
19 =1 CDB_RBC cdbRBC;
20 =1 } CBW, *pCBW;
21 =1
22 =1 typedef struct _COMMAND_STATUS_WRAPPER{
23 =1 UINT32 dCSW_Signature;
24 =1 UINT32 dCSW_Tag;
25 =1 UINT32 dCSW_DataResidue;
26 =1 UINT8 bCSW_Status;
27 =1 } CSW, *pCSW;
28 =1
29 =1 typedef union _TPBULK_STRUC {
30 =1 CBW TPBulk_CommandBlock;
31 =1 CSW TPBulk_CommandStatus;
32 =1
33 =1 }TPB_STRUC, *pTPB_STRUC;
34 =1 ///////////////////////////////////
35 =1 unsigned char EnumMassDev(void);
C51 COMPILER V8.02 TPBULK 09/19/2006 15:01:23 PAGE 22
36 =1 unsigned char TPBulk_GetMaxLUN(void);
37 =1 unsigned char SPC_Inquiry(void);
38 =1 unsigned char SPC_READLONG(void);
39 =1 unsigned char SPC_RequestSense(void);
40 =1 unsigned char SPC_TestUnit(void);
41 =1 unsigned char SPC_LockMedia(void);
42 =1 unsigned char RBC_ReadCapacity(void);
43 =1 unsigned char RBC_ReadOneSec(unsigned long lba, unsigned char *pBuffer);
44 =1 unsigned char RBC_Write(unsigned long lba,unsigned char len,unsigned char *pBuffer);
45 =1
46 =1
4
5 SYS_INFO_BLOCK DeviceInfo;
6 //unsigned int FatSectorPointer;
7 //FILE_INFO xdata ThisFile;
8 TPB_STRUC data TPBulk_Block;
9
10 extern XXGFLAGS bdata bXXGFlags; //union XXGFLAGS is defined in common.h
11 extern UINT8 xdata DBUF[SECT_LEN];
12 extern XXGPKG usbstack;
13 extern UINT16 xdata FAT[SECT_LEN/2];
14
15 ///////////////////////////////////////////////////////////////////////////
16 unsigned char EnumMassDev(void)
17 {
18 1 UINT32 FATSz;
19 1 UINT32 TotSec;
20 1 UINT32 RootDirSectors;
21 1 UINT32 DataSec;
22 1 UINT32 CountofClusters;
23 1
24 1 pMBR_BLOCK pMBR;
25 1 pBPB_BLOCK pBPB;
26 1 pBPB_BLOCK32 pBPB32;
27 1
28 1 ////////////////////////////////////////////////////
29 1 if(!SPC_Inquiry())
30 1 return FALSE;
31 1 DelayUs(2);
32 1 if(!SPC_RequestSense())
33 1 return FALSE;
34 1 DelayUs(2);
35 1 if(!SPC_TestUnit())
36 1 return FALSE;
37 1 DelayUs(2);
38 1 if(!RBC_ReadCapacity())
39 1 return FALSE;
40 1
41 1 ////////////////////////////////////////////////////
42 1 pMBR=(pMBR_BLOCK)DBUF;
43 1
44 1 DeviceInfo.BPB_BytesPerSec=512; //暂假设为512
45 1 if(!SPC_RequestSense())
46 1 return FALSE;
47 1 // DelayUs(5);
48 1 // if(!SPC_TestUnit())
49 1 // return FALSE;
50 1
51 1 DelayUs(5);
52 1 if(!RBC_ReadCapacity())
53 1 return FALSE;
54 1
C51 COMPILER V8.02 TPBULK 09/19/2006 15:01:23 PAGE 23
55 1 DelayUs(5);
56 1 // Read sector 0 (MBR)
57 1 if(!RBC_ReadOneSec(0x0,DBUF))
58 1 return FALSE;
59 1 //////////////////////////////////
60 1 if(DBUF[0]==0xeb||DBUF[0]==0xe9)
61 1 {
62 2 DeviceInfo.StartSector=0;
63 2 //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
64 2 }
65 1 else
66 1 {
67 2 //////////////////////////////////
68 2 DeviceInfo.StartSector=SwapINT32(pMBR->StartSector);
69 2 //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
70 2 }
71 1 ///////////////////////////////////////////////////////
72 1 pBPB=(pBPB_BLOCK)DBUF;
73 1 pBPB32 = (pBPB_BLOCK32)DBUF;
74 1 DelayUs(5);
75 1
76 1 if(!RBC_ReadOneSec(DeviceInfo.StartSector, DBUF))
77 1 return FALSE;
78 1 DeviceInfo.BPB_BytesPerSec=WordSwap(pBPB->BPB_BytesPerSec);
79 1 DeviceInfo.BPB_SecPerClus=pBPB->BPB_SecPerClus;
80 1 DeviceInfo.BPB_NumFATs=pBPB->BPB_NumFATs;
81 1 DeviceInfo.BPB_RootEntCnt=WordSwap(pBPB->BPB_RootEntCnt);
82 1 DeviceInfo.BPB_TotSec16=WordSwap(pBPB->BPB_TotSec16);
83 1 DeviceInfo.BPB_FATSz16=WordSwap(pBPB->BPB_FATSz16);
84 1 DeviceInfo.BPB_FATSz32=WordSwap(pBPB32->BPB_FATSz32);
85 1 DeviceInfo.BPB_TotSec32=SwapINT32(pBPB->BPB_TotSec32);
86 1 DeviceInfo.FatStartSector=DeviceInfo.StartSector+WordSwap(pBPB->BPB_RsvdSecCnt);
87 1 DeviceInfo.RootStartSector=DeviceInfo.FatStartSector+2*DeviceInfo.BPB_FATSz16;
88 1 DeviceInfo.FirstDataSector=DeviceInfo.RootStartSector+0x20;
89 1 ///////////////////////////////////////////////////////
90 1 // ThisFile.bFileOpen=0;
91 1
92 1 //Judge the FAT type
93 1 if(DeviceInfo.BPB_FATSz16 != 0)
94 1 FATSz = DeviceInfo.BPB_FATSz16;
95 1 else
96 1 FATSz = DeviceInfo.BPB_FATSz32;
97 1
98 1 if(DeviceInfo.BPB_TotSec16 != 0)
99 1 TotSec = DeviceInfo.BPB_TotSec16;
100 1 else
101 1 TotSec = DeviceInfo.BPB_TotSec32;
102 1
103 1 RootDirSectors = ((DeviceInfo.BPB_RootEntCnt * 32) + (DeviceInfo.BPB_BytesPerSec - 1)) / DeviceInfo.BPB_B
-ytesPerSec;
104 1 DataSec = TotSec - (WordSwap(pBPB->BPB_RsvdSecCnt) + (DeviceInfo.BPB_NumFATs * FATSz) + RootDirSectors);
105 1 CountofClusters = DataSec / DeviceInfo.BPB_SecPerClus;
106 1
107 1 if(CountofClusters < 4085)
108 1 {
109 2 DeviceInfo.bFatType = 1; //fat12
110 2 }
111 1 else if(CountofClusters < 65525)
112 1 {
113 2 DeviceInfo.bFatType = 2; //fat16
114 2 #ifdef FAT32OR16_LIGHT
light ( 2, 0, 100, 10 );
C51 COMPILER V8.02 TPBULK 09/19/2006 15:01:23 PAGE 24
light ( 5, 0, 100, 10 );
light ( 2, 0, 100, 10 );
#endif
119 2 }
120 1 else
121 1 {
122 2 DeviceInfo.bFatType = 3; //fat32
123 2 DeviceInfo.TotCluster =
124 2 (DeviceInfo.BPB_TotSec32-DeviceInfo.FirstDataSector+1)/DeviceInfo.BPB_SecPerClus+1;
125 2 #ifdef FAT32OR16_LIGHT
light ( 5, 0, 200, 10 );
light ( 2, 0, 200, 10 );
light ( 5, 0, 200, 10 );
#endif
130 2 }
131 1 //End Judge the FAT type
132 1
133 1 ///////////////////////////////////////////////////////
134 1 return TRUE;
135 1 }
136
137 /*unsigned char TPBulk_GetMaxLUN(void)
138 {
139
140 usbstack.setup.bmRequest=0xa1;
141 usbstack.setup.bRequest=0xfe;
142 usbstack.setup.wValue=0;
143 usbstack.setup.wIndex=0;
144 usbstack.setup.wLength=1;
145 usbstack.buffer=DBUF;
146 return ep0Xfer();
147
148 }
149 */
150
151 unsigned char SPC_Inquiry(void)
152 {
153 1 #define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
154 1
155 1 //unsigned char len;
156 1 //unsigned char retStatus=FALSE;
157 1 TPBulk_CBW.dCBW_Signatu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -