📄 sim_dev.c
字号:
}
else
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (rc);
return rc;
}
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_DEV_INFO, bDev, FALSE, (void*)&(diskOnChipDeviceInfo[bDev])))
return -1;
if(simFileIO(simSocket, SIM_ITEM_PARTITIONS, bDev, FALSE, (void*)&(simSocket->device[bDev].partitions)))
return -1;
#endif /*DOCH_MEMMAP_FILE*/
return DOCH_OK;
}/*addPartition()*/
/*Authenticate a specific partition with received passkey*/
/*=======================================================*/
FLSNative authenticatePartition(DOCH_SimSocket* simSocket)
{
FLSNative rc = 0;
FLDword protectionType;
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
FLSNative partNum = simSocket->in_regs.bSectorCount;
DOCH_PartitionAcessPassword* pwdStruct =
(DOCH_PartitionAcessPassword*)(sandBox);
protectionType =
((simDev->partitions[partNum].info.partitionAttributes2 & DOCH_PA2B_PROTECTION_TYPE) >> DOCH_PA2O_PROTECTION_TYPE);
if(protectionType == DOCH_PARTITION_NOT_PROTECTED)
{
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_TRACK_0_NOT_FOUND);
simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
return DOCH_OK;
}
rc = tffscmp(simDev->partitions[partNum].sbPasskey, pwdStruct->bPassword, 128);
if(rc == 0)
{
simDev->partitions[partNum].wAuthenticated = TRUE;
simDev->bPpartitionAuthenticated[partNum] = TRUE;
simDev->partitions[partNum].info.dwCommandFlagsOrStatuses |= DOCH_CFSB_USER_AUTHENTICATED;
}
else
{
if(simDev->partitions[partNum].wAuthenticated != TRUE)
{
simDev->partitions[partNum].wAuthenticated = FALSE;
simDev->bPpartitionAuthenticated[partNum] = FALSE;
simDev->partitions[partNum].info.dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;
}
simDev->partitions[partNum].wKeyInserted = TRUE;
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_TRACK_0_NOT_FOUND);
}
return DOCH_OK;
}
/*Set specific partition as Permanently Locked */
/*=============================================*/
static FLSNative setOtpBit(DOCH_SimSocket* simSocket)
{
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
if((simDev->partitions[simSocket->in_regs.bSectorCount].info.partitionAttributes2 & DOCH_PA2B_OTP_BIT) != DOCH_PA2B_OTP_BIT)
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("Can`t lock partition (OTP Bit NOT Enabled)!!!\r\n")));
simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
return DOCH_OK;
}
simDev->partitions[simSocket->in_regs.bSectorCount].info.dwCommandFlagsOrStatuses |= DOCH_CFSB_PERM_LOCKED;
simDev->partitions[simSocket->in_regs.bSectorCount].wAuthenticated = FALSE;
simDev->bPpartitionAuthenticated[simSocket->in_regs.bSectorCount] = FALSE;
simDev->partitions[simSocket->in_regs.bSectorCount].info.dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_PARTITIONS, simSocket->selDevNum, FALSE, (void*)&(simDev->partitions)))
return -1;
#endif /*DOCH_MEMMAP_FILE*/
return DOCH_OK;
}
/*Set partition properties for a specific partition*/
/*=================================================*/
static FLSNative setPartitionProperties(DOCH_SimSocket* simSocket)
{
register int i;
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
DOCH_PartitionInfo* info = &simDev->partitions[simSocket->in_regs.bSectorCount].info;
DOCH_PartitionFormatInfo* infoNew = (DOCH_PartitionFormatInfo*)getSandBox();
FLDword otpActive = (info->partitionAttributes2 & DOCH_PA2B_OTP_BIT);
if((infoNew->dwValidity & DOCH_ATTRIBUTES_VALID) == DOCH_ATTRIBUTES_VALID)
{
info->partitionAttributes2 = (infoNew->partitionAttributes2 | otpActive);
if((info->partitionAttributes2 & DOCH_PA2B_PROTECTION_TYPE) == DOCH_PARTITION_NOT_PROTECTED)
{
simDev->partitions[simSocket->in_regs.bSectorCount].wAuthenticated = TRUE;
simDev->bPpartitionAuthenticated[simSocket->in_regs.bSectorCount] = TRUE;
/*info->dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;*/
info->dwCommandFlagsOrStatuses |= DOCH_CFSB_USER_AUTHENTICATED;
}
}
if((infoNew->dwValidity & DOCH_PASSKEY_VALID) == DOCH_PASSKEY_VALID)
{
tffscpy(simDev->partitions[simSocket->in_regs.bSectorCount].sbPasskey,
&infoNew->bPasskey[0],
sizeof(simDev->partitions[simSocket->in_regs.bSectorCount].sbPasskey));
for(i=0; i<sizeof(simDev->partitions[simSocket->in_regs.bSectorCount].sbPasskey); i++)
{
if(simDev->partitions[simSocket->in_regs.bSectorCount].sbPasskey[i] != 0)
{
simDev->partitions[simSocket->in_regs.bSectorCount].wAuthenticated = FALSE;
simDev->partitions[simSocket->in_regs.bSectorCount].info.dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;
simDev->bPpartitionAuthenticated[simSocket->in_regs.bSectorCount] = FALSE;
break;
}
}
}
if((infoNew->dwValidity & DOCH_LOCK_AS_OTP) == DOCH_LOCK_AS_OTP)
setOtpBit(simSocket);
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_PARTITIONS, simSocket->selDevNum, FALSE, (void*)&(simDev->partitions)))
return -1;
#endif /*DOCH_MEMMAP_FILE*/
return DOCH_OK;
}
/*Set partition user attributes for a specific partition*/
/*======================================================*/
static FLSNative setPartitionUserAttr(DOCH_SimSocket* simSocket)
{
DOCH_PartitionUserAttr* partAttr = (DOCH_PartitionUserAttr*)(sandBox);
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
/*register int i;*/
tffscpy(&simDev->partitions[simSocket->in_regs.bSectorCount].userAttr,
partAttr,
sizeof(simDev->partitions[simSocket->in_regs.bSectorCount].userAttr));
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_PARTITIONS, simSocket->selDevNum, FALSE, (void*)&(simDev->partitions)))
return -1;
#endif /*DOCH_MEMMAP_FILE*/
return DOCH_OK;
}
static FLSNative setDiskUserAttr(DOCH_SimSocket* simSocket)
{
FLByte* diskUserAttr = (FLByte*)(sandBox);
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
tffscpy(&simDev->diskAttributes, diskUserAttr, sizeof(simDev->diskAttributes));
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_DISK_ATTRIBUTES, simSocket->selDevNum, FALSE, (void*)&(simDev->diskAttributes)))
return -1;
#endif /*DOCH_MEMMAP_FILE*/
return DOCH_OK;
}
static FLSNative stickyLockAction(DOCH_SimSocket* simSocket)
{
FLByte i = 0;
FLByte j = 0;
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
/*Go over all partitions in device and unauthenticated as needed*/
while(simDev->partitions[i++].wActive)
{
for(j=0; j<sizeof(simDev->partitions[i].sbPasskey); j++)
{
if(simDev->partitions[i].sbPasskey[j] != 0)
{
simDev->partitions[i].wAuthenticated = FALSE;
simDev->partitions[i].info.dwCommandFlagsOrStatuses &= ~DOCH_CFSB_USER_AUTHENTICATED;
simDev->bPpartitionAuthenticated[i] = FALSE;
break; /*from for loop*/
}
}
}
return DOCH_OK;
}
static FLSNative simDPDMode(DOCH_SimSocket* simSocket, FLBoolean enter)
{
if(enter == TRUE)/*If DPD mode was requested - declare busy*/
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("Device entering DPD mode...\r\n")));
simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
simSocket->out_regs.bStatusCommand &= ~(DOCH_DRQ | DOCH_READY);
}
else
{
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("Device waking up from DPD mode...")));
simSocket->config_regs.wPowerMode = 0;
simSocket->out_regs.bStatusCommand &= ~(DOCH_BUSY);
DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("Device Up!\r\n")));
}
return DOCH_OK;
}
void simFillIdentifyDeviceData(DOCH_SimDevice* simDev)
{
DOCH_SimSocket* simSocket = getSimSocket();
FLDword currentCapacityInSectors, c, h, s;
FLNative simCapcaityInSectors;
/*Capcaity*/
/*--------*/
simCapcaityInSectors = (simDev->driveParameters.wTotalNumberOfSectorsHigh << 16) |
simDev->driveParameters.wTotalNumberOfSectorsLow;
/*CHS*/
/*---*/
simBuildGeometry( simCapcaityInSectors,
(FLDword FAR2 *)&(c),
(FLDword FAR2 *)&(h),
(FLDword FAR2 *)&(s));
currentCapacityInSectors = c*h*s;
simDev->driveParameters.wDefaultNumberOfCylinders = (FLWord)c;
simDev->driveParameters.wCurrentNumberOfCylinders = simDev->driveParameters.wDefaultNumberOfCylinders;
simDev->driveParameters.wCurrentNumberOfHeads = (FLWord)h;
simDev->driveParameters.wCurrentSectorPerTrack = (FLWord)s;
simDev->driveParameters.wCurrentCapacityInSectorsLow = (FLWord)currentCapacityInSectors;
simDev->driveParameters.wCurrentCapacityInSectorsHigh = (FLWord)(currentCapacityInSectors>>16);
simDev->driveParameters.wDefaultSectorsPerTrack = DOCH_SIM_DEFAULT_SECTORS_PER_TRACK;
simDev->driveParameters.wDefaultNumberOfHeads = DOCH_SIM_DEFAULT_NUM_OF_HEADS;
/*Security*/
/*--------*/
simDev->driveParameters.wSecurityStatus = SECURITY_SUPPORTED |
SECURITY_ENCHANCED_ERASE_SUPPORTED;
/*MULTI*/
/*-----*/
simDev->driveParameters.bMultipleSectorCurrentNumber = 1;
simDev->driveParameters.bMaxSectorsPerMulti = 1;
simDev->driveParameters.bMultipleSectorSettingValid = 0;
/*General Configuration*/
/*---------------------*/
simDev->driveParameters.wGeneralConfiguration = GENERAL_CONFIG_NON_REMOVABLE_DRIVE;
simDev->driveParameters.wSpecificConfiguration = 0xC837;
/*Capabilities*/
/*------------*/
simDev->driveParameters.wCapabilities = CAPABILITY_MUST | /*49*/
CAPABILITY_IORDY_SUPPORTED |
CAPABILITY_STANDBY_TIMER_AS_IN_STANDARD |
CAPABILITY_IORDY_CAN_BE_DISABLED;
simDev->driveParameters.wCapabilities2 = CAPABILITY2_MUST; /*ata-4*/
/*DMA*/
/*---*/
simDev->driveParameters.bMultiwordDMASelected = 0;
simDev->driveParameters.bMultiwordDMASupported = 0;
simDev->driveParameters.wMinDMACycleTimePerWord = 0;
simDev->driveParameters.wRecommndedMinDMACycleTimePerWord = 0;
/*PIO*/
/*---*/
simDev->driveParameters.bPIOTransferTiming = 2;
simDev->driveParameters.bAdvancedPIOsupported = ADVANCED_PIO_3_SUPPORTED | ADVANCED_PIO_4_SUPPORTED;
simDev->driveParameters.wMinPIOCycleTimeWithoutFlowControl = 120;
simDev->driveParameters.wMinPIOCycleTimeWithIORDY = 240;
/*Supported commands*/
/*------------------*/
simDev->driveParameters.wCommandSetsupported1 = SUPPORTS1_SMART |
SUPPORTS1_SECURITY |
SUPPORTS1_POWER_MANAGEMENT |
SUPPORTS1_WRITE_CACHE |
/*SUPPORTS1_HOST_PROTECTED_AREA_FEATURE | - not yet*/
/*SUPPORTS1_LOOK_AHEAD | - we could support it in SET FEATURES*/
SUPPORTS1_WRITE_BUFFER |
SUPPORTS1_READ_BUFFER |
SUPPORTS1_NOP;
simDev->driveParameters.wCommandSetsupported2 = SUPPORTS2_MUST | SUPPORTS2_DOWNLOAD_MICROCODE;
simDev->driveParameters.wCommandSetFeatureExtension = CMDSET_EXTENSION_MUST; /*84 ata-4*/
simDev->driveParameters.wCommandSetFeatureEnabled1 = simDev->driveParameters.wCommandSetsupported1; /*ata-4*/
simDev->driveParameters.wCommandSetFeatureEnabled2 = SUPPORTS2_DOWNLOAD_MICROCODE; /*86 ata-4*/
simDev->driveParameters.wCommandSetFeatureDefault = CMDSET_EXTENSION_MUST ; /*ata-4*/
simDev->driveParameters.wWordSupported = FIELDS54_58_VALID | FIELDS64_70_VALID;
/*Version*/
/*-------*/
simDev->driveParameters.wMajorVersionNumber = SUPPORTS_ATA_2 | SUPPORTS_ATA_3 | SUPPORTS_ATA_4;
simDev->driveParameters.wMinorVersionNumber = ATA_ATAPI4_PUBLISHED;
/*Misc*/
/*----*/
tffscpy(&simDev->driveParameters.bSerialNumber[0], DOCH_SIMSERIAL_NUM, 20);
tffscpy(&simDev->driveParameters.bFirmwareRevision[0], DOCH_SIM_FW_VER, 8);
tffscpy(&simDev->driveParameters.bModelNumber[0], DOCH_SIM_MODEL_NUM, 40);
/* set default IPL mode */
simDev->wIPLMode = DOCH_IPL_MODE_PAGED_RAM;
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_IPL_MODE, simSocket->selDevNum, FALSE, (void*)&(simDev->wIPLMode)))
return;
if(simFileIO(simSocket, SIM_ITEM_DRIVE_PARAMS, simSocket->selDevNum, FALSE, (void*)&(simDev->driveParameters)))
return;
#endif /*DOCH_MEMMAP_FILE*/
}
FLSNative secureErase(DOCH_SimSocket* simSocket)
{
DOCH_SimDevice* simDev = getSimDev(simSocket->selDevNum);
sSimSecureErase* secureEraseStrct = (sSimSecureErase*)((getSandBox() + 8));
FLByte partNum = simSocket->in_regs.bSectorCount;
while((secureEraseStrct->firstSector != 0) || (secureEraseStrct->numOfSectors != 0))
{
tffsset(((FLByte*)(choosePartition(simSocket, partNum)) + (secureEraseStrct->firstSector<<DOCH_SECTOR_SIZE_BITS)),
(0),
(secureEraseStrct->numOfSectors<<DOCH_SECTOR_SIZE_BITS));
secureEraseStrct++;
}
return 0;
}
FLSNative setMicrocode(DOCH_SimSocket* simSocket)
{
if(simSocket->in_regs.bErrorFeature != 0x07)
return 0;
#ifdef DOCH_MEMMAP_FILE
if(simFileIO(simSocket, SIM_ITEM_ETFFS_SIZE, simSocket->selDevNum, FALSE, (void*)&(simSo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -