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

📄 idetask.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:

	switch( IdeTsk_CmdPara.dataMode )	/* Process mode of the received command */
	{
		/*------------------------------------------------------------------*/
		/* No command output,No data transfer (Simulate ATAPI with F/W.)*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_PROT_FW_NON_DATA:
			SendMessageNTFY_IDE_CMD( IDE_REQ_OK, 0 );
			StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
			break;

		/*------------------------------------------------------------------*/
		/* No command output,has data transfer(Simulate ATAPI with F/W.)*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_PROT_FW_IN_DATA:
		case IDE_CMD_PROT_FW_OUT_DATA:
			rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* Sending and receiving size */
			rdyData.xferCount = 1;		/* Transfer times fixed to 1 	*/

			if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
				SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
							sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
			} else {
				SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
							sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
			}

			IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Set to Data Transfer Phase	*/
										/* Waiting for the Data Transfer start request*/

			break;

		/*------------------------------------------------------------------*/
		//
		/* Non-data command protocol										*/
		/* PIO data in command protocol										*/
		/* PIO data out command protocol									*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_ATA_PROT_NON_DATA:
		case IDE_CMD_ATA_PROT_SPIO:		/* IDE(PIO) <-- PIO --> FIFO 		*/
		case IDE_CMD_ATA_PROT_HPIO:		/* IDE(PIO) <-- DMA --> FIFO 		*/
			/*--------------------------------------------------------------*/
			/* Set the I/F that is used when output command 			*/
			/*--------------------------------------------------------------*/
			for( i=0; i<12; i++ ){
				IdeCmdPara.commandBlock[i] = IdeTsk_CmdPara.deviceCmdBlock[i];
			}
			IdeTsk_CmdPara.xferCount = 1;/* Initializes it by the first time.*/
			IdeTsk_CmdPara.tranTotalSize = 0;/* Initialize the transfer number*/
			/*--------------------------------------------------------------*/
			/* Send Command Block 										*/
			/*--------------------------------------------------------------*/
			ATACmd_OutPIO();
			break;

		/*------------------------------------------------------------------*/
		/* DMA command protocol											*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_ATA_PROT_DMA:		/* IDE(DMA) <-- DMA --> FIFO 		*/
			/*--------------------------------------------------------------*/
			/* Set the I/F that is used when output command 			*/
			/*--------------------------------------------------------------*/
			for( i=0; i<12; i++ ){
				IdeCmdPara.commandBlock[i] = IdeTsk_CmdPara.deviceCmdBlock[i];
			}
			IdeTsk_CmdPara.xferCount = 1;/* Initializes it by the first time.*/
			IdeTsk_CmdPara.tranTotalSize = 0;/* Initialize the transfer number*/
			/*--------------------------------------------------------------*/
			/* Send Command Block 										*/
			/*--------------------------------------------------------------*/
			ATACmd_OutDMA();
			break;

		default:
			break;
	}

	return STATUS_SUCCESS;
}

/*
//=============================================================================
// Function_Name: ATACmd_OutPIO
// description	:
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void ATACmd_OutPIO( void ){
LONG		result;
PARAM_MSG_NTFY_IDE_CMP_XFER_READY		rdyData;


	result = IDE_FuncCommandOut( DeviceID, DeviceNo, IDE_FUNC_PIO_MODE, &IdeCmdPara );
	if( result == STATUS_SUCCESS ){
								/* Waiting for INTRQ 			*/
								/* The direction of transfer is decided according to the command code. */

		if( IdeCmdPara.commandMode == IDE_FUNC_ATAPI )
		{
			if( ATAPI_CmdInfo[ IdeCmdPara.commandBlock[0] ].Protocol == CMD_ATAPI_WRITE ){
				IdeTranPara.direction = IDE_FUNC_IDE_OUT;
			}
			else{
				IdeTranPara.direction = IDE_FUNC_IDE_IN;
			}
		}
		else	// IDE_FUNC_ATA
		{
			if( ATA_CmdInfo[ IdeCmdPara.commandBlock[7] ].Protocol == CMD_PIO_OUT ){
				IdeTranPara.direction = IDE_FUNC_IDE_OUT;
			}
			else{
				IdeTranPara.direction = IDE_FUNC_IDE_IN;
			}
		}

		if(( IdeTsk_CmdPara.dataMode == IDE_CMD_ATA_PROT_HPIO )||
			( IdeTsk_CmdPara.dataMode == IDE_CMD_ATA_PROT_SPIO )){
			if( IdeTranPara.direction == IDE_FUNC_IDE_OUT ){
								/* OUT only.					*/
				IDEStatus = 0x00;		/* Clear 						*/
				do{
					IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );
				}while( IDEStatus == IDE_FUNC_BSY );
										/* Read the status until it is not BUSY.   */

				if( IDEStatus == IDE_FUNC_TRAN_READY ){
										/* It is ready for transfer		*/
					rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* The size to process */
					rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Present processing count (one - count) */

					if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
						SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
								sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
					} else {
						SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
										sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
					}
					IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase	*/
				}
				else{
										/* ERROR Complete Statsu Check 		*/
					IDE_DeviceError( DeviceType, IDEStatus, senseData, &IdeTsk_CmdError[DeviceNo] );
					SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.tranTotalSize );
					StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
				}
			}
			else{
				IdeTsk_Inf.sState = IDE_SSTS_COMMAND;/* Set to Command Phase	*/
			}
		}
		else{
			IdeTsk_Inf.sState = IDE_SSTS_COMMAND;/* Set to Command Phase	*/
		}
	}
	else{						/* Error 						*/
		IDESetSenseKey( SENSE_INVALID_COMMAND_OPERATION_CODE, &IdeTsk_CmdError[DeviceNo] );
		SendMessageNTFY_IDE_CMD( IDE_REQ_NG, 0 );
		StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
	}
}

/*
//=============================================================================
// Function_Name: ATACmd_OutDMA
// description	:
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void ATACmd_OutDMA( void ){
LONG		result;
PARAM_MSG_NTFY_IDE_CMP_XFER_READY		rdyData;


	result = IDE_FuncCommandOut( DeviceID, DeviceNo, IDE_FUNC_DMA_MODE, &IdeCmdPara );

	if( result == STATUS_SUCCESS ){
		if( IdeCmdPara.commandMode == IDE_FUNC_ATAPI )
		{
			if( ATAPI_CmdInfo[ IdeCmdPara.commandBlock[0] ].Protocol == CMD_ATAPI_WRITE ){
				IdeTranPara.direction = IDE_FUNC_IDE_OUT;
			}
			else{
				IdeTranPara.direction = IDE_FUNC_IDE_IN;
			}
		}
		else	// IDE_FUNC_ATA
		{
			if( ATA_CmdInfo[ IdeCmdPara.commandBlock[7] ].Protocol == CMD_DMA_OUT ){
				IdeTranPara.direction = IDE_FUNC_IDE_OUT;
			}
			else{
				IdeTranPara.direction = IDE_FUNC_IDE_IN;
			}
		}
		rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* Sending and receiving size */
		rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Transfer times */

		if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
			/* Transmission is started at DirectCopy.  */
			if(IdeTsk_CmdPara.xferMode == IDE_XFER_DIRECT) {

				if( DeviceType == IDE_DEV_ATA ){/* Check the connected device */
					ATACmd_XferStart();
				}
				else if( DeviceType == IDE_DEV_ATAPI ){
					ATAPICmd_XferStart();
				}
				else{
					ATACmd_XferStart();
				}
			} else {
				SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
							sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
			}
		} else {
			SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
						sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
		}
		if(IdeTsk_CmdPara.xferMode != IDE_XFER_DIRECT) {
			IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase	*/
									/* Because there is no INTRQ 	*/
									/* Waiting for the Start Data Transfer request*/
		}
	}
	else{						/* Error 						*/
		IDESetSenseKey( SENSE_INVALID_COMMAND_OPERATION_CODE, &IdeTsk_CmdError[DeviceNo] );
		SendMessageNTFY_IDE_CMD( IDE_REQ_NG, 0 );
		StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
	}
}

/*
//=============================================================================
// Function_Name: ATACmd_OutINTRQWait
// description	:
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
LONG ATACmd_OutINTRQWait( void )
{
PARAM_MSG_NTFY_IDE_CMP_XFER_READY		rdyData;


	switch( IdeTsk_CmdPara.dataMode )	/* Process mode of the received command */
	{
		/*------------------------------------------------------------------*/
		/* Non-data command protocol									*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_ATA_PROT_NON_DATA:
			if( IDEIntStatus.DetectINTRQ == 1 ){
				IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );
				if( IDEStatus == IDE_FUNC_CMD_COMP ){
					SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.dataSize );
				}else{
					SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.dataSize );
				}
				StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */

				IDEIntStatus.DetectINTRQ = 0;
			}
			break;

		/*------------------------------------------------------------------*/
		/* PIO data in command protocol									*/
		/* PIO data out command protocol								*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_ATA_PROT_SPIO:		/* IDE(PIO) <-- PIO --> FIFO 		*/
		case IDE_CMD_ATA_PROT_HPIO:		/* IDE(PIO) <-- DMA --> FIFO 		*/
			if( IDEIntStatus.DetectINTRQ == 1 ){
				IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );

				if( IDEStatus != IDE_FUNC_BSY ){
											/* IDE Device STATUS Check 			*/
					rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* The size to process */
					rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Present processing count(one-count) */

					if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
						SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
									sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
					} else {
						SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
									sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
					}

					IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase	*/
				}
				else{
											/* Command Complete Check 			*/
					if( IDEStatus == IDE_FUNC_CMD_COMP ){
						SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.tranTotalSize );
					}else{
											/* ERROR Complete Statsu Check 		*/
						IDE_DeviceError( DeviceType, IDEStatus, senseData, &IdeTsk_CmdError[DeviceNo] );
						SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.tranTotalSize );
					}
					StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
				}

				IDEIntStatus.DetectINTRQ = 0;
			}
			break;

		/*------------------------------------------------------------------*/
		/* DMA command protocol											*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_ATA_PROT_DMA:		/* IDE(DMA) <-- DMA --> FIFO 		*/
										/* DMA output command,but doesn't output INTRQ.*/
			break;
		default:
			break;
	}

	return STATUS_SUCCESS;
}

/*
//=============================================================================
// Function_Name: ATACmd_XferStart
// description	:
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
LONG ATACmd_XferStart( void )
{
LONG		result;
PARAM_MSG_NTFY_IDE_XFER_CMP		xferData;


	switch( IdeTsk_CmdPara.dataMode )	/* Process mode of the received command */
	{
		/*------------------------------------------------------------------*/
		/* No command output,has data transfer(Simulate ATAPI with F/W.)*/
		/*------------------------------------------------------------------*/
		case IDE_CMD_PROT_FW_IN_DATA:	/* FW --> HOST						*/
		case IDE_CMD_PROT_FW_OUT_DATA:	/* HOST --> FW 						*/
			if( IdeTsk_CmdPara.dataMode == IDE_CMD_PROT_FW_IN_DATA ){
										/* FW --> HOST						*/
				result = IDE_ChangeSendPara( DeviceType, IdeTsk_CmdPara.cmdBlock,
									IdeTsk_CmdPara.bufferPtr, &IdeTsk_CmdPara.dataSize );
			}
			else{						/* HOST --> FW 						*/
				result = IDE_ChangeRecivePara( DeviceType, IdeTsk_CmdPara.cmdBlock,
									IdeTsk_CmdPara.bufferPtr, IdeTsk_CmdPara.dataSize );
			}

			if( result == STATUS_SUCCESS ){
				xferData.result = IDE_REQ_OK;
			}
			else{
				xferData.result = IDE_REQ_NG;
			}
										/* Send message 				*/
			if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
				SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_XFER_CMP,
							sizeof(PARAM_MSG_NTFY_IDE_XFER_CMP), &xferData );
			} else {
				SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_XFER_CMP,
							sizeof(PARAM_MSG_NTFY_IDE_XFER_CMP), &xferData );
			}


			if( result == STATUS_SUCCESS ){/* Processing result		*/
				SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.dataSize );

			}
			else{
				SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.dataSize );
			}
			StatusChange( IDE_MSTS_IDLE );/* Idle 

⌨️ 快捷键说明

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