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

📄 scsi.c

📁 DSP+MP3+USB+FAT12的所有源程序(C语言编写)
💻 C
📖 第 1 页 / 共 2 页
字号:


#include "general.h"
#include "scsi2.h"


UWord32 dCBWDaTrLen ;
//UWord16 dCSWDataResidue[4] ;
UWord32 dCSWDataResidueVal;
UWord16 *G_BulkInDataBuff;

UWord16 G_EndPnt2status;
extern USBMSDC_CBW  G_USBMSDC_pCBW;
USBMSDC_CSW  G_USBMSDC_pCSW;


//UWord16 G_MBR_DataBuffer  = 0x0;
/*******************************************************************/
//scsi data format and construct 



UWord16 SCSI_INQUIRY[36]=
{
 0x00,
 0x80,
 0x00,
 0x01,
 0x1f,
 0x00, //reserved
 0x00, //reserved
 0x00, //reserved
 0x20,
 0x20,  // // 10
 0x20, //
 0x20, //
 0x20,
 0x20, //
 0x20, //
 0x20, //
 0x55, //u
 0x53,  //s
 0x42, //b
 0x20, //space  //20
 0x4d,  //m
 0x50, //p
 0x33, //3
 0x20, //
 0x20,
 0x20,  //
 0x20, //
 0x20, //
 0x20,
 0x20,         //30
 0x20, //
 0x20, //
 0x31, //ascII   "1"
 0x2e,     //    "."
 0x30,  //       "0"
 0x30, //        "0"  //version : 1.00
  
 };//

#if(NandFlash_256MB==3)

UWord16 SCSIDATA_ReadFormatCapacities[]=
{
 0x00,//reserved
 0x00,//reserved
 0x00,//reserved
 0x08,//Capacity List Length
 0x00, //number of block   MSB
 0x00, //number of block    |
 0x3e, //number of block    |
 0x80, //number of block   LSB // 256MBYTE
 0x03, //no cartridge in drive
 0x00,  // length of block// 10
 0x02, //
 0x00, //  
 };

UWord16 SCSIDATA_ReadCapacities[]=
{
 0x00, //last logic block address   MSB
 0x00, //last logic block address    |
 0x3e, //last logic block address    |
 0x7f,//last logic block address   LSB  
 0x00, //length of block   MSB
 0x00, //length of block    |
 0x02, //length of block    |
 0x00, //length of block   LSB

};


UWord16 SCSIDATA_RequestSense[]=
{
   0x70,
   0x00,
   0x05,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x0a,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x20,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,


} ;


UWord16 SCSIDATA_Sense[]=
{
   0x03,
   0x00,
   0x00,
   0x00,
  /* 
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x02,
   0x00,
   */
   0x01,
   0x0a,
   0x00,
   0x10,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x02,
   0x00,
   0x00,
   0x00, //page 1
  
   0x05,//page 2
   0x1e,
   0x0f,
   0xa0,
   
   0x04,
   0x10,
   0x02,
   0x00,
   
   0x00,
   0xfa,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00,
   

};
#endif 

//*****************************************************************************
/*++

Routine Description:

        process Endpoint2 out data handling

Arguments:

        none

Return Value:

        none

--*/
void BULKOUT_Packet(void)
{

    if (G_ucBulkPhase == K_CommandPhase)
    {
       USBMSDC_BoCommand();
    }
    
    else if (G_ucBulkPhase == K_OutDataPhase)
    {
       USBMSDC_BoBulkInData();
    }


}



//*****************************************************************************
/*++

Routine Description:

        process Endponit2 in data handlling

Arguments:

        none

Return Value:

        none

--*/
void BULKIN_Packet(void)
{  
   UWord16  Tran_DataLen;
   

  if(G_ucBulkStausPhase==K_InDataPhase )
  {	
	  if( dCSWDataResidueVal >64) 
	  {
		
		 D12_WriteEndpoint(5,64,G_BulkInDataBuff) ;
		 
		 dCSWDataResidueVal=dCSWDataResidueVal-64;
		 G_ucBulkStausPhase=K_InDataPhase;
		 G_BulkInDataBuff=G_BulkInDataBuff+64;
		
	  }
	  else if( dCSWDataResidueVal==64) 
	  {
	
		 D12_WriteEndpoint(5,64,G_BulkInDataBuff) ;
		 
		 dCSWDataResidueVal=0;
		 G_ucBulkStausPhase=K_InCSWPhase;
		
		
	  }
	  else if( dCSWDataResidueVal != 0) 
	  {
		 Tran_DataLen=(UWord16)dCSWDataResidueVal;
	
         D12_WriteEndpoint(5,(Tran_DataLen),(G_BulkInDataBuff)) ;       	
	     dCSWDataResidueVal=0;
	     G_ucBulkStausPhase=K_InCSWPhase;
	   

	  }

  }	
	
  else if (G_ucBulkStausPhase==K_InCSWPhase) // return the csw packet 
  {
	   D12_WriteEndpoint(5, 13, (UWord16 *)&G_USBMSDC_pCSW); 
	 
	  
  }

}




//*****************************************************************************
/*++

Routine Description:

        process Main endpoint 2 out command function
        
Arguments:

        pSCSI--> The CBWCB flag pointer

Return Value:

         none
--*/

void USBMSDC_BoCommand(void)
{ 
 
  UWord16 pSCSI[16] ;

       dCBWDaTrLen=((EpBuf[11]<<8)+(EpBuf[10]))<<15;
       dCBWDaTrLen=(dCBWDaTrLen<<1)+((EpBuf[9]<<8)+(EpBuf[8])) ; // copmpute the length
       
       pSCSI[0]=EpBuf[15];
       
       switch (pSCSI[0])
       {
                 //---------------------------------------------------
                 //6-byte command
                 //---------------------------------------------------
          case K_SCSICMD_TEST_UNIT_READY:                 //0x00
			
               SCSICMD_TestUnitReady();
               G_ucBulkStausPhase=K_InCSWPhase;
               break;
/*
          case K_SCSICMD_REZERO_UNIT:                     //0x01
               SCSICMD_RezeroUnit();
               G_ucBulkPhase = K_InResponsePhase;
               break;
*/
          case K_SCSICMD_REQUEST_SENSE:                   //0x03
               SCSICMD_RequestSense();
               G_ucBulkStausPhase=K_InCSWPhase;
               break;
/*
          case K_SCSICMD_FORMAT_UNIT:                     //0x04
               SCSICMD_FormatUnit();
               G_ucBulkPhase = K_OutDataPhase;
               break;
*/                                
          case K_SCSICMD_INQUIRY:                         //0x12
				
			   //G_USBMSDC_ulLatestCmd = K_SCSICMD_INQUIRY;
               SCSICMD_Inquiry();
               G_ucBulkStausPhase=K_InCSWPhase;//K_InDataPhase; // return the CSW 
               break;
/*
          case K_SCSICMD_MODE_SELECT_06:                  //0x15   
               SCSICMD_ModeSelect06();
               G_ucBulkPhase = K_OutDataPhase;
               break;
*/
          case K_SCSICMD_MODE_SENSE_06:                   //0x1a                
               SCSICMD_ModeSense06();
               G_ucBulkStausPhase=K_InCSWPhase;

               break;
/*
          case K_SCSICMD_START_STOP_UNIT:                 //0x1b   
               SCSICMD_StartStopUnit();
               G_ucBulkPhase = K_InResponsePhase;
               break;

          case K_SCSICMD_SEND_DIAGNOSTIC:                 //0x1d   
               SCSICMD_SendDiagnostic();
               G_ucBulkPhase = K_InResponsePhase;
               break;
*/
          case K_SCSICMD_PREVENT_ALLOW_MEDIUM_REMOVAL:    //0x1e
               SCSICMD_PreventAllowMediumRemoval();
               G_ucBulkStausPhase=K_InCSWPhase;
               break;

          //---------------------------------------------------
          //10-byte command
          //---------------------------------------------------
          case K_SCSICMD_READ_CAPACITY:                   //0x25
               SCSICMD_ReadCapacity();
               G_ucBulkStausPhase=K_InCSWPhase;
               break;

          case K_SCSICMD_READ_10:                         //0x28         
               SCSICMD_Read10();
               G_ucBulkStausPhase=K_InDataPhase;
                
               
               break;

          case K_SCSICMD_WRITE_10:                        //0x2a			  
               SCSICMD_Write10();
               G_ucBulkPhase =K_OutDataPhase;
               break;
/*
          case K_SCSICMD_SEEK_10:                         //0x2b
               SCSICMD_Seek10();
               G_ucBulkPhase = K_InResponsePhase;
               break;

          case K_SCSICMD_WRITE_AND_VERIFY_10:             //0x2e
               SCSICMD_WriteAndVerify10();
               G_ucBulkPhase = K_OutDataPhaseWrite;
               break;
*/
          case K_SCSICMD_VERIFY_10:                       //0x2f
               SCSICMD_Verify10();
               //G_ucBulkPhase = K_InResponsePhase;
               break;
/*
          case K_SCSICMD_MODE_SELECT_10:                  //0x55
               SCSICMD_ModeSelect10();
               G_ucBulkPhase = K_OutDataPhase;
               break;
*/
          case K_SCSICMD_MODE_SENSE_10:                   //0x5a   
               SCSICMD_ModeSense10();
               //G_ucBulkPhase = K_InDataPhase;
               break;
/*
          //---------------------------------------------------
         //12-byte command
         //---------------------------------------------------
          case K_SCSICMD_READ_12:                         //0xa8         
               SCSICMD_Read12();
               G_ucBulkPhase = K_InDataPhaseRead;
               break;

          case K_SCSICMD_WRITE_12:                        //0xaa
               SCSICMD_Write12();
               G_ucBulkPhase = K_OutDataPhaseWrite;
               break;
*/						
          case K_SCSICMD_READ_FORMAT_CAPACITIES:          //0x23								
			   
               SCSICMD_ReadFormatCapacities();
			   G_ucBulkStausPhase=K_InCSWPhase;
               break;


    
          default:
                            
          break;
                
      }                
        


}

//*****************************************************************************
//Routine Description:

//        process Inquiry command (0x00)

//Arguments:

//        pSCSI - pointer to SCSI command
//        pSize - data size processed

//Return Value:

//        valid command or not
//
void SCSICMD_TestUnitReady(void)
{
      USBMSDC_pCSW();   
    
      G_USBMSDC_pCSW.dCSWDataResidue[0]=0; 
      G_USBMSDC_pCSW.dCSWDataResidue[1]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[2]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[3]=0;   
      D12_WriteEndpoint(5, 13, (UWord16 *)&G_USBMSDC_pCSW);         
      dCSWDataResidueVal=0;


⌨️ 快捷键说明

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