📄 ata_cmds.c
字号:
return -1;
}
#endif /*DOCH_MEMMAP_FILE*/
simSocket->cmdBuffer.sbBuffer = (FLByte*)(diskOnChipDeviceInfo);
simSocket->cmdBuffer.nBufferLen = sizeof(DOCH_DeviceInfo);
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/*If requesting slave info and slave not present - return error*/
if( (simSocket->selDevNum != 0) &&
(!simSocket->bSlavePresent))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return -1;
}
/*Fill info as needed*/
i = 0;
while(simDev->partitions[i].wActive)
i++;
diskOnChipDeviceInfo->wTotalNumOfPartitions = i;
diskOnChipDeviceInfo->dwConfigurationPartitionExistsSign = DOCH_CONFIGURATION_EXISTS_SIGN;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simGetExtendedDeviceInfo(DOCH_SimDevice* simDev)
{
DOCH_ExtendedDeviceInfo* extDeviceInfo = (DOCH_ExtendedDeviceInfo*)getExtendedDeviceInfo();
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
simSocket->cmdBuffer.sbBuffer = (FLByte*)(extDeviceInfo);
simSocket->cmdBuffer.nBufferLen = sizeof(DOCH_ExtendedDeviceInfo);
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/*Fill extended info as needed*/
/*----------------------------*/
extDeviceInfo->wFlashType = DOCH_TYPE_H3;
extDeviceInfo->wNumOfChipsOnDataBus = DOCH_NUM_OF_SIMULATED_DEVICES;
extDeviceInfo->wPhysicalChipBusWidth = 16;
extDeviceInfo->wFlashChipNumOfPlanes = 1;
extDeviceInfo->wFlashChipNumOfBanks = 1;
extDeviceInfo->wLogicalPageSize = 4; /*Sectors*/
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simGetResetStatus(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bSectorCount = bResetStatus;
bResetStatus = 0;
return 0;
}
static FLSNative simSetDiskUserAttr(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
simSocket->cmdBuffer.sbBuffer = (FLByte *)getSandBox();
simSocket->cmdBuffer.nBufferLen = DOCH_SECTOR_SIZE;
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simGetDiskUserAttr(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_DISK_ATTRIBUTES, simSocket->selDevNum, TRUE, (void*)&(simDev->diskAttributes)))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return -1;
}
#endif /*DOCH_MEMMAP_FILE*/
simSocket->cmdBuffer.sbBuffer = (FLByte*)&simDev->diskAttributes;
simSocket->cmdBuffer.nBufferLen = DOCH_SECTOR_SIZE;
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simGetConfigurationData(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
FLByte firstPartition = simSocket->in_regs.bLBALow;
FLByte numOfPartitions = simSocket->in_regs.bSectorCount;
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_DEV_INFO, simSocket->selDevNum, TRUE, (void*)(getDiskOnChipDeviceInfo(simSocket->selDevNum))))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return -1;
}
#endif /*DOCH_MEMMAP_FILE*/
/*Update configuration sectors before sending to "host"*/
tffscpy(getConfigPartition(0), getDiskOnChipDeviceInfo(simSocket->selDevNum), DOCH_SECTOR_SIZE);
tffsset(getConfigPartition(1), 0, DOCH_SECTOR_SIZE); /*Master Key*/
tffsset(getConfigPartition(2), 0, DOCH_SECTOR_SIZE); /*Public/Private Key*/
tffscpy(getConfigPartition(3), &simDev->driveParameters, DOCH_SECTOR_SIZE);
simSocket->cmdBuffer.sbBuffer = getConfigPartition(firstPartition);
simSocket->cmdBuffer.nBufferLen = (numOfPartitions * DOCH_SECTOR_SIZE);
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simSetConfigurationData(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
FLByte firstPartition = simSocket->in_regs.bLBALow;
FLByte numOfPartitions = simSocket->in_regs.bSectorCount;
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
simSocket->cmdBuffer.sbBuffer = getConfigPartition(firstPartition);
simSocket->cmdBuffer.nBufferLen = (numOfPartitions * DOCH_SECTOR_SIZE);
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_WRITE;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simSetXferMode(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
DOCH_DeviceInfo* diskOnChipDeviceInfo = (DOCH_DeviceInfo*)getDiskOnChipDeviceInfo(simSocket->selDevNum);
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
simSocket->xferMode = (DOCH_TransferMode)simSocket->in_regs.bSectorCount;
simSocket->multiCount = simSocket->in_regs.bLBALow;
DOCH_SetBits(&diskOnChipDeviceInfo->dwCommandFlagsOrStatuses, DOCH_DCFSB_CURRENT_XFER_MODE, DOCH_DCFSO_CURRENT_XFER_MODE, simSocket->xferMode);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_DEV_INFO, simSocket->selDevNum, FALSE, (void*)(diskOnChipDeviceInfo)))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return -1;
}
#endif /*DOCH_MEMMAP_FILE*/
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= DOCH_READY;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simAtomicWritSeq(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simAuthenticatePartition(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
DOCH_SimSocket* simSocket = getSimSocket();
FLSNative partNum = simSocket->in_regs.bLBALow;
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_DRQ | DOCH_ERROR);
/*Sanity checks*/
rc = sanityCheck(simDev,
CHECK_PARTITION | CHECK_SLOCK,
partNum,
0,
0,
0);
if(rc != 0)
{
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
simSocket->cmdBuffer.sbBuffer = (FLByte *)getSandBox();
simSocket->cmdBuffer.nBufferLen = sizeof(DOCH_PartitionAcessPassword);
simSocket->cmdBuffer.sbCurrentPosition = simSocket->cmdBuffer.sbBuffer;
simSocket->cmdBuffer.sbPositionToReach = (simSocket->cmdBuffer.sbCurrentPosition + simSocket->cmdBuffer.nBufferLen);
simSocket->cmdBuffer.nDirection = SIM_READ;
/* Now that data is ready, set DRQ and clear BSY*/
simSocket->out_regs.bStatusCommand |= (DOCH_DRQ | DOCH_READY);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simDisableAccess(DOCH_SimDevice* simDev)
{
FLSNative rc = 0;
register FLSNative i = 0;
FLByte passkeyExist = FALSE;
DOCH_SimSocket* simSocket = getSimSocket();
FLSNative partNum = simSocket->in_regs.bSectorCount;
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
/*Sanity checks*/
rc = sanityCheck(simDev,
CHECK_PARTITION,
partNum,
0,
0,
0);
if(rc != 0)
{
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
for(i=0; i<sizeof(simDev->partitions[partNum].sbPasskey); i++)
{
if(simDev->partitions[partNum].sbPasskey[i] != 0)
{
passkeyExist = TRUE;
break; /*From for loop*/
}
}
if(passkeyExist)
{
simDev->partitions[partNum].wAuthenticated = FALSE;
simDev->bPpartitionAuthenticated[partNum] = FALSE;
simDev->partitions[partNum].info.dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;
}
simDev->partitions[partNum].wKeyInserted = FALSE;
/* Now that data is ready, clear BSY*/
simSocket->out_regs.bStatusCommand |= DOCH_READY;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return rc;
}
static FLSNative simTXHostPublicKey(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simRXDochPublicKey(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simVerifyHostKey(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simOptimizeMedia(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
/* Now that data is ready, clear BSY*/
simSocket->out_regs.bStatusCommand |= DOCH_READY;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return 0;
}
/*********************************************************/
/* Function name : simGetCustomParam*/
/* Description : */
/* Return type : static FLSNative */
/* Argument : DOCH_SimDevice* simDev*/
/*********************************************************/
static FLSNative simGetCustomParam(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
FLWord wValue = 0,
wParamNo = ((((FLWord)(simSocket->in_regs.bDevice & 0x0F))) << 8) | ((FLWord)(simSocket->in_regs.bLBAHigh));
FLByte bPartNo = simSocket->in_regs.bSectorCount,
bDev = (simSocket->in_regs.bDevice & 0x10) >> 4, /* get the device number */
bStatus = DOCH_READY; /* status to be set after operation */
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_IPL_MODE, bDev, TRUE, (void*)&(simSocket->device[bDev].wIPLMode)))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return -1;
}
if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, bDev, TRUE, (void*)&(simSocket->device[bDev].dwXIPMaxSize)))
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -