📄 function.c
字号:
unReadBlockNum = wOffset;
dwCount = HAL_Read(dwBlock, unReadBlockNum, g_pData);
if (dwCount != (DWORD)unReadBlockNum * BlockLen)
{
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0x30; // CANNOT FORMAT MEDIUM - INCOMPATIBLE MEDIUM
Req_SenseData.ASCQ = 0x06;
return CHECK_CONDITION;
}
dwSend = BOL_BulkIn(dwCount, g_pData);
*g_pdwResidue -= dwSend;
if (dwSend != dwCount)
{
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0x04; // LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
Req_SenseData.ASCQ = 0x07;
return CHECK_CONDITION;
}
dwBlock += unReadBlockNum;
}
#endif
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_rcChkCmd(void)
{
//NU_Printf("READ CAPACITY - Check command\n\r");
return GOOD;
}
MS_STATUS cmd_rcBuildResponse(void)
{
BYTE bSendData[] = {0,0x03,0xD2,0, 0,0,0x02,0};
DWORD dwLBA, dwBlockLen;
MFlashInfo FlashInfo;
#ifndef SYS_UPDATE
FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &FlashInfo); //取得块大小和块数
dwLBA = FlashInfo.uPageSum - 1;
dwBlockLen = FlashInfo.uPageSize;
dwLBA += SEC_PER_TRACK;
if (g_bCardConnect) {
dwLBA += USB_PTABLE[1].p_size;
}
dwLBA = SWAP4(dwLBA);
dwBlockLen = SWAP4(dwBlockLen);
WRITE_DWORD(bSendData, dwLBA);
WRITE_DWORD(bSendData + 4, dwBlockLen);
#endif
BOL_BulkIn(sizeof(bSendData), bSendData);
*g_pdwResidue = g_dwXansfer - sizeof(bSendData);
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_rsChkCmd(void)
{
//NU_Printf("REQUEST SENSE - Check command\n\r");
return GOOD;
}
MS_STATUS cmd_rsBuildResponse(void)
{
BOL_BulkIn(sizeof(Req_SenseData)<*((UINT32 *)((UINT8 *)g_pCDB-15+8))?sizeof(Req_SenseData):*((UINT32 *)((UINT8 *)g_pCDB-15+8)), (BYTE *)&Req_SenseData);
*g_pdwResidue = g_dwXansfer - sizeof(Req_SenseData);
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_turChkCmd()
{
//NU_Printf("TEST UNIT READY - Check command\n\r");
return GOOD;
}
MS_STATUS cmd_turBuildResponse(void)
{
//检测逻辑块是否已经准备好
*g_pdwResidue = 0;
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_wriChkCmd(void)
{
//NU_Printf("WRITE - Check command\n\r");
return GOOD;
}
#ifdef USB_EVALUATE
#define EVALUATE_NUM 20
extern UINT8 g_nEvaluateFlag;
UINT8 g_nEvaluateTimes = 0; // counter for received package
#endif
MS_STATUS cmd_wriBuildResponse(void)
{
// READ10_CMD WriteCmd;
DWORD dwBlock; //, LBA_Addr;
// DWORD dwCount;
WORD wBlocks, i, BlockLen, wOffset;
MFlashInfo FlashInfo;
// WriteCmd.dwLBA = READ_DWORD(g_pCDB + 2);
// WriteCmd.wBlockNum = READ_WORD(g_pCDB + 7);
#ifdef SYS_UPDATE
BlockLen = 512;
#else
FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &FlashInfo); //取得块大小和块数
// LBA_Addr = FlashInfo.uPageSum - 1;
BlockLen = FlashInfo.uPageSize;
// BlockLen = 512;
#endif
*g_pdwResidue = g_dwXansfer;
wOffset = (UINT16)(g_BufferSize/ BlockLen);
dwBlock = SWAP4(READ_DWORD(g_pCDB + 2));
wBlocks = SWAP2(READ_DWORD(g_pCDB + 7));
// if (LBA_Addr < (dwBlock + wBlocks))
// return CHECK_CONDITION;
for (i=0; i < wBlocks; i += wOffset)
{
DWORD unReadBlockNum;
DWORD dwNeedRead;
unReadBlockNum = wBlocks - i;
if(unReadBlockNum > wOffset)
unReadBlockNum = wOffset;
dwNeedRead = unReadBlockNum * BlockLen;
if (BOL_BulkOut(dwNeedRead, g_pData) != dwNeedRead)
{
Req_SenseData.SenseKey = 0x0b; //ABORTED COMMAND.
Req_SenseData.ASC = 0x08; // LOGICAL UNIT COMMUNICATION TIME-OUT
Req_SenseData.ASCQ = 0x01;
return CHECK_CONDITION;
}
*g_pdwResidue -= dwNeedRead;
#ifdef USB_EVALUATE
if(dwNeedRead > 10*1024)
{
if(g_nEvaluateTimes++ == EVALUATE_NUM && g_nEvaluateFlag == USB_EVALUATE_RING0)
{
g_nEvaluateTimes = 0;
g_nEvaluateFlag = USB_EVALUATE_RING1; // CHECK receive & write TIME
}
}
if(g_nEvaluateFlag != USB_EVALUATE_RING0) // do not actully write to flash when evaluate ring0
{
#endif
if (HAL_Write(dwBlock, (UINT16)unReadBlockNum, g_pData) != dwNeedRead)
{
Req_SenseData.SenseKey =0x0b; //NOT READY
Req_SenseData.ASC = 0x04; // LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
Req_SenseData.ASCQ = 0x07;
return CHECK_CONDITION;
}
#ifdef USB_EVALUATE
}
#endif
dwBlock += unReadBlockNum;
}
Req_SenseData.SenseKey = 0; //No sense
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_UnknownChkCmd(void)
{
//NU_Printf("Unknown(23H) - Check command\n\r");
// return GOOD;
Req_SenseData.SenseKey = 0x05; //ILLEGAL REQUEST
Req_SenseData.ASC = 0x24; // INVALID FIELD IN CDB
Req_SenseData.ASCQ = 0x0;
return GOOD;
}
MS_STATUS cmd_UnknownBuildResponse(void)
{
//NU_Printf("Unknown(23h) - Build response\n\r");
// BOL_BulkIn(sizeof(UnknownCommand), (BYTE*)UnknownCommand);
BOL_BulkIn(sizeof(UnknownCommand)<*((UINT32 *)((UINT8 *)g_pCDB-15+8))?sizeof(UnknownCommand):*((UINT32 *)((UINT8 *)g_pCDB-15+8)), (BYTE *)&UnknownCommand);
*g_pdwResidue = g_dwXansfer - sizeof(UnknownCommand);
// return GOOD;
return GOOD;
}
MS_STATUS cmd_VerifyChkCmd(void)
{
/* //NU_Printf("Unknown(2FH) - Check command\n\r");
// return GOOD;
Req_SenseData.SenseKey = 0x05; //ILLEGAL REQUEST
Req_SenseData.ASC = 0x24; // INVALID FIELD IN CDB
Req_SenseData.ASCQ = 0x0;
return CHECK_CONDITION;
*/
return GOOD;
}
MS_STATUS cmd_VerifyBuildResponse(void)
{
//NU_Printf("Unknown(2Fh) - Build response\n\r");
Req_SenseData.SenseKey = 0;
Req_SenseData.ASC = 0;
Req_SenseData.ASCQ = 0;
return GOOD;
}
MS_STATUS cmd_ModeSenseChkCmd(void)
{
//return GOOD;
/*
Req_SenseData.SenseKey = 0x05; //ILLEGAL REQUEST
Req_SenseData.ASC = 0x24; // INVALID FIELD IN CDB
Req_SenseData.ASCQ = 0x0;
return CHECK_CONDITION;
*/
Req_SenseData.SenseKey = 0; //ILLEGAL REQUEST
Req_SenseData.ASC = 0; // INVALID FIELD IN CDB
Req_SenseData.ASCQ = 0x0;
return GOOD;
}
MS_STATUS cmd_ModeSenseBuildResponse(void)
{
//NU_Printf("Mode Sense - Build response\n\r");
if (g_dwXansfer <= sizeof(ModeSenseData))
{
BOL_BulkIn(g_dwXansfer, (BYTE*)ModeSenseData);
*g_pdwResidue = 0;
}
else
{
BOL_BulkIn(sizeof(ModeSenseData), (BYTE*)ModeSenseData);
*g_pdwResidue = g_dwXansfer - sizeof(ModeSenseData);
}
return GOOD;
// return CHECK_CONDITION;
}
MS_STATUS cmd_MediumRemoveChkCmd(void)
{
Req_SenseData.SenseKey = 0x05;
Req_SenseData.ASC = 0x24; // INVALID FIELD IN CDB
Req_SenseData.ASCQ = 0x0;
return CHECK_CONDITION;
}
MS_STATUS cmd_MediumRemoveBuildResponse()
{
return CHECK_CONDITION;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -