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

📄 scsi.c

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

}

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

//        process RequestSense command (0x03)

//Arguments:

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

//Return Value:

//        none
//
void SCSICMD_RequestSense(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,18,(UWord16 *)(&SCSIDATA_RequestSense)) ;
      dCSWDataResidueVal=0;

}



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

Routine Description:

        process Inquiry command (0x12)

Arguments:

        G_USBMSDC_pCSW
        dCSWDataResidueVal

Return Value:

        not

--*/
void SCSICMD_Inquiry(void)
{
    int i ;
    
    
    USBMSDC_pCSW();

    
            
    
    for (i=0;i<=3;i++) 
    {
    
      G_USBMSDC_pCSW.dCSWDataResidue[i]=0;
      
    }
    
  
    D12_WriteEndpoint(5,36,(UWord16 *)(&SCSI_INQUIRY)) ;
}




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

Routine Description:

        process PreventAllowMediumRemoval command (0x1e)

Arguments:

        none

Return Value:

        none

--*/
void SCSICMD_PreventAllowMediumRemoval(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;



}

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

Routine Description:

        process ReadCapacity command (0x25)

Arguments:

        

Return Value:

        none

--*/
void SCSICMD_ReadCapacity(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;   

    
      //dCSWDataResidueVal=dCBWDaTrLen;       
      D12_WriteEndpoint(5,8,(UWord16 *)(&SCSIDATA_ReadCapacities)) ;
      dCSWDataResidueVal=0;









}


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

Routine Description:

        process Read10 command (0x28)

Arguments:

        

Return Value:

        none

--*/
void SCSICMD_Read10(void)
{


      UWord16 i,Read_DataBuffer ;

      USBMSDC_pCSW();   
      SCSI_Read10logicalBlockAddress=((EpBuf[17]<<8)+(EpBuf[18]))<<15;
      SCSI_Read10logicalBlockAddress=(SCSI_Read10logicalBlockAddress<<1)+((EpBuf[19]<<8)+(EpBuf[20])) ;
      
      SCSI_DataLength=(EpBuf[22]<<8)+EpBuf[23];
      SCSI_DataLength=K_FAT12_SectorSize*SCSI_DataLength;//
      
      Read_DataBuffer=(UWord16)(SCSI_Read10logicalBlockAddress)*(512);//K_FAT12_SectorSize;
      
      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_AcknowledgeEndpoint(0); // clear buffer
       	        
      //D12_WriteEndpoint(5,64,(MBR_Databuffer+Read_DataBuffer)) ;
      for (i=0;i<(SCSI_DataLength/512);i++)
      {
      
         Read_NFlash_Sector((ULONG)(G_MBR_Databuffer+Read_DataBuffer/512),256,(G_NFlash_DataBuff+i*512),K_NFlash_FirstPart);
         Read_NFlash_Sector((ULONG)(G_MBR_Databuffer+Read_DataBuffer/512),256,(G_NFlash_DataBuff+i*512+256),K_NFlash_SecondPart);
     
      }
      D12_WriteEndpoint(5,64,G_NFlash_DataBuff) ;
      
      dCSWDataResidueVal=SCSI_DataLength-64; 
     // G_BulkInDataBuff = (MBR_Databuffer+Read_DataBuffer)+64;
      G_BulkInDataBuff  = G_NFlash_DataBuff+64 ;
      
     




}

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

Routine Description:

        process Write10 command (0x2a)

Arguments:

        

Return Value:

        none

--*/
void SCSICMD_Write10(void)
{
      USBMSDC_pCSW();   
      SCSI_Write10logicalBlockAddress=((EpBuf[17]<<8)+(EpBuf[18]))<<15;
      SCSI_Write10logicalBlockAddress=(SCSI_Read10logicalBlockAddress<<1)+
                                       ((EpBuf[19]<<8)+(EpBuf[20])) ;
      
      SCSI_DataLength=(EpBuf[22]<<8)+EpBuf[23];
      SCSI_DataLength=K_FAT12_SectorSize*SCSI_DataLength;//
      
      SCSI_WriteAddress=(SCSI_Write10logicalBlockAddress)*(512);//K_FAT12_SectorSize;
      SCSI_BulkIn_Data_BufLen=0;
      
      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_AcknowledgeEndpoint(0); // clear buffer
       	        

}



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

Routine Description:

        process Verify10 command function

Arguments:

        none

Return Value:

        none

--*/
void SCSICMD_Verify10(void)
{






}

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

Routine Description:

        process ModeSense10 command function

Arguments:

        none

Return Value:

        none

--*/
void SCSICMD_ModeSense10(void)
{








}


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

Routine Description:

        process ReadFormatCapacities command (0x23)

Arguments:

        

Return Value:

        none

--*/
void SCSICMD_ReadFormatCapacities(void)
{
      
      
      USBMSDC_pCSW();
    
    
      G_USBMSDC_pCSW.dCSWDataResidue[0]=(UWord16)(dCBWDaTrLen-0x0c);    
      G_USBMSDC_pCSW.dCSWDataResidue[1]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[2]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[3]=0;   

    
      //dCSWDataResidueVal=dCBWDaTrLen;       
      D12_WriteEndpoint(5,12,(UWord16 *)(&SCSIDATA_ReadFormatCapacities)) ;
      dCSWDataResidueVal=0;




}

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

Routine Description:

        process ModeSense command (0x1a)

Arguments:

        

Return Value:

        none
        
++*/        
        
void SCSICMD_ModeSense06(void)
{
//   UWord16  L_ModeSense_Flag;

//      L_ModeSense_Flag=EpBuf[17];
  
      USBMSDC_pCSW();
    
     
      G_USBMSDC_pCSW.dCSWDataResidue[0]=(UWord16)(dCBWDaTrLen-0x04);    
      G_USBMSDC_pCSW.dCSWDataResidue[1]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[2]=0;
      G_USBMSDC_pCSW.dCSWDataResidue[3]=0;   
 
      //dCSWDataResidueVal=dCBWDaTrLen;     
     // if (L_ModeSense_Flag==0x3f)  
     // {
      
        // G_USBMSDC_pCSW.dCSWDataResidue[0]=(UWord16)(dCBWDaTrLen-0x30);
         D12_WriteEndpoint(5,4,(UWord16 *)(SCSIDATA_Sense)) ;
      
     // }
      
      
      dCSWDataResidueVal=0;



}



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

Routine Description:

        process  CSW come from the PC

Arguments:

        

Return Value:

        none

--*/
void USBMSDC_pCSW(void)
{
  int i ;
    G_USBMSDC_pCSW.dCSWSignature[0]=0x55;
    G_USBMSDC_pCSW.dCSWSignature[1]=0x53;
    G_USBMSDC_pCSW.dCSWSignature[2]=0x42;
    G_USBMSDC_pCSW.dCSWSignature[3]=0x53;
   
   for (i=0;i<=3;i++)    
   {
    
      G_USBMSDC_pCSW.dCSWTag[i]=EpBuf[i+4];
   }

    G_USBMSDC_pCSW.bCSWStatus=0;

}





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

Routine Description:

        process bulk in data from host PC 

Arguments:

          None    

Return Value:

        none
        
++*/        
void USBMSDC_BoBulkInData(void)
{
   int i;

  for(i=0;i<64;i++)
  {
     //MBR_Databuffer[SCSI_WriteAddress++]=EpBuf[i];
       G_NFlash_DataBuff[SCSI_BulkIn_Data_BufLen++]=EpBuf[i];
     
     SCSI_DataLength--;
     
     if (G_EndPnt2status == 0x60)
     {
        for(i=0;i<64;i++)
        {
            //MBR_Databuffer[SCSI_WriteAddress++]=EpBuf1[i];
            G_NFlash_DataBuff[SCSI_BulkIn_Data_BufLen++]=EpBuf1[i];
            
            SCSI_DataLength--;
        }
     }
  }
  
  
  if (SCSI_DataLength<=0)
  {
      G_ucBulkPhase =K_CommandPhase;
      D12_WriteEndpoint(5, 13, (UWord16 *)&G_USBMSDC_pCSW); 
      
      for(i=0;i<SCSI_DataLength/512;i++)
      {  
        Write_NFlash_Sector((SCSI_WriteAddress/512+i),512,G_NFlash_DataBuff+i*512,K_NFlash_WR_Var);
        
      }
  }
  
  
}



⌨️ 快捷键说明

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