📄 ata_cmds.c
字号:
/******************************************************************************/
/* */
/* 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 + -