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

📄 ata_cmds.c

📁 电子盘DEMO板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		return -1;
	}

	if(simFileIO(simSocket, SIM_ITEM_ETFFS_SIZE, bDev, TRUE, (void*)&(simSocket->device[bDev].dwEtffsSize)))
	{
		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*/

	switch(wParamNo)
	{
	case DOCH_CP_BOOT_MODE:
		if( bPartNo==0 ) 
			wValue = simSocket->device[bDev].wIPLMode;
		else
			bStatus = DOCH_ERROR;
		break;

	case DOCH_CP_XIP_TEST_MODE:
		wValue = simSocket->device[bDev].wXIPTestMode;
		break;

	case DOCH_CP_XIP_MAX_SIZE:
		wValue = (FLWord)simSocket->device[bDev].dwXIPMaxSize;
		break;

	case DOCH_CP_XIP_ETFFS_SIZE:
		wValue = (FLWord)simSocket->device[bDev].dwEtffsSize;

	case DOCH_CP_WORK_MODES:
		/*Do Nothing*/
		break;

	default:
		bStatus = DOCH_ERROR;
		break;
	}

	/* set value */
	simSocket->out_regs.bLBALow = (FLByte) wValue;
	simSocket->out_regs.bLBAMid = (FLByte) (wValue>>8);


	/* set status and make the device ready */
	simSocket->out_regs.bStatusCommand |= bStatus;
	simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
	return 0;
}/*simGetCustomParam()*/

static FLSNative simSetCustomParam(DOCH_SimDevice* simDev)
{
	DOCH_SimSocket* simSocket = getSimSocket();
	FLWord	wValue = ((((FLWord)simSocket->in_regs.bLBAMid)) << 8) | ((FLWord)(simSocket->in_regs.bLBALow)),
			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);

	switch(wParamNo)
	{
	case DOCH_CP_BOOT_MODE:
		if( bPartNo==0 ) 
			simSocket->device[bDev].wIPLMode = wValue;
		else
			bStatus = DOCH_ERROR;
		break;

	case DOCH_CP_XIP_TEST_MODE:
		simSocket->device[bDev].wXIPTestMode = wValue;
		break;

	case DOCH_CP_XIP_MAX_SIZE:
		/*Set partition size accoedingly*/
		switch(simSocket->device[bDev].wIPLMode & 0xF)
		{
		case DOCH_IPL_MODE_NORMAL_RAM:
			if(wValue > 0x40)	/*32KB In Sectors*/
			{
				DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
				simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
				simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
				bStatus = DOCH_ERROR;
			}
			else
			{
				simSocket->device[bDev].dwXIPMaxSize = wValue;
		#ifdef DOCH_MEMMAP_FILE
				 /*Write MAX IPL Size to file*/
				 if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
				{
					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->device[bDev].partitions[0].dwRequestedSize = wValue;
			}
			break;

		case DOCH_IPL_MODE_PAGED_RAM:
			if(wValue > 0x200)	/*128KB In Sectors*/
			{
				DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
				simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
				simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
				bStatus = DOCH_ERROR;
			}
			else
			{
				simSocket->device[bDev].dwXIPMaxSize = wValue;
		#ifdef DOCH_MEMMAP_FILE
				 /*Write MAX IPL Size to file*/
				 if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
				 { 
					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->device[bDev].partitions[0].dwRequestedSize = wValue;
			}
			break;

		case DOCH_IPL_MODE_VIRTUAL_RAM:
			if(wValue > 0x100)	/*256KB In Sectors*/
			{
				DBG_PRINT_FLOW_PRM(FLZONE_MTD, (FLTXT("IPL MAX Size exceeds Limit\r\n")));
				simSocket->out_regs.bStatusCommand |= DOCH_ERROR;
				simSocket->out_regs.bErrorFeature = (DOCH_ATA_ERROR_ABORT | DOCH_ATA_ERROR_WRITE_PROTECTED);
				bStatus = DOCH_ERROR;
			}
			else
			{
				simSocket->device[bDev].dwXIPMaxSize = wValue;
		#ifdef DOCH_MEMMAP_FILE
				 /*Write MAX IPL Size to file*/
				 if(simFileIO(simSocket, SIM_ITEM_MAX_IPL_SIZE, 0, FALSE, (void*)&(simDev->dwXIPMaxSize)))
				 {
					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->device[bDev].partitions[0].dwRequestedSize = wValue;
			}
			break;

		default:
			break;
		}
		break;

	case DOCH_CP_WORK_MODES:
	case DOCH_CP_FLASH_TEST_MODE:
		/*Do Nothing*/
		break;
	
	default:
		bStatus = DOCH_ERROR;
		break;
	}

	/* set value */
	simSocket->out_regs.bLBALow = (FLByte) wValue;
	simSocket->out_regs.bLBAMid = (FLByte) (wValue>>8);

#ifdef DOCH_MEMMAP_FILE

	if(simFileIO(simSocket, SIM_ITEM_IPL_MODE, bDev, FALSE, (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, FALSE, (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;
		return -1;
	}

	if(simFileIO(simSocket, SIM_ITEM_ETFFS_SIZE, bDev, FALSE, (void*)&(simSocket->device[bDev].dwEtffsSize)))
	{
		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*/

	/* set status and make the device ready */
	simSocket->out_regs.bStatusCommand |= bStatus;
	simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;
	return 0;
}

static FLSNative simCalibrateClock(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simSetPowerMode(DOCH_SimDevice* simDev)
{
	DOCH_SimSocket* simSocket = getSimSocket();
	FLByte modesToSet   = (simSocket->in_regs.bSectorCount & 0x03);
	FLByte action	    = (simSocket->in_regs.bSectorCount & 0x04);
	FLByte workMode     = (simSocket->in_regs.bLBALow	   & 0x03);
	FLByte inactiveMode = (simSocket->in_regs.bLBALow	   & 0x10);
	FLByte timeOut	    = (simSocket->in_regs.bLBAMid + simSocket->in_regs.bLBAHigh);

	simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
	simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);

	switch(modesToSet)
	{
	case DOCH_PM_SET_WORK_MODE:
		setWorkMode(workMode);
		break;

	case DOCH_PM_SET_INACTIVE_MODE:
		setInactiveMode(inactiveMode);
		break;

	case DOCH_PM_SET_BOTH_MODES:
		setWorkMode(workMode);
		setInactiveMode(inactiveMode);
		break;

	default:
		break;
	}

	setActiveMode(action);
	
	setTimeOutForIdle(timeOut);

	/* Clear BSY*/
	simSocket->out_regs.bStatusCommand |= DOCH_READY;
	simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;

	return 0;
}

static FLSNative simGetPowerMode(DOCH_SimDevice* simDev)
{
	DOCH_SimSocket* simSocket = getSimSocket();

	simSocket->out_regs.bStatusCommand |= DOCH_BUSY;
	simSocket->out_regs.bStatusCommand &= ~(DOCH_READY | DOCH_ERROR);

	simSocket->out_regs.bSectorCount = getActiveMode();
	simSocket->out_regs.bLBALow		 = (getWorkMode() | getInactiveMode());

	simSocket->out_regs.bLBAMid		= (FLByte)(getTimeOutForIdle() & 0xFF);
	simSocket->out_regs.bLBAHigh	= (FLByte)((getTimeOutForIdle() & 0xFF00) >> 8);

	/* Clear BSY*/
	simSocket->out_regs.bStatusCommand |= DOCH_READY;
	simSocket->out_regs.bStatusCommand &= ~DOCH_BUSY;

	return 0;
}

static FLSNative simPrintAtaDebug(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 *)getAtaDebug();
	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 simOptimizePartitionSectors(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simReadCalcHash(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simWriteCalcHash(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simReadOrigHash(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simWriteGivenHash(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simGetSupportedAlg(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simGetAlgCapabilities(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simSetAlgMode(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simReturnRandNums(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simAutoHashControl(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simSetHashKey(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simStartHashStreamCalc(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

static FLSNative simReadStopHashStreamCalc(DOCH_SimDevice* simDev)
{
	/*TBD*/
	return 0;
}

⌨️ 快捷键说明

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