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

📄 usbd_sampletask.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	AtapiCmd.command[3]		= (unsigned char)(LBA >> 16);
	AtapiCmd.command[4]		= (unsigned char)(LBA >> 8);
	AtapiCmd.command[5]		= (unsigned char)(LBA);
	AtapiCmd.command[6]		= 0;
	AtapiCmd.command[7]		= (unsigned char)(secSize >> 8);
	AtapiCmd.command[8]		= (unsigned char)(secSize);
	AtapiCmd.command[9]		= 0;
	AtapiCmd.command[10]	= 0;
	AtapiCmd.command[11]	= 0;

	// Set information for data transfer
	memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
#ifdef DMA_XFER_TEST
	XferInfo.mode		= DEVICE_TASK_XFER_MODE_DMA;	// DMA transfer
	XferInfo.pAddress	= NULL;
#else
	XferInfo.mode		= DEVICE_TASK_XFER_MODE_PIO;	// PIO transfer
	XferInfo.pAddress	= pData;
#endif
	XferInfo.size		= secSize<<9;				// Number of data transfer
	XferInfo.dir		= DEVICE_TASK_XFER_DIR_OUT;	// Direction of data transfer
	XferInfo.dmaChannel	= 0;

	// Execute ATAPI command
	result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATAPI, &AtapiCmd, &XferInfo );
	if ( result != DEVICE_TASK_STATUS_SUCCESS )
	{
		// Failed to execute ATAPI command
		DBG_FlowStrPrint( "PlayModeTest ATAPI_Write NG\r\n",0 );
		return STATUS_UNSUCCESSFUL;
	}

#ifdef DMA_XFER_TEST
#ifndef TOYA2_C
	// Set DMA of CPU
	sfr_outl( DMA_OPERATION, 1 );	// Enable DMA transfer
#endif
#endif

	return STATUS_SUCCESS;
}
#endif

/*
//=============================================================================
// Function_Name: PlayModeTest
// description	: Test for PLAY mode
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
#ifndef CMD_ASYNC_MODE

void PlayModeTestATAPI( void )
{
	int i;
	long	result;

	TskInfo.mode = PLAY_MODE;

#ifdef TOYA2_C
	LED_Off(5);	/*LED5-8 Off*/
	LED_Off(6);
	LED_Off(7);
	LED_Off(8);
#else
	*(volatile unsigned char *)0xF0000064 = 0x0F;		// LED4-7 OFF
#endif
	DBG_FlowStrPrint( "PlayModeTest Start\r\n",0 );

	//------------------------------------------------------
	// ATAPI command WRITE->READ
	//------------------------------------------------------

	// Allocate buffer for data receiving
	get_mpf( MPFID_SMP_RBF, (VP)&pRdBuff );
	// Allocate buffer for data transmission
	get_mpf( MPFID_SMP_WBF, (VP)&pWrBuff );

	memset( pRdBuff, 0xFF, RDBUFF_SIZE );
	memset( pWrBuff, 0xFF, WRBUFF_SIZE );

	for( ;; )
	{
		//------------------------------------------------------
		// Command of TEST UNIT READY
		//------------------------------------------------------
		if ( STATUS_SUCCESS != ATAPI_TestUnitRdy() )
		{
#ifdef TOYA2_C
			LED_On(5);
#else
			*(volatile unsigned char *)0xF0000064 &= ~0x04;	//LED5 ON
#endif
			DBG_FlowStrPrint( "PlayModeTest TEST_UNIT_READY NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// ATAPI command [WRITE]
		//------------------------------------------------------

		// Create ATAPI command(WRITE)
		memset( &AtapiCmd, 0, sizeof( DEVICE_TASK_ATAPI_CMD ));
		AtapiCmd.command[0]		= 0x2A;				// Command Code
		AtapiCmd.command[1]		= 0;
		AtapiCmd.command[2]		= 0;
		AtapiCmd.command[4]		= 0;
		AtapiCmd.command[5]		= 0x02;
		AtapiCmd.command[6]		= 0;
		AtapiCmd.command[7]		= (unsigned char)(SECTOR_CNT >> 8);
		AtapiCmd.command[8]		= (unsigned char)(SECTOR_CNT);
		AtapiCmd.command[9]		= 0;
		AtapiCmd.command[10]	= 0;
		AtapiCmd.command[11]	= 0;
		for( i = 0; i < WRBUFF_SIZE; i++ )
		{
			*(pWrBuff+i) = (unsigned char)i;
		}

		// Set information for data transfer
		memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
		XferInfo.mode		= DEVICE_TASK_XFER_MODE_PIO;	// PIO transfer
		XferInfo.size		= WRBUFF_SIZE;				// Number of data transfer
		XferInfo.dir		= DEVICE_TASK_XFER_DIR_OUT;	// Direction of data transfer
		XferInfo.pAddress	= pWrBuff;					// Address of buffer for data receiving
		XferInfo.dmaChannel	= 0;

		// Execute ATAPI command
		result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATAPI, &AtapiCmd, &XferInfo );
		if ( result != DEVICE_TASK_STATUS_SUCCESS )
		{
			// Failed to execute ATAPI command
#ifdef TOYA2_C
			LED_On(5);
#else
			*(volatile unsigned char *)0xF0000064 &= ~0x04;	//LED5 ON
#endif
			DBG_FlowStrPrint( "PlayModeTest ATAPI_Write NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// ATAPI command [READ]
		//------------------------------------------------------

		// Create ATAPI command(READ)
		memset( &AtapiCmd, 0, sizeof( DEVICE_TASK_ATAPI_CMD ));
		AtapiCmd.command[0]		= 0x28;				// Command Code
		AtapiCmd.command[1]		= 0;
		AtapiCmd.command[2]		= 0;
		AtapiCmd.command[4]		= 0;
		AtapiCmd.command[5]		= 0x02;
		AtapiCmd.command[6]		= 0;
		AtapiCmd.command[7]		= (unsigned char)(SECTOR_CNT >> 8);
		AtapiCmd.command[8]		= (unsigned char)(SECTOR_CNT);
		AtapiCmd.command[9]		= 0;
		AtapiCmd.command[10]	= 0;
		AtapiCmd.command[11]	= 0;

		// Set information for data transfer
		memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
		XferInfo.mode		= DEVICE_TASK_XFER_MODE_PIO;	// PIO transfer
		XferInfo.size		= RDBUFF_SIZE;				// Number of data transfer
		XferInfo.dir		= DEVICE_TASK_XFER_DIR_IN;		// Direction of data transfer
		XferInfo.pAddress	= pRdBuff;
		XferInfo.dmaChannel	= 0;

		// Execute ATAPI command
		result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATAPI, &AtapiCmd, &XferInfo );
		if ( result != DEVICE_TASK_STATUS_SUCCESS )
		{
			// Failed to execute ATAPI command
#ifdef TOYA2_C
			LED_On(5);
#else
			*(volatile unsigned char *)0xF0000064 &= ~0x04;	//LED5 ON
#endif
			DBG_FlowStrPrint( "PlayModeTest ATAPI_Read NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// Compare data
		//------------------------------------------------------

		// Compare the data which has been written with the data which has been read out
		if( STATUS_SUCCESS != ReadDataCheck() )
		{
			// Failed to execute ATAPI command
#ifdef TOYA2_C
			LED_On(5);
#else
			*(volatile unsigned char *)0xF0000064 &= ~0x04;	//LED5 ON
#endif
			DBG_FlowStrPrint( "PlayModeTest CMP NG\r\n",0 );
			break;
		}

#ifdef TOYA2_C
		LED_On(4);
#else
		*(volatile unsigned char *)0xF0000064 &= ~0x08;		// LED4 ON
#endif
		DBG_FlowStrPrint( "PlayModeTest OK\r\n",0 );
		break;
	}

	rel_mpf( MPFID_SMP_RBF, pRdBuff );	// Release buffer of data receiving
	rel_mpf( MPFID_SMP_WBF, pWrBuff );	// Release buffer of data transmission

	TskInfo.mode = STOP_MODE;			// Change to Stop mode
}

/*
//=============================================================================
// Function_Name: PlayModeTestATA
// description	: Test Play Mode ATA command
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void PlayModeTestATA( void )
{
	int i;
	long	result;

	TskInfo.mode = PLAY_MODE;

#ifdef TOYA2_C
	LED_Off(5);
	LED_Off(6);
	LED_Off(7);
	LED_Off(8);
#else
	*(volatile unsigned char *)0xF0000064 = 0x0F;		// LED4-7 OFF
#endif
	DBG_FlowStrPrint( "PlayModeTest Start\r\n",0 );

	//------------------------------------------------------
	// ATAPI command WRITE->READ
	//------------------------------------------------------

	// Allocate buffer for data receiving
	get_mpf( MPFID_SMP_RBF, (VP)&pRdBuff );
	// Allocate buffer for data transmission
	get_mpf( MPFID_SMP_WBF, (VP)&pWrBuff );

	memset( pRdBuff, 0xFF, RDBUFF_SIZE );
	memset( pWrBuff, 0xFF, WRBUFF_SIZE );

	for( ;; )
	{
		//------------------------------------------------------
		// Test IDLE command
		//------------------------------------------------------
		memset( &AtaCmd, 0x00, sizeof(AtaCmd) );
		AtaCmd.command = ATA_IDLE;

		// Set information for data transfer
		memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
		XferInfo.mode		= 0;	// Mode of data transfer
		XferInfo.size		= 0;	// Number of data transfer
		XferInfo.dir		= 0;	// Direction of data transfer
		XferInfo.pAddress	= 0;	// Address of buffer for data receiving
		XferInfo.dmaChannel	= 0;

		// Execute ATA command
		result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATA, &AtaCmd, &XferInfo );
		if( result == DEVICE_TASK_STATUS_UNSUCCESSFUL )
		{
			// Failed to execute ATA command
			DBG_FlowStrPrint( "PlayModeTest ATAPI_Write NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// Test WRITE SECOTR command
		//------------------------------------------------------
		// Create ATA command(READ SECTOR[20h])
		memset( &AtaCmd, 0, sizeof( DEVICE_TASK_ATA_CMD ));
		AtaCmd.secCnt		= (unsigned char)(SECTOR_CNT);	// Sector count
		AtaCmd.secNum		= 0x00;							// LBA[7:0]
		AtaCmd.cylLow		= 0x00;							// LBA[15:8]
		AtaCmd.cylHigh		= 0x00;							// LBA[23:16]
		AtaCmd.command		= ATA_WRITE_SECTOR;				// Command
		for( i = 0; i < WRBUFF_SIZE; i++ )
		{
			*(pWrBuff+i) = (unsigned char)i;
		}

		// Set information for data transfer
		memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
		XferInfo.mode		= DEVICE_TASK_XFER_MODE_PIO;	// PIO transfer
		XferInfo.size		= WRBUFF_SIZE;				// Number of data transfer
		XferInfo.dir		= DEVICE_TASK_XFER_DIR_OUT;	// Direction of data transfer
		XferInfo.pAddress	= pWrBuff;					// Address of buffer for data receiving
		XferInfo.dmaChannel	= 0;

		// Execute ATA command
		result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATA, &AtaCmd, &XferInfo );
		if( result == DEVICE_TASK_STATUS_UNSUCCESSFUL )
		{
			// Failed to execute ATA command
			DBG_FlowStrPrint( "PlayModeTest ATAPI_Write NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// Test READ SECOTR command
		//------------------------------------------------------
		// Create ATA command(READ SECTOR[20h])
		memset( &AtaCmd, 0, sizeof( DEVICE_TASK_ATA_CMD ));
		AtaCmd.secCnt		= (unsigned char)(SECTOR_CNT);	// Sector count
		AtaCmd.secNum		= 0x00;							// LBA[7:0]
		AtaCmd.cylLow		= 0x00;							// LBA[15:8]
		AtaCmd.cylHigh		= 0x00;							// LBA[23:16]
		AtaCmd.command		= ATA_READ_SECTOR;				// Command

		// Set information for data transfer
		memset( &XferInfo, 0, sizeof( DEVICE_TASK_XFER_INFO ));
		XferInfo.mode		= DEVICE_TASK_XFER_MODE_PIO;	// PIO transfer
		XferInfo.size		= RDBUFF_SIZE;				// Number of data transfer
		XferInfo.dir		= DEVICE_TASK_XFER_DIR_IN;		// Direction of data transfer
		XferInfo.pAddress	= pRdBuff;
		XferInfo.dmaChannel	= 0;

		// Execute ATA command
		result = DEVICE_TASK_ExecIdeCmd( LUN0, DEVICE_TASK_IDECMD_TYPE_ATA, &AtaCmd, &XferInfo );
		if( result == DEVICE_TASK_STATUS_UNSUCCESSFUL )
		{
			// Failed to execute ATA command
			DBG_FlowStrPrint( "PlayModeTest ATAPI_Write NG\r\n",0 );
			break;
		}

		//------------------------------------------------------
		// Compare data
		//------------------------------------------------------

		// Compare the data which has been written with the data which has been read out
		if( STATUS_SUCCESS != ReadDataCheck() )
		{
			// Failed to execute ATAPI command
			DBG_FlowStrPrint( "PlayModeTest CMP NG\r\n",0 );
			break;
		}

		break;
	}

	// If memory pool has been allocated, release it
	if( pRdBuff != NULL )
	{
		rel_mpf( MPFID_SMP_RBF, pRdBuff );	// Release buffer of data receiving
	}

	if( pWrBuff != NULL )
	{
		rel_mpf( MPFID_SMP_WBF, pWrBuff );	// Release buffer of data transmission
	}

	TskInfo.mode = STOP_MODE;			// Change to Stop mode
}

#endif
/*
//=============================================================================
// Function_Name: UsbUserCmdTest
// description	: Test Usb mode
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void UsbUserCmdTest ( void )
{
#ifdef USB_PLAY_TEST
	unsigned short secSize;
	unsigned long lba;
#endif

	// Initialize variables
	StrgCmdInfo.size = 0x00;
	StrgCmdInfo.StsCmpFlg = FALSE;
	StrgCmdInfo.XferCmpFlg = FALSE;

	do {    /* don't loop */
		//==========================================================================
		// Judge command
		//==========================================================================
		if( StrgCmdInfo.atapi.command[0] == ATAPI_TEST_UNIT_READY )
		{
			//----------------------------------------------------------------------
			// Test Unit Ready
			//----------------------------------------------------------------------
			// Add for USBCV MSC Test
			if (StrgCmdInfo.atapi.xferSize != 0) {
			    /* Hi / Dn or Ho / Dn */
			    StrgCmdInfo.Status = DEVICE_TASK_CMD_STATUS_FAILED;     // Send status
			    break;
			}
			// End of USBCV MSC Test
			StrgCmdInfo.Status = DEVICE_TASK_CMD_STATUS_PASSED;		// Send status

		}
		else if( StrgCmdInfo.atapi.command[0] == ATAPI_INQUIRY )
		{
			//----------------------------------------------------------------------
			// INQUIRY
			//----------------------------------------------------------------------
			// Add for USBCV MSC Test
			if (StrgCmdInfo.atapi.xferDir != USER_CMD_DATA_IN) {
				/* Ho <> Di */
				StrgCmdInfo.Status = DEVICE_TASK_PHASE_ERR;
				break;
			}
			// End of USBCV MSC Test

			StrgCmdInfo.size = StrgCmdInfo.atapi.command[4];
			// Add for USBCV MSC Test
			if (StrgCmdInfo.atapi.xferSize < StrgCmdInfo.size) {
			    /* Hn / Di or Hi < Di */
			    StrgCmdInfo.size = 0;
			    StrgCmdInfo.Status = DEVICE_TASK_PHASE_ERR;
			    break;
			}
			if (StrgCmdInfo.atapi.xferSize > StrgCmdInfo.size) {
			    /* Hi / Dn or Hi > Di */
			    StrgCmdInfo.size = 0;
			    StrgCmdInfo.Status = DEVICE_TASK_CMD_STA

⌨️ 快捷键说明

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