📄 usb_disk.lst
字号:
341 3 while(!(UEPSTAX&TXCMP));
342 3 UEPSTAX&=(~(TXCMP));
343 3 }
344 2 length--;
345 2 BLK.Block ++;
346 2 }
347 1 TransmitCSW();
348 1 }
349
350 void SCSI_Write10()
351 {
352 1 union
353 1 {
354 1 unsigned long page;
355 1 unsigned char addr[4];
356 1 }PG;
357 1
358 1 unsigned char i=0,length=0,nBeginPage=0;
359 1
360 1 NfWriteCmd(0x60);
361 1 NfWriteAddr(BuffBlock);
362 1 NfWriteAddr(0xff);
363 1 NfWriteCmd(0xd0);
364 1
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 7
365 1 NfWaitBusy();
366 1
367 1 NfWriteCmd(0x60);
368 1 NfWriteAddr(BuffBlock|0x20);
369 1 NfWriteAddr(0xff);
370 1 NfWriteCmd(0xd0);
371 1
372 1 PG.addr[2] = bulk_CBW.CBWCB[4];
373 1 PG.addr[3] = bulk_CBW.CBWCB[5];
374 1 length = bulk_CBW.CBWCB[8];
375 1
376 1 nBeginPage = PG.addr[3]&0x1f;
377 1 UEPNUM = 0x02;
378 1 NfWaitBusy();
379 1
380 1 if(nBeginPage>0)
381 1 {
382 2 for(i=0;i<nBeginPage;i++)
383 2 {
384 3 NfWriteCmd(0x00);
385 3 NfWriteAddr(0); //A0-A7
386 3 NfWriteAddr((PG.addr[3]&0xe0)|i); //A9-A16
387 3 NfWriteAddr(PG.addr[2]); //A17-A24
388 3 NfWaitBusy();
389 3
390 3 NfWriteCmd(0x8a);
391 3 NfWriteAddr(0); //A0-A7
392 3 NfWriteAddr(BuffBlock|(PG.addr[3]&0x20)|i); //A9-A16
393 3 NfWriteAddr(0xff); //A17-A24
394 3 NfWaitBusy();
395 3 }
396 2 nBeginPage=0;
397 2 }
398 1
399 1 while(length>0)
400 1 {
401 2 NfWriteCmd(0x80);
402 2 NfWriteAddr(0); //A0-A7
403 2 NfWriteAddr((PG.addr[3]&0x3f)|BuffBlock); //A9-A16
404 2 NfWriteAddr(0xff); //A17-A24
405 2 for(i=0;i<8;i++)
406 2 {
407 3 while (!(UEPINT & EP2));
408 3 WriteFlash();
409 3 UEPSTAX &= 0xB9;
410 3 }
411 2 NfWriteCmd(0x10);
412 2 length--;
413 2 NfWaitBusy();
414 2
415 2 if(((PG.addr[3]&0x1f)==0x1f)||(length==0))
416 2 {
417 3 for(i=((PG.addr[3]&0x1f)+1);i<32;i++)
418 3 {
419 4 NfWriteCmd(0x00);
420 4 NfWriteAddr(0); //A0-A7
421 4 NfWriteAddr((PG.addr[3]&0xe0)|i); //A9-A16
422 4 NfWriteAddr(PG.addr[2]); //A17-A24
423 4 NfWaitBusy();
424 4
425 4 NfWriteCmd(0x8a);
426 4 NfWriteAddr(0); //A0-A7
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 8
427 4 NfWriteAddr((PG.addr[3]&0x20)|BuffBlock|i); //A9-A16
428 4 NfWriteAddr(0xff); //A17-A24
429 4 NfWaitBusy();
430 4 }
431 3
432 3 NfWriteCmd(0x60); //擦除当前block
433 3 NfWriteAddr(PG.addr[3]); //A9-A16
434 3 NfWriteAddr(PG.addr[2]); //A17-A24
435 3 NfWriteCmd(0xd0);
436 3 NfWaitBusy(); //等待操作完成
437 3
438 3 for(i=0;i<32;i++)
439 3 {
440 4 NfWriteCmd(0x00);
441 4 NfWriteAddr(0); //A0-A7
442 4 NfWriteAddr((PG.addr[3]&0x20)|BuffBlock|i); //A9-A16
443 4 NfWriteAddr(0xff); //A17-A24
444 4 NfWaitBusy();
445 4
446 4 NfWriteCmd(0x8a);
447 4 NfWriteAddr(0); //A0-A7
448 4 NfWriteAddr((PG.addr[3]&0xe0)|i); //A9-A16
449 4 NfWriteAddr(PG.addr[2]); //A17-A24
450 4 NfWaitBusy();
451 4 }
452 3
453 3 if(length>0)
454 3 {
455 4 NfWriteCmd(0x60); //擦除block
456 4 NfWriteAddr((PG.addr[3]&0x20)|BuffBlock); //A9-A16
457 4 NfWriteAddr(0xff); //A17-A24
458 4 NfWriteCmd(0xd0);
459 4 NfWaitBusy(); //等待操作完成
460 4 }
461 3 }
462 2 PG.page++;
463 2 }
464 1
465 1 TransmitCSW();
466 1 }
467
468 void main_rxdone()
469 {
470 1 unsigned char i;
471 1 unsigned char Buf[64];
472 1
473 1 i = ReadEp(2,Buf);
474 1 bulk_CSW[4] = Buf[4]; bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
475 1 for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
476 1 switch(bulk_CBW.CBWCB[0])
477 1 {
478 2 case Inquiry :WriteEpBulk(1,36,B_InquiryData);break;
479 2 case Mode_Sense :SCSI_Mode_Sense(); break;
480 2 case Read10 :SCSI_Read10(); break;
481 2 case Read_Capacity :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
482 2 case Read_Format_Capacities :SCSI_Read_Format_Capacities(); break;
483 2 case Test_Unit_Ready :TransmitCSW(); break;
484 2 case Verify :TransmitCSW(); break;
485 2 case Write10 :SCSI_Write10(); break;
486 2 case Medium_Removal :TransmitCSW(); break;
487 2 //响应PC机删除U盘设备的命令
488 2 case Sync_Cache :TransmitCSW(); break;
C51 COMPILER V8.02 USB_DISK 08/24/2008 00:08:02 PAGE 9
489 2 case Start_Unit :TransmitCSW(); break;
490 2 }
491 1 }
492
493 void Flash_Reset(void) //flash reset
494 {
495 1 uint i;
496 1 NfWriteCmd(0xFF);
497 1 for (i=0; i<3000; i++) ; //delay
498 1 }
499
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1384 ----
CONSTANT SIZE = 184 ----
XDATA SIZE = ---- 85
PDATA SIZE = ---- ----
DATA SIZE = 25 38
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -