📄 ata_cmds.c
字号:
return -1;
}
if(simFileIO(simSocket, SIM_ITEM_ETFFS_SIZE, bDev, TRUE, (void*)&(simSocket->device[bDev].dwEtffsSize)))
{
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*/
switch(wParamNo)
{
case DOCH_CP_BOOT_MODE:
if( bPartNo==0 )
wValue = simSocket->device[bDev].wIPLMode;
else
bStatus = DOCH_ERROR;
break;
case DOCH_CP_XIP_TEST_MODE:
wValue = simSocket->device[bDev].wXIPTestMode;
break;
case DOCH_CP_XIP_MAX_SIZE:
wValue = (FLWord)simSocket->device[bDev].dwXIPMaxSize;
break;
case DOCH_CP_XIP_ETFFS_SIZE:
wValue = (FLWord)simSocket->device[bDev].dwEtffsSize;
case DOCH_CP_WORK_MODES:
/*Do Nothing*/
break;
default:
bStatus = DOCH_ERROR;
break;
}
/* set value */
simSocket->out_regs.bLBALow = (FLByte) wValue;
simSocket->out_regs.bLBAMid = (FLByte) (wValue>>8);
/* set status and make the device ready */
simSocket->out_regs.bStatusCommand |= bStatus;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return 0;
}/*simGetCustomParam()*/
static FLSNative simSetCustomParam(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
FLWord wValue = ((((FLWord)simSocket->in_regs.bLBAMid)) << 8) | ((FLWord)(simSocket->in_regs.bLBALow)),
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);
switch(wParamNo)
{
case DOCH_CP_BOOT_MODE:
if( bPartNo==0 )
simSocket->device[bDev].wIPLMode = wValue;
else
bStatus = DOCH_ERROR;
break;
case DOCH_CP_XIP_TEST_MODE:
simSocket->device[bDev].wXIPTestMode = wValue;
break;
case DOCH_CP_XIP_MAX_SIZE:
/*Set partition size accoedingly*/
switch(simSocket->device[bDev].wIPLMode & 0xF)
{
case DOCH_IPL_MODE_NORMAL_RAM:
if(wValue > 0x40) /*32KB In Sectors*/
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
bStatus = DOCH_ERROR;
}
else
{
simSocket->device[bDev].dwXIPMaxSize = wValue;
#ifdef DOCH_MEMMAP_FILE
/*Write MAX IPL Size to file*/
if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
{
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->device[bDev].partitions[0].dwRequestedSize = wValue;
}
break;
case DOCH_IPL_MODE_PAGED_RAM:
if(wValue > 0x200) /*128KB In Sectors*/
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
bStatus = DOCH_ERROR;
}
else
{
simSocket->device[bDev].dwXIPMaxSize = wValue;
#ifdef DOCH_MEMMAP_FILE
/*Write MAX IPL Size to file*/
if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
{
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->device[bDev].partitions[0].dwRequestedSize = wValue;
}
break;
case DOCH_IPL_MODE_VIRTUAL_RAM:
if(wValue > 0x100) /*256KB In Sectors*/
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
bStatus = DOCH_ERROR;
}
else
{
simSocket->device[bDev].dwXIPMaxSize = wValue;
#ifdef DOCH_MEMMAP_FILE
/*Write MAX IPL Size to file*/
if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
{
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->device[bDev].partitions[0].dwRequestedSize = wValue;
}
break;
default:
break;
}
break;
case DOCH_CP_WORK_MODES:
case DOCH_CP_FLASH_TEST_MODE:
/*Do Nothing*/
break;
default:
bStatus = DOCH_ERROR;
break;
}
/* set value */
simSocket->out_regs.bLBALow = (FLByte) wValue;
simSocket->out_regs.bLBAMid = (FLByte) (wValue>>8);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_IPL_MODE, bDev, FALSE, (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, FALSE, (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;
return -1;
}
if(simFileIO(simSocket, SIM_ITEM_ETFFS_SIZE, bDev, FALSE, (void*)&(simSocket->device[bDev].dwEtffsSize)))
{
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*/
/* set status and make the device ready */
simSocket->out_regs.bStatusCommand |= bStatus;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return 0;
}
static FLSNative simCalibrateClock(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simSetPowerMode(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
FLByte modesToSet = (simSocket->in_regs.bSectorCount & 0x03);
FLByte action = (simSocket->in_regs.bSectorCount & 0x04);
FLByte workMode = (simSocket->in_regs.bLBALow & 0x03);
FLByte inactiveMode = (simSocket->in_regs.bLBALow & 0x10);
FLByte timeOut = (simSocket->in_regs.bLBAMid + simSocket->in_regs.bLBAHigh);
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
switch(modesToSet)
{
case DOCH_PM_SET_WORK_MODE:
setWorkMode(workMode);
break;
case DOCH_PM_SET_INACTIVE_MODE:
setInactiveMode(inactiveMode);
break;
case DOCH_PM_SET_BOTH_MODES:
setWorkMode(workMode);
setInactiveMode(inactiveMode);
break;
default:
break;
}
setActiveMode(action);
setTimeOutForIdle(timeOut);
/* Clear BSY*/
simSocket->out_regs.bStatusCommand |= DOCH_READY;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return 0;
}
static FLSNative simGetPowerMode(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);
simSocket->out_regs.bSectorCount = getActiveMode();
simSocket->out_regs.bLBALow = (getWorkMode() | getInactiveMode());
simSocket->out_regs.bLBAMid = (FLByte)(getTimeOutForIdle() & 0xFF);
simSocket->out_regs.bLBAHigh = (FLByte)((getTimeOutForIdle() & 0xFF00) >> 8);
/* Clear BSY*/
simSocket->out_regs.bStatusCommand |= DOCH_READY;
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return 0;
}
static FLSNative simPrintAtaDebug(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 *)getAtaDebug();
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 simOptimizePartitionSectors(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simReadCalcHash(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simWriteCalcHash(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simReadOrigHash(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simWriteGivenHash(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simGetSupportedAlg(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simGetAlgCapabilities(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simSetAlgMode(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simReturnRandNums(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simAutoHashControl(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simSetHashKey(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simStartHashStreamCalc(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
static FLSNative simReadStopHashStreamCalc(DOCH_SimDevice* simDev)
{
/*TBD*/
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -