📄 bulk_only.lst
字号:
C51 COMPILER V7.20 BULK_ONLY 03/21/2007 13:33:19 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE BULK_ONLY
OBJECT MODULE PLACED IN bulk_only.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE bulk_only.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 * Copyright (c) 2004,北京博创兴业科技有限公司
3 * All rights reserved.
4 *
5 * 文件名称:bulk_only.c
6 * 文件标识:bulk_only
7 * 摘 要:批量传输函数定义
8 *
9 * 当前版本:2.0
10 * 作 者:Kent
11 * 完成日期:2004年5月20日
12 *
13 * 取代版本:1.1
14 * 原作者 :Frank
15 * 完成日期:2003年8月10日
16 */
17
18 //this file to process the request about bulk_only
19 #include <string.h>
20
21 #include "bulk_only.h"
22 #include "fat16.h"
23 #include "usbdisk.h"
24 #include "uart.h"
25 #include "flash.h"
26 #include "atmelusbci.h"
27
28 //extern unsigned char EpBuf[];
29 unsigned char *BulkPoint = 0;
30 unsigned char *BulkStartPoint = 0;
31 long unsigned int dDataResiduce = 0;//USB传输过程中,未传完的剩余数据
32 unsigned char bulk_state = 0; //当前传送状态
33 unsigned char *pCurrentBuf; //数据传送指针
34 long int nBufCount = 0; //传送数据当前位置
35
36
37 //unsigned char MSC_dCBWSignature[] = {0x55, 0x53, 0x42, 0x43};
38 //unsigned char MSC_dCSWSignature[] = {0x55, 0x53, 0x42, 0x53};
39
40 //以下是SCSI命令的命令字与其代码的对应表
41 #define Format_Unit 0x04
42 #define Inquiry 0x12
43 #define Mode_Select 0x55
44 #define Mode_Sense 0x1A
45 #define Medium_Removal 0x1E
46 #define Read10 0x28
47 #define Read12 0xA8
48 #define Read_Capacity 0x25
49 #define Read_Format_Capacities 0x23
50 #define Request_Sense 0x03
51 #define Rezero 0x01
52 #define Seek10 0x2B
53 #define Send_Diag 0x1D
54 #define Start_Stop_Unit 0x1B
55 #define Test_Unit_Ready 0x00
C51 COMPILER V7.20 BULK_ONLY 03/21/2007 13:33:19 PAGE 2
56 #define Verify 0x2F
57 #define Write10 0x2A
58 #define Write12 0xAA
59 #define Write_And_Verify 0x2E
60 /****************************************/
61
62
63
64 #define SCSI_MSPGCD_TPP 0x1c
65 #define SCSI_MSPGCD_RETALL 0x3f
66
67 //unsigned char Bulk_Out_Buf[64]; //64字节的端点缓存
68 unsigned char Page_Buf[512]; //512字节的页缓存
69 unsigned int Fat_Buf[544] _at_ 0x320;//1024字节的FAT表缓存
70
71 short int Transfer_Length; //要传送的扁区长度
72 long int Logical_Block_Address; //逻辑地址
73 long int nCurrentPage, nBeginPage; //当前扇区和超始扇区
74 long int nCurrentBlock; //当前Block
75
76 //SCSI-Inquiry命令的返回数据
77 code unsigned char B_InquiryData[] = {
78 0x00, //Direct Access Device
79 0x80, //RMB
80 0x00, //ISO/ECMA/ANSI
81 0x01, //Response Data Format
82 0x1f, //Additional Length
83 0x00, //Reserved
84 0x00, //Reserved
85 0x00, //Reserved
86 'U', 'P', '-', 'T', 'E', 'C', 'H', ' ', //Vendor Information
87 'M', 'P', '3', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', 'V', '2', '.', '0', '0',//Product Identifica
-tion
88 0, 0, 0, 0}; //Product Revision Level n.nn
89
90
91 //code unsigned char CapactiyLstHd[]={0x00,0x00,0x00,0x10};
92 //code unsigned char bBlockLength[]={0x00,0x02,0x00}; //512 Byte
93 //code unsigned char nLastLBAddr[]={0x00,0x01,0xf3,0xff}; //Last Logical Block Address for 64MB
94
95 //SCSI-Read_Format_capacities命令的返回数据
96 code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10, //capacity list header
97 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
98 // Number of Blocks =1024,unformatted media,blocklength = 512Bytes
99 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00 //Formattable Capacity Descriptors
100 };
101 //SCSI-Read_Capacity命令的返回数据
102 code unsigned char B_Read_Capacity[] = {
103 0x00, 0x00, 0xff, 0xe0, //Last Logical Block Address for 64MB
104 0x00, 0x00, 0x02, 0x00 //block length in bytes
105 };
106
107 //SCSI-Mode_Sense命令的返回数据
108 code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00,//Mode Data Length
109 0x00, 0x08, 0x00, 0x00,
110 0x7d, 0, 0, 0, 0x02, 0x00
111 };
112
113 //SCSI-Mode_Sense命令的返回数据
114 code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00,//Mode Data Length
115 05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
116 };
C51 COMPILER V7.20 BULK_ONLY 03/21/2007 13:33:19 PAGE 3
117 //SCSI-Mode_Sense命令的返回数据
118 code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06,//Mode Data Length
119 0x00, //Medium Type Code
120 0,//write enabled
121 0, 0, 0, 0//reserved
122 };
123
124
125
126 typedef struct _STRUCT_CBW
127 {
128 unsigned char dCBWSignature[4];
129 unsigned char dCBWTag[4]; //dCBWTag of CBW
130 long unsigned int dCBWDataTransferLength;//dCBWDataTransferLength of CBW
131 unsigned char bmCBWFlags;
132 unsigned char bCBWLUN;
133 unsigned char bCBWCBLength;
134 unsigned char CBWCB[12];//for UFI Command all have 12bit
135 } struct_CBW ;
136
137 struct_CBW bulk_CBW;
138 //CSW数据内容,默认都为Good Status
139 unsigned char bulk_CSW[13] = {0x55, 0x53, 0x42, 0x53, // bytes 4 dCSWSignature
140 0x00, 0x00, 0x00, 0x00, //bytes 4 dCSWTag
141 0, 0, 0, 0, //bytes 4 dDataResiduce
142 0x00}; //bCSWStatus 00=good state.
143
144
145 //解析CBW块的数据内容
146 void InterpretCBW()
147 {
148 1 int i;
149 1 // printu("InterpretCBW");
150 1
151 1 //保存dCSWTag
152 1 bulk_CSW[4] = *(BulkStartPoint + 4);
153 1 bulk_CSW[5] = *(BulkStartPoint + 5);
154 1 bulk_CSW[6] = *(BulkStartPoint + 6);
155 1 bulk_CSW[7] = *(BulkStartPoint + 7);
156 1
157 1 //读取CBWCB
158 1 for (i=0; i<12; i++)
159 1 {
160 2 bulk_CBW.CBWCB[i] = *(BulkStartPoint + i + 15);
161 2 }
162 1
163 1 switch (bulk_CBW.CBWCB[0])
164 1 {//根据各个不同的命令字,处理相应的命令
165 2 // case 0x04 : UFI_Reserved(); break;
166 2 case Inquiry : UFI_Inquiry(); break;
167 2 // case 0x55 : UFI_Reserved(); break;
168 2 case Mode_Sense : UFI_Mode_Sense(); break;
169 2 case Read10 : UFI_Read10(); break;
170 2 // case 0xA8 : UFI_Reserved(); break;
171 2 case Read_Capacity : UFI_Read_Capacity(); break;
172 2 case Read_Format_Capacities : UFI_Read_Format_Capacities(); break;
173 2 // case 0x03 : UFI_Reserved(); break;
174 2 // case 0x01 : UFI_Reserved(); break;
175 2 // case 0x2B : UFI_Reserved(); break;
176 2 // case 0x1D : UFI_Reserved(); break;
177 2 // case 0x1B : UFI_Reserved(); break;
178 2 case Test_Unit_Ready : UFI_Test_Unit_Ready(); break;
C51 COMPILER V7.20 BULK_ONLY 03/21/2007 13:33:19 PAGE 4
179 2 case Verify : UFI_Verify(); break;
180 2 case Write10 : UFI_Write10(); break;
181 2 // case 0xAA : UFI_Reserved(); break;
182 2 // case 0x2E : UFI_Reserved(); break;
183 2 case Medium_Removal : UFI_Medium_Removal(); break;
184 2 default : UFI_Reserved(); break;
185 2 }
186 1
187 1 }
188
189
190 void UFI_Inquiry()
191 {
192 1 if (bulk_CBW.CBWCB[4] == 0)
193 1 return;
194 1
195 1 bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End,当这个阶段完成后,程序会接着传送CSW,符合USB协议要求
196 1 WriteEpBulk(1, sizeof (B_InquiryData), B_InquiryData);//向Bulk-In端点写入数据
197 1
198 1 }
199
200
201 void UFI_Read_Format_Capacities()
202 {
203 1 if (bulk_CBW.CBWCB[7] == 0 && bulk_CBW.CBWCB[8] == 0)
204 1 return;
205 1
206 1 bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
207 1 WriteEpBulk(1, sizeof (B_Read_Format_capacities), B_Read_Format_capacities);//向Bulk-In端点写入数据
208 1
209 1 }
210
211
212 void UFI_Read_Capacity()
213 {
214 1
215 1 bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
216 1 WriteEpBulk(1, sizeof (B_Read_Capacity), B_Read_Capacity);//向Bulk-In端点写入数据
217 1
218 1 }
219
220 void UFI_Mode_Sense()
221 {
222 1 dDataResiduce = bulk_CBW.dCBWDataTransferLength;
223 1 bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
224 1
225 1 if (bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)
226 1 { //Page Code=Timer and Potect Page
227 2 WriteEpBulk(1, sizeof (B_Mode_Sense_TPP), B_Mode_Sense_TPP);
228 2 }
229 1 else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)
230 1 { //Page Code=All
231 2 WriteEpBulk(1, sizeof (B_Mode_Sense_ALL), B_Mode_Sense_ALL);
232 2 }
233 1 else
234 1 { //Page Code=Zero
235 2 WriteEpBulk(1, sizeof (B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);
236 2 }
237 1 }
238
239 void UFI_Read10()
240 {
C51 COMPILER V7.20 BULK_ONLY 03/21/2007 13:33:19 PAGE 5
241 1 int i;
242 1 // printu("UFI_Read10__1\n");
243 1
244 1 for (i=0; i<4; i++)
245 1 {
246 2 Logical_Block_Address = (Logical_Block_Address << 8) + bulk_CBW.CBWCB[2 + i]; //要传的数据的起始簇
247 2 }
248 1
249 1 Transfer_Length = bulk_CBW.CBWCB[7] * 256 + bulk_CBW.CBWCB[8]; //要传的扇区数
250 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -