doscsicommand.c
来自「16位单片机H8的例子源代码」· C语言 代码 · 共 309 行
C
309 行
/*
****************************************************************************
H I T A C H I P R O P R I E T A R Y
COPYRIGHT (c) 2001 BY Semiconductor & Integrated Circuits,Hitachi,Ltd.
--- ALL RIGHTS RESERVED ---
File Name :DoSCSICommand.c
Working :Judging and Executing SCSI Command
Modified :Rev 2001_11_28 {Author : T.Ishikawa}
Modified :Rev 2001_09_28 {Author : T.Ishikawa}
Created :Rev 1.0 {Author : T.Ishikawa[2001.Jan.10]}
****************************************************************************
*/
#ifndef SysMemMap
#include "SysMemMap.h"
#endif /* SysMemMap */
#ifndef CatProType
#include "CatProType.h"
#endif /* CatProType */
#include "SetSCSIInfo.h"
/* Prototype */
unsigned long DecBotCmd(void);
/* Contents */
/***************************************************************************
Function Name :DecBotCmd(unsigned long,unsigned char)
Working :Judging and Executing SCSI Command
Return Value :unsigned long
Modified :{Author : T.Ishikawa[2001.Nov.28]}
Modified :{Author : T.Ishikawa[2001.Aug.09]}
Created :{Author : T.Ishikawa[2001.Jan.10]}
***************************************************************************/
unsigned long DecBotCmd(void) {
unsigned char counter;
long workValue = 0; /* SCSI Commands returnable data size in Data Stage */
PBRDataType* pbrAcsess; /* PBR physical address */
/* what is SCSI command ? */
switch (cbwDataGVar->cbwMeaningType.cmdOpeCode) {
case 0x12: /* INQUIRY report drive information */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
/* command direction does not according with Data Transport direction */
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
if (cbwDataGVar->cbwMeaningType.cmd1 != 0x00) {
error();
}
workValue = (unsigned char)cbwDataGVar->cbwMeaningType.cmd4;
/* Allocation Length has report data byte size */
if ((EpInfo[SET_BOT_USE_OUT_EP].PresentState == TRANS_OUT) & (workValue == 0x00000000)) {
error();
}
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &ansInquiryData[workValue];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &ansInquiryData[0];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &ansInquiryData[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &ansInquiryData[96];
if (dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr > dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr) {
/* HOST expectant data length > Function expectant data length */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr;
}
workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr; /* transfer data size */
break;
case 0x5A: /* MODE SENSE(10) COMMAND */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
/* command direction does not according with Data Transport direction */
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64]; /* data buffer size is 64byte */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwMeaningType.cmd7,2);
counter = 0;
while (counter < 7) {
counter++;
returnData->byteVal[counter] = 0x00;
}
returnData->byteVal[7] = 0x08;
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[workValue];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
if (dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr > dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr) {
/* HOST expectant data length > Function expectant data length */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr;
}
break;
case 0x2A: /* WRITE(10) COMMAND */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
/* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = (unsigned char*)&botDataGVar.sectorType[ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = (unsigned char*)&botDataGVar.sectorType[((ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)) + (ConvRealn(&cbwDataGVar->cbwMeaningType.cmd7,2)))];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&botDataGVar.sectorType[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&botDataGVar.sectorType[DISK_ALL_SECTOR] + 1);
workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
break;
case 0x03: /* REQUEST SENSE COMMAND */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
/* command direction does not according with Data Transport direction */
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
for (workValue = 0; workValue <= 17; workValue++) {
returnData->byteVal[workValue] = reqSensDataGVar[workValue];
}
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[workValue];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
break;
case 0x28: /* READ(10) COMMAND */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
/* command direction does not according with Data Transport direction */
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = (unsigned char*)&botDataGVar.sectorType[(ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4) + ConvRealn(&cbwDataGVar->cbwMeaningType.cmd7,2))];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = (unsigned char*)&botDataGVar.sectorType[ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&botDataGVar.sectorType[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&botDataGVar.sectorType[DISK_ALL_SECTOR] + 1);
workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr;
break;
case 0x2F: /* VERIFY(10) COMMAND */
workValue = 0;
/* in case BytChk bit is "0", confirm designated sector
in case BytChk bit is "1", return "PARAMETER VALUE INVALID" */
if ((cbwDataGVar->cbwMeaningType.cmd1 & ~0x02) == 0x00) {
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
}
else {
/* in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
set REQUEST SENSE value */
reqSensDataGVar[2] = 0x05; /* Sense Key */
reqSensDataGVar[12] = 0x26; /* Additional Sense Code */
reqSensDataGVar[13] = 0x02; /* Additional Sense Code Qualifier */
/* make CSW BCSWStatus */
cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
}
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
/* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
}
break;
case 0x25: /* READ CAPACITY report logical blocks length and a block byte length */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
/* command direction does not according with Data Transport direction */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
/* make return value using MBR--LBA--PBR--Disk_Parameter */
pbrAcsess = (PBRDataType*)&botDataGVar.sectorType[(ConvReflexn(&mbrAcsess.mbrMeaningType.pt1[8],4))]; /* calculate PBR_head Physical Address */
readCapaData[0] = ConvReflexn(&pbrAcsess->pbrMeaningType.allSector[0],2);
readCapaData[1] = ConvReflexn(&pbrAcsess->pbrMeaningType.bytePerSector[0],2);
workValue = 8;
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = (unsigned char*)(&readCapaData[1] + 1);
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = (unsigned char*)&readCapaData[0];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&readCapaData[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&readCapaData[1] + 1);
break;
case 0x1E: /* PREVENT/ALLOW MEDIUM REMOVAL COMMAND */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
/* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
workValue = 0;
break;
case 0x00: /* TEST UNIT READY */
/* clear REQUEST SENSE value */
reqSensDataGVar[2] = 0x00; /* Sense Key */
reqSensDataGVar[12] = 0x00; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
/* command direction does not according with Data Transport direction */
cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
break;
}
workValue = 0;
break;
default: /* not support commands */
/* set REQUEST SENSE value */
/* INVALID FIELD IN CDB */
reqSensDataGVar[2] = 0x05; /* Sense Key */
reqSensDataGVar[12] = 0x24; /* Additional Sense Code */
reqSensDataGVar[13] = 0x00; /* Additional Sense Code Qualifier */
/* clear work area */
workValue = 16;
while (workValue >= 0) {
returnData->longVal[workValue] = 0x00000000;
workValue--;
}
/* make CSW BCSWStatus */
cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
/* set up data buffer pointers */
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
workValue = 0;
break;
}
return workValue;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?