📄 usbd_sampletask.c
字号:
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 + -