📄 scsi.c
字号:
}
//*****************************************************************************
//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 + -