⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsicmd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
 588          //----------------------------------------------------------------------------  
 589          void ScsiCmdPreventRemoval()
 590          {
 591   1        if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0) 
 592   1          ScsiInvalidFieldError(ScsiLun); 
 593   1        // We don't support link SCSI commands.  
 594   1        if (*(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 5) & SCSI_CTRL_LINK_BIT)      
 595   1        {
 596   2          SET_ILLEGAL_REQUEST(ScsiLun);
 597   2          CmdStatus = COMMAND_FAILED;         
 598   2        }     
 599   1        
 600   1        BulkFreeBuffer();  //Out端点接收使能
 601   1        
 602   1        if (CmdStatus == COMMAND_PASSED)
 603   1          BulkPrepareCSW(CmdStatus);
 604   1        else  
 605   1        {
 606   2          BulkInStall();
 607   2          BulkState = STALL_IN_COMPLETED;   
 608   2        }  
 609   1      }  
 610          
 611          //----------------------------------------------------------------------------
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 11  

 612          // ScsiCmdReadCapacity10
 613          //----------------------------------------------------------------------------
 614          void ScsiCmdReadCapacity10()
 615          {
 616   1        if (UsbDmaTotalLength > CAPACITY10_DATA_LEN)
 617   1          UsbDmaTotalLength = CAPACITY10_DATA_LEN;
 618   1          
 619   1        if (!(0x80 & BlockWrapper->Flags))
 620   1          ScsiInvalidFieldError(ScsiLun); 
 621   1        
 622   1        BulkFreeBuffer();  //Out端点接收使能
 623   1          
 624   1        if (CmdStatus == COMMAND_PASSED)
 625   1        {
 626   2              SetBulkInFull();
 627   2          ScsiGetLunCapacity();
 628   2          BulkSetDmaIn((UINT16)UsbDmaTotalLength);
 629   2          BulkState = BULK_DMA_IN_COMPLETED; 
 630   2        }  
 631   1        else
 632   1        {  
 633   2          BulkInStall();                                      //将IN STALL位置1
 634   2          BulkState = STALL_IN_COMPLETED; //转到STALL_IN_COMPLETED状态处理
 635   2        }     
 636   1      }  
 637          
 638          //----------------------------------------------------------------------------
 639          // ScsiCmdRead10
 640          //----------------------------------------------------------------------------
 641          void ScsiCmdRead10()
 642          {
 643   1          STATUS Status;
 644   1      
 645   1          SectorStart = *(UINT32 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2);
 646   1          SectorCount = *(UINT16 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 7);
 647   1      
 648   1          if(!(BlockWrapper->Flags & 0x80))
 649   1          {
 650   2              SetSenseErrCmdField();
 651   2          } 
 652   1          
 653   1          BulkFreeBuffer();//Out端点接收使能  
 654   1      
 655   1          if(CmdStatus == COMMAND_PASSED)
 656   1          {   
 657   2              Status = ReadSector();  //derek
 658   2      
 659   2                      if(Status != STATUS_SUCCESS)
 660   2              {
 661   3                  CmdStatus = COMMAND_FAILED;
 662   3                  SetSenseDataRd(Status);
 663   3              }
 664   2          }
 665   1      
 666   1          if(CmdStatus == COMMAND_PASSED)
 667   1          {
 668   2              BulkState = BULK_DMA_IN_COMPLETED;
 669   2                      BulkSetDmaIn(BYTES_PER_SECTOR);
 670   2      
 671   2          }
 672   1          else
 673   1          {
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 12  

 674   2              BulkInStall();
 675   2              BulkState = STALL_IN_COMPLETED;
 676   2          }
 677   1      }  
 678          
 679          //----------------------------------------------------------------------------
 680          // ScsiCmdWrite10
 681          //----------------------------------------------------------------------------
 682          void ScsiCmdWrite10()
 683          {
 684   1      
 685   1          SectorStart = *(UINT32 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 2);
 686   1          SectorCount = *(UINT16 xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET + 7);
 687   1      
 688   1          if(0x80 & BlockWrapper->Flags)
 689   1          {
 690   2              SetSenseErrCmdField();
 691   2          }
 692   1      
 693   1          BulkFreeBuffer();//Out端点接收使能  
 694   1      
 695   1          if(CmdStatus == COMMAND_PASSED)
 696   1          {
 697   2              FirstWrite = true;
 698   2              BulkState = BULK_DMA_OUT_COMPLETED;
 699   2      
 700   2          }
 701   1              if(CmdStatus != COMMAND_PASSED)       
 702   1          {
 703   2              BulkInStall();
 704   2              BulkState = STALL_IN_COMPLETED; 
 705   2          }
 706   1      }  
 707          
 708          //----------------------------------------------------------------------------
 709          // ScsiCmdVerify10
 710          //----------------------------------------------------------------------------
 711          void ScsiCmdVerify10()
 712          {
 713   1            
 714   1        if (ConvertEndian32(BlockWrapper->DataXsferLen) != 0) 
 715   1            ScsiInvalidFieldError(ScsiLun); 
 716   1            
 717   1        BulkFreeBuffer();  //Out端点接收使能
 718   1            
 719   1        if (CmdStatus == COMMAND_PASSED)
 720   1          BulkPrepareCSW(CmdStatus);  
 721   1        else        
 722   1        {
 723   2          BulkInStall();
 724   2          BulkState = STALL_IN_COMPLETED; 
 725   2        }     
 726   1      }  
 727          
 728          //----------------------------------------------------------------------------
 729          // ScsiCmdModeSelect6
 730          //----------------------------------------------------------------------------
 731          void ScsiCmdModeSelect6()
 732          {
 733   1        if (0x80 & BlockWrapper->Flags)
 734   1        {
 735   2          ScsiInvalidFieldError(ScsiLun); 
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 13  

 736   2        }
 737   1        // We don't support this command. 
 738   1        CmdStatus = COMMAND_FAILED; 
 739   1        
 740   1        BulkFreeBuffer();  //Out端点接收使能
 741   1        
 742   1        if (CmdStatus != PHASE_ERROR)
 743   1        {
 744   2          SET_ILLEGAL_REQUEST(ScsiLun);       
 745   2          // Wait Data Received Ready.
 746   2          BulkWaitOutDataReady();  // Wait Data Received Ready.
 747   2          BulkPrepareCSW(CmdStatus);
 748   2        }     
 749   1        else        
 750   1        {
 751   2          BulkInStall();
 752   2          BulkState = STALL_IN_COMPLETED; 
 753   2        }             
 754   1      }       
 755          
 756          //----------------------------------------------------------------------------
 757          // OpCode = 0x23.
 758          //----------------------------------------------------------------------------
 759          void ScsiCmdOpCode23H()
 760          {
 761   1        BulkFreeBuffer();     
 762   1          
 763   1              SetBulkInFull();        
 764   1          memset((BYTE xdata *)(FIFO_ADDRESS_IN), 0, 12);
 765   1        // Emulate PenDrive behavior to run BIOS Boot.
 766   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 3)     = 0x08;
 767   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 5)     = 0x01;
 768   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 6)     = 0xF4;
 769   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 8)     = 0x02;
 770   1          *(BYTE xdata *)(FIFO_ADDRESS_IN + 10)    = 0x02;
 771   1      
 772   1        BulkSetDmaIn(12);  
 773   1        BulkState = BULK_DMA_IN_COMPLETED;
 774   1       
 775   1      }  
 776          
 777          /***************************************************************************
 778            SCSI COMMAND END
 779          ***************************************************************************/
 780          
 781          //----------------------------------------------------------------------------
 782          // Do some initializations before a new SCSI command executed.
 783          //----------------------------------------------------------------------------
 784          void ScsiCmdNewStart()
 785          { 
 786   1        // Update the memory address of BlockWrapper.
 787   1        BlockWrapper = (CMD_BLOCK_WRAPPER xdata *)(FIFO_ADDRESS_OUT);     
 788   1       
 789   1        // UsbDmaTotalLength is used on other Scsicmd other than reading and writing.
 790   1        UsbDmaTotalLength = ConvertEndian32(BlockWrapper->DataXsferLen); 
 791   1        SectorStart = 0;                                //reset SectorStart & SectorCount
 792   1        SectorCount   = 0;
 793   1        CmdStatus = COMMAND_PASSED; 
 794   1        ScsiLun = BlockWrapper->CbwcbLun;
 795   1        WrapperTag = BlockWrapper->Tag;
 796   1      }
 797          
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 14  

 798          //----------------------------------------------------------------------------
 799          // Init SCSI used parameters.
 800          //----------------------------------------------------------------------------
 801          void ScsiInit()
 802          {
 803   1        BYTE i;
 804   1      
 805   1          SenseKey      = NO_SENSE;
 806   1          AddSenseCode  = 0x00;
 807   1          AddSenseCodeQ = 0x00;
 808   1      
 809   1        for (i = 0; i < MAX_DEVICE_NUM ; i++)  
 810   1        {
 811   2          ScsiWriteProtect[i] = false;
 812   2          ScsiWriteProtectChange[i] = false;
 813   2        }  
 814   1      }       
 815          
 816          //----------------------------------------------------------------------------
 817          // Check SCSI Command
 818          //----------------------------------------------------------------------------
 819          void ScsiCheckCmd()
 820          {
 821   1          BYTE OpCode;
 822   1          ScsiCmdNewStart();        
 823   1          OpCode = *(BYTE xdata *)(FIFO_ADDRESS_OUT + CBWCB_OFFSET);
 824   1                                                                                                       //
 825   1          ScsiLunValidCheck();
 826   1      
 827   1          if(CmdStatus == PHASE_ERROR)
 828   1          {
 829   2              SetSenseDataRd(STATUS_NO_MEDIA);
 830   2              BulkInStall();
 831   2              BulkState = STALL_IN_COMPLETED; 
 832   2              return;
 833   2          }
 834   1      
 835   1          if(BlockWrapper->Sign != CBW_SIGNATURE)
 836   1          {
 837   2              SetSenseErrCmdField();
 838   2              CmdStatus = PHASE_ERROR;
 839   2              BulkInStall();
 840   2              BulkState = STALL_IN_COMPLETED; 
 841   2              return;
 842   2          }
 843   1      
 844   1          switch (OpCode)
 845   1          {
 846   2              case TEST_UNIT_READY_OPCODE: ScsiCmdTestUnitReady(); return;
 847   2              case REQUEST_SENSE_OPCODE  : ScsiCmdRquestSense();   return;
 848   2              case MODE_SELECT6_OPCODE   : ScsiCmdModeSelect6();   return;
 849   2              case MODE_SENSE6_OPCODE    : ScsiCmdModeSense6();    return;
 850   2              case INQUIRY_OPCODE        : ScsiCmdInquiry();       return;
 851   2              case START_STOP_UNIT_OPCODE: ScsiCmdStartStopUnit(); return;
 852   2              case PREVENT_REMOVAL_OPCODE: ScsiCmdPreventRemoval();return;
 853   2              case READ_CAPACITY10_OPCODE: ScsiCmdReadCapacity10();return;
 854   2              case READ10_OPCODE         : ScsiCmdRead10();        return;
 855   2              case WRITE10_OPCODE        : ScsiCmdWrite10();       return;
 856   2              case VERIFY10_OPCODE       : ScsiCmdVerify10();      return;
 857   2              case _23_OPCODE            : ScsiCmdOpCode23H();     return;
 858   2              case MODE_SENSE10_OPCODE   : ScsiCmdModeSense10();   return;
 859   2                      case READ_BUFFER                   : ScsiCmdReadBuf();                   return; //2007.08.16
C51 COMPILER V7.02b   SCSICMD                                                              02/27/2008 12:56:18 PAGE 15  

 860   2              default:
 861   2                  CmdStatus = PHASE_ERROR;
 862   2                  SetSenseErrOpCode();
 863   2                  BulkInStall();
 864   2                  BulkState = STALL_IN_COMPLETED; 
 865   2          }
 866   1      }        
 867           
 868          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3527    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =     27      13
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -