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

📄 ata_cmds.c

📁 电子盘DEMO板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************/
/*                                                                            */
/*  Copyright (C), 1995-2006, msystems Ltd. All rights reserved.              */
/*                                                                            */
/*  Redistribution and use in source and binary forms, with or without        */
/*  modification, are permitted provided that the following conditions are    */
/*  met:                                                                      */
/*  1. Redistributions of source code must retain the above copyright notice, */
/*     this list of conditions and the following disclaimer.                  */
/*  2. Redistributions in binary form must reproduce the above copyright      */
/*     notice, this list of conditions and the following disclaimer in the    */
/*     documentation and/or other materials provided with the distribution.   */
/*  3. Neither the name of msystems nor the names of its contributors may be  */
/*     used to endorse or promote products derived from this software without */
/*     specific prior written permission.                                     */
/*                                                                            */
/*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       */
/*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
/*  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR             */
/*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      */
/*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     */
/*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED  */
/*  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR    */
/*  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
/*  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      */
/*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        */
/*  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              */
/*                                                                            */
/******************************************************************************/
/*
 * $Log:
 */

#include "ata_cmds.h"
#include "sim_dev.h"
#include "doch_ata.h"
#include "flsystem.h"
#include "flchkdef.h"
#include "flbase.h"

#define DOCH_TYPE_H3 15

/*Sanity checks*/
#define CHECK_PARTITION			0x0001
#define CHECK_SIZE				0x0002
#define CHECK_LIMITS			0x0004
#define CHECK_AUTHENTICATION	0x0008
#define CHECK_READ_ACCESS		0x0010
#define CHECK_WRITE_ACCESS		0x0020
#define CHECK_OTP				0x0040
#define CHECK_SLOCK				0x0080

extern void simFillIdentifyDeviceData(DOCH_SimDevice* simDev);
extern FLBoolean bResetStatus;

extern FLDword gSimDeviceSizeOnFile;
extern FLDword gDev0SimDeviceSizeOnFile;
extern FLDword gDev1SimDeviceSizeOnFile;


/*Phase 1 commands, prepare data transfer (if needed)*/
/*and perform various operations*/
/*==============================*/
static FLSNative  simReadPartition(DOCH_SimDevice* simDev);
static FLSNative  simWritePartition(DOCH_SimDevice* simDev);
static FLSNative  simWriteFlexi(DOCH_SimDevice* simDev);
static FLSNative  simErasePartition(DOCH_SimDevice* simDev);
static FLSNative  simSecureErase(DOCH_SimDevice* simDev);
static FLSNative  simDeletePartitions(DOCH_SimDevice* simDev);
static FLSNative  simAddPartition(DOCH_SimDevice* simDev);
static FLSNative  simSetPartitionProperties(DOCH_SimDevice* simDev);
static FLSNative  simSetPartitionUserAttr(DOCH_SimDevice* simDev);
static FLSNative  simGetPartitionUserAttr(DOCH_SimDevice* simDev);
static FLSNative  simIdentifyDevice(DOCH_SimDevice* simDev);
static FLSNative  simDLMcode(DOCH_SimDevice* simDev);
static FLSNative  simPartitionInfo(DOCH_SimDevice* simDev);
static FLSNative  simSetDefaultPartition(DOCH_SimDevice* simDev);
static FLSNative  simIdentifyDiskOnChipDevice(DOCH_SimDevice* simDev);
static FLSNative  simGetExtendedDeviceInfo(DOCH_SimDevice* simDev);
static FLSNative  simGetResetStatus(DOCH_SimDevice* simDev);
static FLSNative  simSetDiskUserAttr(DOCH_SimDevice* simDev);
static FLSNative  simGetDiskUserAttr(DOCH_SimDevice* simDev);
static FLSNative  simSetConfigurationData(DOCH_SimDevice* simDev);
static FLSNative  simGetConfigurationData(DOCH_SimDevice* simDev);
static FLSNative  simSetXferMode(DOCH_SimDevice* simDev);
static FLSNative  simAtomicWritSeq(DOCH_SimDevice* simDev);
static FLSNative  simAuthenticatePartition(DOCH_SimDevice* simDev);
static FLSNative  simDisableAccess(DOCH_SimDevice* simDev);
static FLSNative  simTXHostPublicKey(DOCH_SimDevice* simDev);
static FLSNative  simRXDochPublicKey(DOCH_SimDevice* simDev);
static FLSNative  simVerifyHostKey(DOCH_SimDevice* simDev);
static FLSNative  simOptimizeMedia(DOCH_SimDevice* simDev);
static FLSNative  simOptimizePartitionSectors(DOCH_SimDevice* simDev);
static FLSNative  simGetCustomParam(DOCH_SimDevice* simDev);
static FLSNative  simSetCustomParam(DOCH_SimDevice* simDev);
static FLSNative  simCalibrateClock(DOCH_SimDevice* simDev);
static FLSNative  simSetPowerMode(DOCH_SimDevice* simDev);
static FLSNative  simGetPowerMode(DOCH_SimDevice* simDev);
static FLSNative  simPrintAtaDebug(DOCH_SimDevice* simDev);
static FLSNative  simReadCalcHash(DOCH_SimDevice* simDev);
static FLSNative  simWriteCalcHash(DOCH_SimDevice* simDev);
static FLSNative  simReadOrigHash(DOCH_SimDevice* simDev);
static FLSNative  simWriteGivenHash(DOCH_SimDevice* simDev);
static FLSNative  simGetSupportedAlg(DOCH_SimDevice* simDev);
static FLSNative  simGetAlgCapabilities(DOCH_SimDevice* simDev);
static FLSNative  simSetAlgMode(DOCH_SimDevice* simDev);
static FLSNative  simReturnRandNums(DOCH_SimDevice* simDev);
static FLSNative  simAutoHashControl(DOCH_SimDevice* simDev);
static FLSNative  simSetHashKey(DOCH_SimDevice* simDev);
static FLSNative  simStartHashStreamCalc(DOCH_SimDevice* simDev);
static FLSNative  simReadStopHashStreamCalc(DOCH_SimDevice* simDev);

/*Main simulation routines, called upon setting the ATA COMMAND register*/
/*======================================================================*/
FLSNative  activateAtaCommand(DOCH_SimSocket* simSocket, FLSNative  command)
{
	FLSNative  rc = 0;
	DOCH_SimDevice* simDev = &simSocket->device[simSocket->selDevNum];

	switch(command)
	{
	/*I/O*/
	case DOCH_CMD_IDENTIFY_DEV:
		rc = simIdentifyDevice(simDev);
		break;

	case DOCH_DOWNLOAD_MICROCODE:
		rc = simDLMcode(simDev);
		break;

	case DOCH_VSCMD_READ_PARTITION:
		rc = simReadPartition(simDev);
		break;

	case DOCH_VSCMD_WRITE_PARTITION:
		rc = simWritePartition(simDev);
		break;

	case DOCH_VSCMD_WRITE_FLEXI:
		rc = simWriteFlexi(simDev);
		break;

	case DOCH_VSCMD_OPTIMIZE_PARTITION_SECTORS:
		rc = simOptimizePartitionSectors(simDev);
		break;

	case DOCH_VSCMD_ERASE_PARTITION_SECTORS:	/*Covers both Erase and Free Sectors*/
		rc = simErasePartition(simDev);
			break;

	/*Hash*/
	case DOCH_VSCMD_READ_CALCULATED_HASH:
		rc = simReadCalcHash(simDev);
		break;

	case DOCH_VSCMD_WRITE_CALCULATED_HASH:
		rc = simWriteCalcHash(simDev);
		break;

	case DOCH_VSCMD_READ_ORIGINAL_HASH:
		rc = simReadOrigHash(simDev);
		break;

	case DOCH_VSCMD_WRITE_GIVEN_HASH:
		rc = simWriteGivenHash(simDev);
		break;

	/*Partition Management*/
	case DOCH_VSCMD_PARTITION_MANAGEMENT:
		switch(simSocket->in_regs.bErrorFeature)
		{
		case DOCH_GET_PARTITION_INFO:
			rc = simPartitionInfo(simDev);
			break;

		case DOCH_SET_DEFAULT_PARTITION:
			rc = simSetDefaultPartition(simDev);
			break;

		case DOCH_SET_PARTITION_PROTECTION:
			rc = simSetPartitionProperties(simDev);
			break;

		case DOCH_SET_PARTITION_USER_ATTR:
			rc = simSetPartitionUserAttr(simDev);
			break;

		case DOCH_GET_PARTITION_USER_ATTR:
			rc = simGetPartitionUserAttr(simDev);
			break;

		case DOCH_DELETE_PARTITIONS:
			rc = simDeletePartitions(simDev);
			break;

		case DOCH_ADD_PARTITION:
			rc = simAddPartition(simDev);
			break;

		case DOCH_SECURE_ERASE:
			rc = simSecureErase(simDev);
			break;

		default:
			DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("Unsupported sub-command %x\r\n"), simSocket->in_regs.bErrorFeature));
			simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
			simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
			break;
		}
		break;

	/*Access Control*/
	case DOCH_VSCMD_ACCESS_CONTROL:
		switch(simSocket->in_regs.bErrorFeature)
		{
		case DOCH_EN_ACCESS_WPWD:
			rc = simAuthenticatePartition(simDev);
			break;

		case DOCH_DISABLE_ACCESS:
			rc = simDisableAccess(simDev);
			break;

		case DOCH_TX_HOST_PUBLICKEY:
			rc = simTXHostPublicKey(simDev);
			break;

		case DOCH_RX_DOCH_PUBLICKEY:
			rc = simRXDochPublicKey(simDev);
			break;

		case DOCH_VERIFY_HOST_KEY:
			rc = simVerifyHostKey(simDev);
			break;

		default:
			simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
			simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
			break;
		}
		break;		

	/*Device Control*/
	case DOCH_VSCMD_EXT_DEVICE_CTRL:
		switch(simSocket->in_regs.bErrorFeature)
		{
		case DOCH_IDENTIFY_DISKONCHIP_DEVICE:
			rc = simIdentifyDiskOnChipDevice(simDev);
			break;

		case DOCH_GET_EXTENDED_DEVICE_INFO:
			rc = simGetExtendedDeviceInfo(simDev);
			break;

		case DOCH_GET_RESET_STATUS:
			rc = simGetResetStatus(simDev);
			break;

		case DOCH_NOTIFY_RESET:
		case DOCH_NOTIFY_PLATFORM_RESUMED:
			/*Do Nothing*/
			break;

		case DOCH_SET_DISK_USER_ATTR:
			rc = simSetDiskUserAttr(simDev);
			break;
		case DOCH_GET_DISK_USER_ATTR:
			rc = simGetDiskUserAttr(simDev);
			break;
		case DOCH_GET_CONFIGURATION_DATA:
			rc = simGetConfigurationData(simDev);
			break;
		case DOCH_SET_CONFIGURATION_DATA:
			rc = simSetConfigurationData(simDev);
			break;
		case DOCH_SET_DATA_XFER_MODE:
			rc = simSetXferMode(simDev);
			break;

		case DOCH_ATOMIC_WRITE_SEQUENCE:
			rc = simAtomicWritSeq(simDev);
			break;

		case DOCH_OPTIMIZE_MEDIA:
			rc = simOptimizeMedia(simDev);
			break;

		case DOCH_GET_CUSTOM_PARAM:
			rc = simGetCustomParam(simDev);
			break;

		case DOCH_SET_CUSTOM_PARAM:
			rc = simSetCustomParam(simDev);
			break;

		case DOCH_CALIBRATE_CLOCK:
			rc = simCalibrateClock(simDev);
			break;

		case DOCH_SET_POWER_MODE:
			rc = simSetPowerMode(simDev);
			break;

		case DOCH_GET_POWER_MODE:
			rc = simGetPowerMode(simDev);
			break;

		case DOCH_RETRIEVE_DBG_MSG:
			rc = simPrintAtaDebug(simDev);
			break;

		case DOCH_SET_ALERT_LEVEL:
		simSocket->out_regs.bStatusCommand =  DOCH_READY;
			break;

		default:
			simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
			simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
			break;
		}
		break;

	/*Extended Security Control*/
	case DOCH_VSCMD_EXT_SECURITY_CTRL:
		switch(simSocket->in_regs.bErrorFeature)
		{
		case DOCH_REPORT_SUPPORTED_ALGORITHMS:
			rc = simGetSupportedAlg(simDev);
			break;

		case DOCH_GET_ALGORITHM_CAPABILITIES:
			rc = simGetAlgCapabilities(simDev);
			break;

		case DOCH_SET_ALGORITHM_MODE:
			rc = simSetAlgMode(simDev);
			break;

		case DOCH_RETURN_RANDOM_NUMBERS:
			rc = simReturnRandNums(simDev);
			break;

		case DOCH_AUTO_HASH_CONTROL:
			rc = simAutoHashControl(simDev);
			break;

		case DOCH_SET_KEYS:
			rc = simSetHashKey(simDev);
			break;

		case DOCH_START_HASH_STREAM_CALC:
			rc = simStartHashStreamCalc(simDev);
			break;

		case DOCH_READ_STOP_HASH_STREAM_CALC:
			rc = simReadStopHashStreamCalc(simDev);
			break;

		default:
			simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
			simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
			break;
		}
		break;

	default:
		simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
		simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT);
		break;
	}

	simSocket->out_regs.bAltStatusControl = simSocket->out_regs.bStatusCommand;

	return rc;
}

/*Sanity checks*/
/*=============*/
static FLSNative sanityCheck( DOCH_SimDevice* simDev,
							   FLDword items,
							   FLSNative  partNum,
							   FLNative requiredSize,
							   FLNative startSector,
							   FLNative endSector)
{
	FLSNative  rc = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -