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