⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sim_dev.c

📁 电子盘DEMO板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	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 + -