📄 scl.c
字号:
// SCmdDisp.cpp: implementation of the SCmdDisp class.
//
//////////////////////////////////////////////////////////////////////
#define __OS_SOURCE_FILE__
#include "Kernel.h"
#include "SCL.h"
#include "HAL.h"
#include "RbcCmd.h"
UINT g_uLen; // SCSI CDB len
BYTE *g_pCDB; // CDB pointer
UINT g_uDLen; // Data len
UINT32 g_BufferSize;
#define UPDATE_BUFFSIZE 0x1000
BYTE *g_pData; // Data pointer
UINT g_uSLen; // Sense len
BYTE *g_pSense; // Sense pointer
UINT g_uStatus;
UINT g_uDirection; // Data transfer direction
DWORD g_dwXansfer; // Data transfer
DWORD *g_pdwResidue;
const CLSCMD g_arSupportCmd[] = {
BUILDCDB(0x28, cmd_readChkCmd, cmd_readBuildResponse, NULL), // Read(10)
BUILDCDB(0x2a, cmd_wriChkCmd, cmd_wriBuildResponse, NULL), // Write
BUILDCDB(0x25, cmd_rcChkCmd, cmd_rcBuildResponse, NULL), // Read Capacity
BUILDCDB(0x03, cmd_rsChkCmd, cmd_rsBuildResponse, NULL), // Request Sense
BUILDCDB(0x00, cmd_turChkCmd, cmd_turBuildResponse, NULL), // test unit ready
BUILDCDB(0x23, cmd_UnknownChkCmd, cmd_UnknownBuildResponse, NULL), // 23h
BUILDCDB(0x12, cmd_iqChkCmd, cmd_iqBuildResponse, NULL), // Inquiry
BUILDCDB(0x1a, cmd_ModeSenseChkCmd, cmd_ModeSenseBuildResponse, NULL), // Mode Sense
BUILDCDB(0x1e, cmd_MediumRemoveChkCmd, cmd_MediumRemoveBuildResponse, NULL), // Mode Sense
};
const ULP_ONRECEIVEDPROC g_pfnSCSI_OnSCR[] = {
SCSI_OnSCR
};
// extern var use
extern NU_MEMORY_POOL System_Memory;
extern REQUEST_SENSE_DATA Req_SenseData;
UINT SCSI_Init(void)
{
g_pData = NULL; // Data pointer
g_uLen = 0; // SCSI CDB len
g_pCDB = NULL; // CDB pointer
g_uDLen = 0; // Data len
g_uSLen = 0; // Sense len
g_pSense = NULL; // Sense pointer
g_uStatus = 0; // SCSI Status
g_uDirection = 0; // Data transfer direction
g_dwXansfer = 0; // Data transfer
g_pdwResidue = NULL;
memset(&Req_SenseData,0x0,sizeof(REQUEST_SENSE_DATA));
Req_SenseData.ResponseCode= 0x70;
Req_SenseData.Valid = 0x1;
Req_SenseData.AdditionalSenseLen = 0x0b;
Req_SenseData.ASC= 0x28;
if (NULL != g_pData)
{
MemFree(g_pData);
}
for (g_BufferSize=64*1024; g_BufferSize>=8*1024; g_BufferSize/=2)
{
g_pData = (BYTE*)MemAlloc(g_BufferSize);
if(NU_NULL != g_pData )
break;
}
if (NULL == g_pData)
return CHECK_CONDITION;
return BOL_Init(sizeof(g_pfnSCSI_OnSCR)/sizeof(g_pfnSCSI_OnSCR[0]), (ULP_ONRECEIVEDPROC *)g_pfnSCSI_OnSCR);
}
UINT SCSI_UnInit()
{
if (NULL != g_pData)
{
MemFree(g_pData);
g_pData = NULL;
}
return 0;
}
UINT SCSI_SCC(UINT uSLen, BYTE *pSense, UINT uStatus)
{
return 0;
}
// LLP callback function.
UINT SCSI_OnSCR(UINT uLen, BYTE *pCDB, UINT uDirection, DWORD dwXansfer, DWORD *pdwResidue)
{
UINT8 nCount;
UINT8 u=0;
UINT uRet = CSW_GOOD;
if (uLen == 0 || NULL == pCDB)
return CSW_FAIL;
nCount = sizeof(g_arSupportCmd)/sizeof(g_arSupportCmd[0]);
for (u=0; u<nCount; u++)
{
if (g_arSupportCmd[u].uOptrCode == (*(BYTE *)pCDB))
{
g_uLen = uLen;
g_pCDB = pCDB;
g_uDirection = uDirection;
g_dwXansfer = dwXansfer;
g_pdwResidue = pdwResidue;
// if (0 == (uRet = g_arSupportCmd[u].pfnChkCmd()))
{
uRet = g_arSupportCmd[u].pfnBuildResponse();
}
g_uStatus = (MS_STATUS)uRet;
// SCSI_SetStatus((MS_STATUS)uRet);
break;
}
}
// SCSI_SCC(g_uSLen, g_pSense, g_uStatus);
#define SafeFree(p); if (p) MemFree(p); p = NULL;
g_uLen = 0;
g_pCDB = NULL;
g_uDLen = 0;
g_uSLen = 0;
SafeFree(g_pSense);
g_uStatus = 0;
g_uDirection = 0;
g_dwXansfer = 0;
g_pdwResidue = NULL;
return (uRet == CHECK_CONDITION) ? CSW_FAIL : uRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -