📄 bulk_only.lst
字号:
C51 COMPILER V6.23a BULK_ONLY 12/02/2003 11:01:15 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE BULK_ONLY
OBJECT MODULE PLACED IN bulk_only.OBJ
COMPILER INVOKED BY: d:\SoftDev\Keil\C51\BIN\C51.EXE bulk_only.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************************************/
2 /* UP-MP3DIY100 */
3 /* Beijing Universal Pioneering Technology Co., LTD */
4 /* CopyRighted,All right Reserved www.up-tech.com */
5 /* July,2003 */
6 /* 010-62387873 62381842 */
7 /****************************************************************/
8
9 //this file to process the request about bulk_only
10 #include <string.h>
11
12 #include "bulk_only.h"
13 #include "fat16.h"
14 #include "usbdisk.h"
15 #include "uart.h"
16 #include "flash.h"
17
18 //extern unsigned char EpBuf[];
19
20 long unsigned int dDataResiduce=0;//USB传输过程中,未传完的剩余数据
21 unsigned char bulk_state=0; //当前传送状态
22 unsigned char *pCurrentBuf; //数据传送指针
23 long int nBufCount=0; //传送数据当前位置
24
25
26 //unsigned char MSC_dCBWSignature[]={0x55,0x53,0x42,0x43};
27 //unsigned char MSC_dCSWSignature[]={0x55,0x53,0x42,0x53};
28
29 //以下是SCSI命令的命令字与其代码的对应表
30 #define Format_Unit 0x04
31 #define Inquiry 0x12
32 #define Mode_Select 0x55
33 #define Mode_Sense 0x1A
34 #define Medium_Removal 0x1E
35 #define Read10 0x28
36 #define Read12 0xA8
37 #define Read_Capacity 0x25
38 #define Read_Format_Capacities 0x23
39 #define Request_Sense 0x03
40 #define Rezero 0x01
41 #define Seek10 0x2B
42 #define Send_Diag 0x1D
43 #define Start_Stop_Unit 0x1B
44 #define Test_Unit_Ready 0x00
45 #define Verify 0x2F
46 #define Write10 0x2A
47 #define Write12 0xAA
48 #define Write_And_Verify 0x2E
49 /****************************************/
50
51
52
53 #define SCSI_MSPGCD_TPP 0x1c
54 #define SCSI_MSPGCD_RETALL 0x3f
55
C51 COMPILER V6.23a BULK_ONLY 12/02/2003 11:01:15 PAGE 2
56 unsigned char Bulk_Out_Buf[64]; //64字节的端点缓存
57 unsigned char Page_Buf[512]; //512字节的页缓存
58
59
60 short int Transfer_Length; //要传送的扁区长度
61 long int Logical_Block_Address; //逻辑地址
62 long int nCurrentPage,nBeginPage; //当前扇区和超始扇区
63 long int nCurrentBlock; //当前Block
64
65 //SCSI-Inquiry命令的返回数据
66 code unsigned char B_InquiryData[]={
67 0x00, //Direct Access Device
68 0x80, //RMB
69 0x00, //ISO/ECMA/ANSI
70 0x01, //Response Data Format
71 0x1f, //Additional Length
72 0x00, //Reserved
73 0x00, //Reserved
74 0x00, //Reserved
75 'U','P','-','T','E','C','H',' ', //Vendor Information
76 'M','P','3',' ','P','l','a','y','e','r',' ','V','1','.','0','0',//Product Identification
77 0,0,0,0}; //Product Revision Level n.nn
78
79
80 //code unsigned char CapactiyLstHd[]={0x00,0x00,0x00,0x10};
81 //code unsigned char bBlockLength[]={0x00,0x02,0x00}; //512 Byte
82 //code unsigned char nLastLBAddr[]={0x00,0x01,0xf3,0xff}; //Last Logical Block Address for 64MB
83
84 //SCSI-Read_Format_capacities命令的返回数据
85 code unsigned char B_Read_Format_capacities[]={0x00,0x00,0x00,0x10, //capacity list header
86 0x00,0x00,0x04,0x00, 0x01, 0x00,0x02,0x00, //capacity descriptor
87 // Number of Blocks =1024,unformatted media,blocklength = 512Bytes
88 0x00,0x00,0x04,0x00, 0x00, 0x00,0x02,0x00 //Formattable Capacity Descriptors
89 };
90 //SCSI-Read_Capacity命令的返回数据
91 code unsigned char B_Read_Capacity[]={
92 0x00,0x00,0x7f,0xe0, //Last Logical Block Address for 64MB
93 0x00,0x00,0x02,0x00 //block length in bytes
94 };
95
96 //SCSI-Mode_Sense命令的返回数据
97 code unsigned char B_Mode_Sense_ALL[]={0x0b,0x00,//Mode Data Length
98 0x00,0x08,0x00,0x00,
99 0x7d,0,0,0,0x02,0x00
100 };
101
102 //SCSI-Mode_Sense命令的返回数据
103 code unsigned char B_Mode_Sense_TPP[]={0xf0,0x00,//Mode Data Length
104 05,00,00,00,00,0x0b,00,00,00,00,0x24,00,00,00,00,00
105 };
106 //SCSI-Mode_Sense命令的返回数据
107 code unsigned char B_Mode_Sense_ZERO[]={0x00,0x06,//Mode Data Length
108 0x00, //Medium Type Code
109 0,//write enabled
110 0,0,0,0//reserved
111 };
112
113 //CSW数据内容,默认都为Good Status
114 unsigned char bulk_CSW[]={0x55,0x53,0x42,0x53, // bytes 4 dCSWSignature
115 0x00,0x00,0x00,0x00, //bytes 4 dCSWTag
116 0,0,0,0, //bytes 4 dDataResiduce
117 0x00}; //bCSWStatus 00=good state.
C51 COMPILER V6.23a BULK_ONLY 12/02/2003 11:01:15 PAGE 3
118
119
120 typedef struct _STRUCT_CBW
121 {
122 unsigned char dCBWSignature[4];
123 unsigned char dCBWTag[4]; //dCBWTag of CBW
124 long unsigned int dCBWDataTransferLength;//dCBWDataTransferLength of CBW
125 unsigned char bmCBWFlags;
126 unsigned char bCBWLUN;
127 unsigned char bCBWCBLength;
128 unsigned char CBWCB[12];//for UFI Command all have 12bit
129 } struct_CBW;
130
131 struct_CBW bulk_CBW;
132
133 //解析CBW块的数据内容
134 void InterpretCBW()
135 {
136 1 int i;
137 1 // printu("InterpretCBW");
138 1
139 1 //保存dCSWTag
140 1 bulk_CSW[4] = Bulk_Out_Buf[4];
141 1 bulk_CSW[5] = Bulk_Out_Buf[5];
142 1 bulk_CSW[6] = Bulk_Out_Buf[6];
143 1 bulk_CSW[7] = Bulk_Out_Buf[7];
144 1
145 1 //读取CBWCB
146 1 for(i=0;i<12;i++)
147 1 bulk_CBW.CBWCB [i] = Bulk_Out_Buf[i+15];
148 1
149 1 switch(bulk_CBW.CBWCB[0]){//根据各个不同的命令字,处理相应的命令
150 2 // case 0x04 :UFI_Reserved();break;
151 2 case Inquiry :UFI_Inquiry();break;
152 2 // case 0x55 :UFI_Reserved();break;
153 2 case Mode_Sense :UFI_Mode_Sense();break;
154 2 case Read10 :UFI_Read10();break;
155 2 // case 0xA8 :UFI_Reserved();break;
156 2 case Read_Capacity :UFI_Read_Capacity();break;
157 2 case Read_Format_Capacities :UFI_Read_Format_Capacities();break;
158 2 // case 0x03 :UFI_Reserved();break;
159 2 // case 0x01 :UFI_Reserved();break;
160 2 // case 0x2B :UFI_Reserved();break;
161 2 // case 0x1D :UFI_Reserved();break;
162 2 // case 0x1B :UFI_Reserved();break;
163 2 case Test_Unit_Ready :UFI_Test_Unit_Ready();break;
164 2 case Verify :UFI_Verify();break;
165 2 case Write10 :UFI_Write10();break;
166 2 // case 0xAA :UFI_Reserved();break;
167 2 // case 0x2E :UFI_Reserved();break;
168 2 case Medium_Removal :UFI_Medium_Removal();break;
169 2 default :UFI_Reserved();break;
170 2 }
171 1
172 1 }
173
174
175 void UFI_Inquiry()
176 {
177 1 if(bulk_CBW.CBWCB[4]==0)
178 1 return;
179 1 bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End,当这个阶段完成后,程序会接着传送CSW,符合USB协议要
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -