📄 scsi.c
字号:
size of data processed
--*/
{
PSCSIDATA_MODE_REM_BLK_ACC_CAP_PAGE pPage1b;
UCHAR i;
pPage1b = (PSCSIDATA_MODE_REM_BLK_ACC_CAP_PAGE) pPage;
pPage1b->BYTE0.PS = 0;
pPage1b->BYTE0.reserved = 0;
pPage1b->BYTE0.pageCode = 0x1b;
pPage1b->pageLength = SCSIDATA_MODE_REM_BLK_ACC_CAP_PAGE_SIZE - 2;
pPage1b->BYTE2.SFLP = 0;
pPage1b->BYTE2.SRFP = 0;
pPage1b->BYTE2.reserved = 0;
pPage1b->BYTE3.NCD = 0;
pPage1b->BYTE3.SML = 0;
pPage1b->BYTE3.reserved = 0;
pPage1b->BYTE3.TLUN = 1;
for (i = 0; i < 8; i++)
pPage1b->reserved[i] = 0;
return(SCSIDATA_MODE_REM_BLK_ACC_CAP_PAGE_SIZE);
}
//-----------------------------------------------------------------------------
//SCSICMD_ModePage1c
//-----------------------------------------------------------------------------
ULONG SCSICMD_ModePage1c(PUCHAR pPage) USING_1
/*++
Routine Description:
process Mode Page 1c
Arguments:
pSCSI - pointer to SCSI command
Return Value:
size of data processed
--*/
{
PSCSIDATA_MODE_TIMER_AND_PROTECT_PAGE pPage1c;
UCHAR i;
pPage1c = (PSCSIDATA_MODE_TIMER_AND_PROTECT_PAGE) pPage;
pPage1c->BYTE0.PS = 0;
pPage1c->BYTE0.reserved = 0;
pPage1c->BYTE0.pageCode = 0x1c;
pPage1c->pageLength = SCSIDATA_MODE_TIMER_AND_PROTECT_PAGE_SIZE - 2;
pPage1c->reserved0 = 0;
pPage1c->BYTE3.reserved = 0;
pPage1c->BYTE3.inactivityTimeMultiplier = 0x01;
pPage1c->BYTE4.reserved = 0;
pPage1c->BYTE4.DISP = 0;
pPage1c->BYTE4.SWPP = 0;
for (i = 0; i < 3; i++)
pPage1c->reserved1[i] = 0;
return(SCSIDATA_MODE_TIMER_AND_PROTECT_PAGE_SIZE);
}
//patch4.5@richie@wp xp begin
//-----------------------------------------------------------------------------
//SCSICMD_Mode06ParameterHeader
//-----------------------------------------------------------------------------
ULONG SCSICMD_Mode06ParameterHeader(PUCHAR pPage, ULONG size) USING_1
/*++
Routine Description:
process Mode Page 1c
Arguments:
pSCSI - pointer to SCSI command
Return Value:
size of data processed
--*/
{
PSCSIDATA_MODE06_PARAMETER_HEADER pHeader;
//UCHAR i;
pHeader = (PSCSIDATA_MODE06_PARAMETER_HEADER) pPage;
pHeader->modeDataLength = (UCHAR)(size - SCSIDATA_MODE06_PARAMETER_HEADER_SIZE);
//DbgPrint("pHeader->modeDataLength = %bx\n",pHeader->modeDataLength);
pHeader->mediumTypeCode = 0x00;
if (G_USBMSDC_ucCardLock == 1)
{
// DbgPrint("pHeader->BYTE3.WP = 1;\n");
pHeader->BYTE3.WP = 1;
}
else
{
// DbgPrint("pHeader->BYTE3.WP = 0;\n");
pHeader->BYTE3.WP = 0;
}
pHeader->BYTE3.reserved0 = 0;
pHeader->BYTE3.DPOFUA = 0;
pHeader->BYTE3.reserved1 = 0;
//richie
pHeader->reserved = 0;
//DbgPrint("Pages06=");
//for (i = 0;i < 10;i++)
//DbgPrint("%2bx ",G_pucStorDataPointer[i]);
//DbgPrint("\n");
return(SCSIDATA_MODE06_PARAMETER_HEADER_SIZE);
}
//-----------------------------------------------------------------------------
//SCSICMD_Mode10ParameterHeader
//-----------------------------------------------------------------------------
ULONG SCSICMD_Mode10ParameterHeader(PUCHAR pPage, ULONG size) USING_1
/*++
Routine Description:
process Mode Page 1c
Arguments:
pSCSI - pointer to SCSI command
Return Value:
size of data processed
--*/
{
PSCSIDATA_MODE10_PARAMETER_HEADER pHeader;
UCHAR i;
pHeader = (PSCSIDATA_MODE10_PARAMETER_HEADER) pPage;
pHeader->modeDataLength = M_ByteSwapOfWord((USHORT)(size - SCSIDATA_MODE10_PARAMETER_HEADER_SIZE));
//DbgPrint("pHeader->modeDataLength = %x\n",pHeader->modeDataLength);
pHeader->mediumTypeCode = 0x00;
if (G_USBMSDC_ucCardLock == 1)
{
pHeader->BYTE3.WP = 1;
}
else
{
pHeader->BYTE3.WP = 0;
}
pHeader->BYTE3.reserved0 = 0;
pHeader->BYTE3.DPOFUA = 0;
pHeader->BYTE3.reserved1 = 0;
//richie
for (i = 0; i < 4; i++)
pHeader->reserved[i] = 0;
//DbgPrint("Pages10=");
//for (i = 0;i < 10;i++)
//DbgPrint("%2bx ",G_pucStorDataPointer[i]);
//DbgPrint("\n");
return(SCSIDATA_MODE10_PARAMETER_HEADER_SIZE);
}
//patch4.5@richie@wp xp end
//-----------------------------------------------------------------------------
//SCSICMD_StartStopUnit
//-----------------------------------------------------------------------------
UCHAR SCSICMD_StartStopUnit(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Start Stop Unit command (0x1b)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_06BYTE pSCSI06;
pSCSI06 = (PSCSICMD_06BYTE) pSCSI;
*pSize = 0;
return(TRUE);
}
//Chamber@031103
#if 0
//-----------------------------------------------------------------------------
//SCSICMD_SendDiagnostic
//-----------------------------------------------------------------------------
UCHAR SCSICMD_SendDiagnostic(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Send Diagnostic command (0x1d)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_06BYTE pSCSI06;
pSCSI06 = (PSCSICMD_06BYTE) pSCSI;
*pSize = 0;
return(TRUE);
}
#endif
//-----------------------------------------------------------------------------
//SCSICMD_PreventAllowMediumRemoval
//-----------------------------------------------------------------------------
UCHAR SCSICMD_PreventAllowMediumRemoval(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Prevent Allow Medium Removal command (0x1e)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_06BYTE pSCSI06;
pSCSI06 = (PSCSICMD_06BYTE) pSCSI;
*pSize = 0;
return(TRUE);
}
//-----------------------------------------------------------------------------
//SCSICMD_ReadCapacity
//-----------------------------------------------------------------------------
UCHAR SCSICMD_ReadCapacity(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Read Capacity command (0x25)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_10BYTE pSCSI10;
PSCSIDATA_READ_CAPACITY pReadCapacity;
//richie@1203 if no medium then set sensekey = 02
if (G_ucStorageType != G_Card_Type)
{
G_USBMSDC_ucCSWStatus = K_USBMSDC_NoMedium;
*pSize = 0;
return (FALSE);
}
pSCSI10 = (PSCSICMD_10BYTE) pSCSI;
pReadCapacity = (PSCSIDATA_READ_CAPACITY) G_pucStorDataPointer;
// 110602@wyeo
//richie@1211
//pReadCapacity->lastLogicalBlockAddress =
// (((ULONG) G_Card_TotalSizeMB << 20) / G_Card_BytePerSector) - 1;
pReadCapacity->lastLogicalBlockAddress = G_Card_SectorPerCard - 1;
pReadCapacity->blockLengthInBytes =
(ULONG) G_Card_BytePerSector;
*pSize = SCSIDATA_READ_CAPACITY_SIZE;
return(TRUE);
}
//-----------------------------------------------------------------------------
//SCSICMD_Read10
//-----------------------------------------------------------------------------
UCHAR SCSICMD_Read10(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Read 10 command (0x28)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_10BYTE pSCSI10;
pSCSI10 = (PSCSICMD_10BYTE) pSCSI;
//richie@1203 if no medium then set sensekey = 02
if (G_ucStorageType != G_Card_Type)
{
G_USBMSDC_ucCSWStatus = K_USBMSDC_NoMedium;
*pSize = 0;
return (FALSE);
}
//richie@1211
G_USBMSDC_ulLogicalBlockAddress = (ULONG) pSCSI10->logicalBlockAddress * (ULONG) G_Card_BytePerSector;
//richie@1211
*pSize = (ULONG) pSCSI10->dataLength * (ULONG) G_Card_BytePerSector;
//richie@1219
// G_USBMSDC_ulSdramBufferAddress = K_SDRAM_FrameBufAAddr;
// DbgPrint("ReadCmd\n");
return(TRUE);
}
//-----------------------------------------------------------------------------
//SCSICMD_Write10
//-----------------------------------------------------------------------------
UCHAR SCSICMD_Write10(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Write 10 command (0x2a)
Arguments:
pSCSI - pointer to SCSI command
pSize - data size processed
Return Value:
valid command or not
--*/
{
PSCSICMD_10BYTE pSCSI10;
pSCSI10 = (PSCSICMD_10BYTE) pSCSI;
//DbgPrint("G_ucStorageType=%d\n",(WORD)G_ucStorageType);
//richie@1203 if no medium then set sensekey = 02
if (G_ucStorageType != G_Card_Type)
{
G_USBMSDC_ucCSWStatus = K_USBMSDC_NoMedium;
*pSize = 0;
return (FALSE);
}
//patch4.5@richie@msdc dos variable G_Card_BytePerSector
G_USBMSDC_ulLogicalBlockAddress = (ULONG) pSCSI10->logicalBlockAddress * (ULONG) G_Card_BytePerSector;
//patch4.5@richie@msdc dos variable G_Card_BytePerSector
*pSize = (ULONG) pSCSI10->dataLength * (ULONG) G_Card_BytePerSector;
//DbgPrint("addr=%lx,dos sec=%d datalen=%ld\n",G_USBMSDC_ulLogicalBlockAddress,(WORD)G_Card_BytePerSector,(ULONG) pSCSI10->dataLength);
// G_USBMSDC_ulSdramBufferAddress = K_SDRAM_FrameBufAAddr;
return(TRUE);
}
// 110102@wyeo
#if 0
//-----------------------------------------------------------------------------
//SCSICMD_Seek10
//-----------------------------------------------------------------------------
UCHAR SCSICMD_Seek10(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
process Seek 10 command (0x2b)
pSize - data size processed
Arguments:
pSCSI - pointer to SCSI command
Return Value:
valid command or not
--*/
{
PSCSICMD_10BYTE pSCSI10;
pSCSI10 = (PSCSICMD_10BYTE) pSCSI;
//patch4.5@richie@msdc dos variable G_Card_BytePerSector
G_USBMSDC_ulLogicalBlockAddress = (ULONG) pSCSI10->logicalBlockAddress * (ULONG) G_Card_BytePerSector;
*pSize = 0;
return(TRUE);
}
//-----------------------------------------------------------------------------
//SCSICMD_WriteAndVerify10
//-----------------------------------------------------------------------------
UCHAR SCSICMD_WriteAndVerify10(PUCHAR pSCSI, PULONG pSize) USING_1
/*++
Routine Description:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -