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

📄 ata_cmds.c

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