📄 bulk_only.lst
字号:
181 {
182 1 TransCSW();
183 1 }
184 void SCSI_Verify(void)
185 {
186 1 TransCSW();
187 1 }
188 void SCSI_Reserved(void)
189 {
190 1 }
191 void TransCSW()
192 {
193 1 Fifo_Write(FIFO_EP1, 13, Bulk_CSW);
194 1 UWrite_Byte(INDEX, 1);
195 1 UWrite_Byte(EINCSRL, rbInINPRDY);
196 1 Bulk_Status=BULK_IDLE;
197 1 }
198 ///////////////////////////////////////////////////////////////////////////////////////////////////
199 void SCSI_Read10()
200 {
201 1 unsigned int i=0;
202 1 LED=~LED;
203 1 for(i=0;i<4;i++) // 计算LBA,CBWCB的第2、3、4和5位代表LBA
204 1 {
205 2 LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
206 2 }
207 1 Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8]; //传输的长度,CBWCB的第6和7位代表传输长度
208 1 nCurrentBlock = LBA / 32; //计算FLASH的物理地址
209 1 nCurrentPage = LBA % 32;
210 1
211 1 Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512); //向页缓冲区读1页
212 1
213 1 Transfer_Length--; //待传输的扇区数减1
214 1 nCurrentPage++; //当前页序号加1
215 1
216 1 Bulk_Status = BULK_DATA_TRANS; //Bulk在传输状态
217 1 pCurrentBuf = Bulk_PACKET; //指针指向页缓冲区
218 1 nBufCount=0;
219 1
220 1 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount); //在双缓冲方式,一次可以向FIFO写两个数据包
221 1 UWrite_Byte(INDEX, 1);
222 1 UWrite_Byte(EINCSRL, rbInINPRDY);
223 1 nBufCount+=EP1_PACKET_SIZE;
224 1 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
225 1 UWrite_Byte(INDEX, 1);
226 1 UWrite_Byte(EINCSRL, rbInINPRDY);
227 1 }
228 void TransDataGoOn()
229 {
230 1 unsigned int i=0;
231 1
232 1 if(nBufCount<384)
233 1 {
234 2 nBufCount+=EP1_PACKET_SIZE;
235 2 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount); //在双缓冲方式,一次可以向FIFO写两个数据包
236 2 UWrite_Byte(INDEX, 1);
C51 COMPILER V6.12 BULK_ONLY 08/20/2006 19:41:23 PAGE 5
237 2 UWrite_Byte(EINCSRL, rbInINPRDY);
238 2 nBufCount+=EP1_PACKET_SIZE;
239 2 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
240 2 UWrite_Byte(INDEX, 1);
241 2 UWrite_Byte(EINCSRL, rbInINPRDY);
242 2 }
243 1 else if(Transfer_Length>0)
244 1 {
245 2 if(nCurrentPage==32)
246 2 {
247 3 nCurrentBlock++;
248 3 nCurrentPage=0;
249 3 }
250 2 else
251 2 {}
252 2 Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512);
253 2 nCurrentPage++;
254 2 Transfer_Length--;
255 2 nBufCount=0;
256 2 pCurrentBuf=Bulk_PACKET;
257 2 Bulk_Status=BULK_DATA_TRANS;
258 2 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);//在双缓冲方式,一次可以向FIFO写两个数据包
259 2 UWrite_Byte(INDEX, 1);
260 2 UWrite_Byte(EINCSRL, rbInINPRDY);
261 2 nBufCount+=EP1_PACKET_SIZE;
262 2 Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
263 2 UWrite_Byte(INDEX, 1);
264 2 UWrite_Byte(EINCSRL, rbInINPRDY);
265 2 }
266 1 else
267 1 {
268 2 Bulk_Status=BULK_DATA_END;
269 2 nBufCount=0;
270 2 TransCSW();
271 2 }
272 1 }
273 /////////////////////////////////////////////////////////////////////////////////////////////////
274 void SCSI_Write10(void)
275 {
276 1 unsigned int i=0;
277 1 LED=~LED;
278 1 for(i=0;i<4;i++)
279 1 {
280 2 LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
281 2 }
282 1 Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8];
283 1 nCurrentBlock=LBA/32;
284 1 nCurrentPage =LBA%32;
285 1 nBegainPage = nCurrentPage;
286 1
287 1 Bulk_Status = BULK_DATA_RECIEVE;
288 1 pCurrentBuf = Bulk_PACKET;
289 1 nBufCount = 0;
290 1
291 1 Flash_Erase_Block(Bufer_Block); //擦除缓冲区BLOCK
292 1
293 1 }
294
295 void Bulk_Receive_Data()
296 {
297 1 unsigned int i=0;
298 1 Copy(pCurrentBuf+nBufCount,Bulk_Buffer,EP2_PACKET_SIZE);
C51 COMPILER V6.12 BULK_ONLY 08/20/2006 19:41:23 PAGE 6
299 1 nBufCount+=EP2_PACKET_SIZE;
300 1 if(nBufCount==512) //如果一扇区内容接收完毕
301 1 {
302 2 Flash_Write_Page(Bufer_Block,nCurrentPage,Bulk_PACKET,512); //将数据暂时写到缓冲区BLOCK
303 2 nCurrentPage++; //页指针加1
304 2 Transfer_Length--; //待传输数据长度减1
305 2 nBufCount=0;
306 2 }
307 1
308 1 if((Transfer_Length>0)&&(nCurrentPage == 32)) //如果一个BLOCK写完毕
309 1 {
310 2 for(i=0;i<nBegainPage;i++)
311 2 {
312 3 Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
313 3 Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
314 3 }
315 2 Flash_Erase_Block(nCurrentBlock);
316 2 for(i=0;i<32;i++)
317 2 {
318 3 Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
319 3 Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
320 3 }
321 2 nCurrentBlock++;
322 2 nCurrentPage=0;
323 2 nBufCount=0;
324 2 nBegainPage=0;
325 2 Flash_Erase_Block(Bufer_Block);
326 2 }
327 1
328 1 if(Transfer_Length==0)
329 1 {
330 2 for(i=0;i<nBegainPage;i++)
331 2 {
332 3 Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
333 3 Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
334 3 }
335 2 for(i=nCurrentPage;i<32;i++)
336 2 {
337 3 Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
338 3 Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
339 3 }
340 2 Flash_Erase_Block(nCurrentBlock);
341 2 for(i=0;i<32;i++)
342 2 {
343 3 Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
344 3 Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
345 3 }
346 2 TransCSW();
347 2 }
348 1 }
349 void Copy(unsigned char *PEnd,unsigned char *PSource,unsigned int num)
350 {
351 1 unsigned int i=0;
352 1 for(i=0;i<num;i++)
353 1 {
354 2 *(PEnd+i)=*(PSource+i);
355 2 }
356 1 }
357
358 ////////////////////////////////////////////////////////////////////////////////////////////////
C51 COMPILER V6.12 BULK_ONLY 08/20/2006 19:41:23 PAGE 7
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1801 ----
CONSTANT SIZE = 68 ----
XDATA SIZE = 607 ----
PDATA SIZE = ---- ----
DATA SIZE = 29 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -