📄 doscsicommand.c
字号:
case 0x23: /* READ FORMAT CAPACITY report a list of possible format capacities */
if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN)
{ /* command direction does not according with Data Transport direction */
BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
// since this is a fixed size stroage mdeia, so just return its block length and block size
// no. of block form MBR
readFormatCapData[6] = MBRCache.Buf[0x1cb];
readFormatCapData[7] = MBRCache.Buf[0x1ca];
// Descriptor type
readFormatCapData[8] = 0x02; // indicated it is formatted media
// Block length
readFormatCapData[10] = 0x02;
readFormatCapData[11] = 0x00;
/* set up data buffer pointers */
BufPtr[DATA_INFO].ePtr = &readFormatCapData[11];
BufPtr[DATA_INFO].sPtr = &readFormatCapData[0];
// Only 11 bytes need to send
workValue = 12;
// cbwDataGVar->cbwType.dCBWDataTransferLength = workValue;
// In case workValue > max end-point size
Cache->ReadCache.Modified = 0;
// clear REQUEST_SENSE value
reqSensDataGVar[2] = 0x00; // Sense Key
reqSensDataGVar[12] = 0x00; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
break;
case 0x25: /* READ CAPACITY report logical blocks length and a block byte length */
if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN)
{ /* command direction does not according with Data Transport direction */
BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* UNIT is NOT READY */
if ((unit_state[0] & 0x01) == 0x01){
SetBotCmdErr(NOT_READY,0);
workValue = 0;
break;
}
workValue = 0;
for(c=3;c>=0;c--)
{
workValue *= 0x100;
workValue += MBRCache.Buf[0x1ca+c];
}
readCapaData[0] = workValue;
readCapaData[1] = BPS_SIZE;
workValue = 8;
// In case workValue > max end-point size
Cache->ReadCache.Modified = 0;
/* set up data buffer pointers */
BufPtr[DATA_INFO].ePtr = (unsigned char*)(&readCapaData[1] + 1);
BufPtr[DATA_INFO].sPtr = (unsigned char*)&readCapaData[0];
// clear REQUEST_SENSE value
reqSensDataGVar[2] = 0x00; // Sense Key
reqSensDataGVar[12] = 0x00; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
break;
case 0x28: /* READ(10) COMMAND */
if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN)
{ /* command direction does not according with Data Transport direction */
/* set up data buffer pointers */
BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* UNIT is NOT READY */
if ((unit_state[0] & 0x01) == 0x01){
SetBotCmdErr(NOT_READY,0);
workValue = 0;
break;
}
/* set up data buffer pointers */
//redirect storage's sector to logical working sector
workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwType.cmd7,2);
Cache->ReadCache.Sectors = workValue;
if(Cache->ReadCache.Sectors == 0)
{//read size is zero => error
BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
Cache->ReadCache.Addr = ConvRealn(&cbwDataGVar->cbwType.cmd2,4);
Cache->ReadCache.Addr *= BPS_SIZE;
// set up data buffer pointer
SCSI_READ();
workValue *= BPS_SIZE;
// clear REQUEST SENSE value
reqSensDataGVar[2] = 0x00; // Sense Key
reqSensDataGVar[12] = 0x00; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
break;
case 0x2A: /* WRITE(10) COMMAND */
if (EpInfo[USE_OUT_EP].PresentState != TRANS_OUT) {
/* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* UNIT is NOT READY */
if ((unit_state[0] & 0x01) == 0x01){
SetBotCmdErr(NOT_READY,0);
workValue = 0;
break;
}
if (write_protect==0) {
reqSensDataGVar[2] = 0x00; // Sense Key
reqSensDataGVar[12] = 0x00; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
} else {
// below setting is "Conditional Write Protect"
reqSensDataGVar[2] = 0x07; // Sense Key
reqSensDataGVar[12] = 0x27; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
report_wp=1;
}
workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwType.cmd7,2);
Cache->WriteCache.Sectors = workValue;
/* set up data buffer pointers */
workValue = SCSI_WRITE();
break;
case 0x2F: /* VERIFY(10) COMMAND */
workValue = 0;
if (EpInfo[USE_OUT_EP].PresentState != TRANS_OUT)
{ /* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* UNIT is NOT READY */
if ((unit_state[0] & 0x01) == 0x01){
SetBotCmdErr(NOT_READY,0);
workValue = 0;
break;
}
/* in case BytChk bit is "0", confirm designated sector
in case BytChk bit is "1", return "PARAMETER VALUE INVALID" */
if ((cbwDataGVar->cbwType.cmd1 & ~0x02) != 0x00)
{
/* in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
set REQUEST SENSE value */
SetBotCmdErr(INVALID_1,0);
workValue = 0;
break;
}
// in case BytChk bit is "0", confirm designated sector
// clear REQUEST SENSE value
reqSensDataGVar[2] = 0x00; // Sense Key
reqSensDataGVar[12] = 0x00; // Additional Sense Code
reqSensDataGVar[13] = 0x00; // Additional Sense Code Qualifier
break;
default: /* not support commands */
/* INVALID FIELD IN CDB */
SetBotCmdErr(INVALID_0,0);
workValue = 0;
SCI_Str("\r\nSCMD-");
SCI_HexB(cbwDataGVar->cbwType.cmdOpeCode);
break;
}
return workValue;
}
/***************************************************************************
Function Name :SetBotCmdErr(BotCmdErrType,unsigned char)
Working :Set BOT Cmd Err (NOT READY)
Return Value :void
Created :{Author : A.Ikeya [2002.May.28]}
***************************************************************************/
void SetBotCmdErr(unsigned char BotCmdErr,unsigned char UnitNum)
{
int i;
switch (BotCmdErr){
case INVALID_0:
/* INVALID FIELD IN CDB */
reqSensDataGVar[2] = 0x05; /* Sense Key */
reqSensDataGVar[12] = 0x24; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
break;
case INVALID_1:
/* in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
set REQUEST SENSE value */
reqSensDataGVar[2] = 0x05; /* Sense Key *//* Invalid comand */
reqSensDataGVar[12] = 0x26; /* Additional Sense Code */
reqSensDataGVar[13] = 0x02; /* Additional Sense Code Qualifier */
break;
case NOT_READY:
reqSensDataGVar[2] = 0x02; /* Sense Key *//* NOT READY */
reqSensDataGVar[12] = 0x3A; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
break;
default:
/* INVALID FIELD IN CDB */
reqSensDataGVar[2] = 0x05; /* Sense Key */
reqSensDataGVar[12] = 0x24; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
break;
}
/* clear work area */
for(i = 0; i < 16; i++) {
returnData->longVal[i] = 0x00000000;
}
/* make CSW BCSWStatus */
cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
/* set up data buffer pointers */
BufPtr[DATA_INFO].ePtr = &returnData->byteVal[0];
BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -