📄 mamachdep.c
字号:
/****************************************************************************
* *
* Copyright (C) 2001 YAMAHA CORPORATION. All rights reserved. *
* *
* Module : mamachdep.c *
* *
* Description : machine dependent part for MA SMW *
* *
* Version : 1.3.4.0 2001.12.14 *
* *
Modefied by Kenny to support both MA-3 and MA-3L2
****************************************************************************/
/*
* Mobile Innovation porting History:
* 1. 2003/10/21 Robert.Chen
* Initial.
*
*/
#include "typedefs.h"
#include "rvf_api.h" /* 2003/10/21 Robert.Chen
* Use Reviera Frame API to implement machine depend
* functions, e.g. machdep_sleep()
*/
#include "melody_cfg.h"
#include "mamachdep.h"
#include "madefs.h"
extern void wait_ARM_cycles(UINT32 cpt_loop);
extern inline UINT32 convert_nanosec_to_cycles(UINT32 time);
/****************************************************************************
* machdep_memcpy
*
*
****************************************************************************/
void machdep_memcpy( UINT8 *dst_ptr, UINT8 *src_ptr, UINT32 size )
{
while ( size-- != 0 )
{
*dst_ptr++ = *src_ptr++;
}
}
/****************************************************************************
* machdep_Wait
*
* Function:
* Performs wait processing for designated time.
* Arguments:
* wait_time Designated wait time[ns]
* Return:
* None
*
****************************************************************************/
void machdep_Wait( UINT32 wait_time )
{
/*
* 2003/10/21 Robert.Chen
* Description:
* Assume system CPU core clock CAL_SYS_CPU_FREQ, external memory access
* delay CAL_SYS_MA_DELAY (defined in mamachdep.h, depend on CPU), a loop
* code like
* for(i = 0; i < k; i ++);
* will access external memory three times, here i is a volatile variable,
* if other code except external memory access is ignored, the above loop
* will last about (CAL_SYS_MA_DELAY * 3 * k * 1000 / CAL_SYS_CPU_FREQ) ns,
* so the following formula for calculating the loop factor k
* k = (wait_time * CAL_SYS_CPU_FREQ / (CAL_SYS_MA_DELAY * 3 * 1000))
*
*/
/*
volatile int i;
volatile int delay = 0;
delay = (wait_time * CAL_SYS_CPU_FREQ) / (CAL_SYS_MA_DELAY * 3 * 1000);
if(delay == 0)
delay = 1;
for(i = 0; i < delay; i++);
*/
wait_ARM_cycles(convert_nanosec_to_cycles(wait_time+20));
}
/****************************************************************************
* machdep_WriteStatusFlagReg
*
* Function:
* Write a byte data to the status flag register.
* Arguments:
* data byte data for write
* Return:
* None
*
****************************************************************************/
void machdep_WriteStatusFlagReg( UINT8 data )
{
/*----------------------------------------------------------------------*
*----------------------------------------------------------------------*/
MA_STATUS_REG = data;
// YMU762C_MA-3L2
machdep_Wait( 600 );
}
/****************************************************************************
* machdep_ReadStausFlagReg
*
* Function:
* Read a byte data from the status flag register.
* Arguments:
* data byte data for write
* Return:
* status register value
*
****************************************************************************/
UINT8 machdep_ReadStatusFlagReg( void )
{
UINT8 data;
/*----------------------------------------------------------------------*
*----------------------------------------------------------------------*/
data = MA_STATUS_REG;
machdep_Wait( 70 );
return data;
}
/****************************************************************************
* machdep_WriteDataReg
*
* Function:
* Write a byte data to the MA-3 write data register.
* Arguments:
data byte data for write
* Return:
* none
*
****************************************************************************/
void machdep_WriteDataReg( UINT8 data )
{
/*----------------------------------------------------------------------*
*----------------------------------------------------------------------*/
MA_DATA_REG = data;
// YMU762C_MA-3L2
machdep_Wait( 600 );
}
/****************************************************************************
* machdep_ReadDataReg
*
* Function:
* Read a byte data from the MA-3 read data register.
* Arguments:
None
* Return:
* read data
*
****************************************************************************/
UINT8 machdep_ReadDataReg( void )
{
UINT8 data;
/*----------------------------------------------------------------------*
*----------------------------------------------------------------------*/
data = MA_DATA_REG;
machdep_Wait( 70 );
return data;
}
/****************************************************************************
* machdep_CheckStauts
*
* Function:
* Check status of the MA-3.
* Arguments:
flag check flag
* Return:
* 0 success
* -1 time out
*
****************************************************************************/
SINT32 machdep_CheckStatus( UINT8 flag )
{
UINT8 read_data;
volatile UINT16 time = 0;
do
{
read_data = machdep_ReadStatusFlagReg();
if ( time++ > MA_STATUS_TIMEOUT )
{
/* timeout: stop timer */
return MASMW_ERROR;
}
}
while ( ( read_data & flag ) != 0 );
return MASMW_SUCCESS;
}
/****************************************************************************
* machdep_WaitValidData
*
* Function:
* Check status of the MA-3.
* Arguments:
flag check flag
* Return:
* 0 success
* -1 time out
*
****************************************************************************/
SINT32 machdep_WaitValidData( UINT8 flag )
{
UINT8 read_data;
volatile UINT16 time = 0;
do
{
read_data = machdep_ReadStatusFlagReg();
if ( time++ > MA_STATUS_TIMEOUT )
{
/* timeout: stop timer */
return MASMW_ERROR;
}
}
while ( ( read_data & flag ) == 0 );
return MASMW_SUCCESS;
}
/****************************************************************************
* machdep_Sleep
*
* Function:
* For sleeping a period designated by the stop processing in needed.
* Argument:
* sleep_time Sleep time[ms]
*
****************************************************************************/
void machdep_Sleep( UINT32 sleep_time )
{
rvf_delay(RVF_MS_TO_TICKS(sleep_time));
}
/****************************************************************************
* machdep_CheckDelayedFifoEmpty
*
* Function:
* Check Delayed FIFO Empty Flag
* Arguments:
* Return:
* 0 not Empty
* 1 Empty
*
****************************************************************************/
SINT32 machdep_CheckDelayedFifoEmpty( void )
{
UINT32 flag;
flag = 0;
if( machdep_ReadStatusFlagReg()&MA_EMP_DW ) flag |= 0x01;
if( machdep_ReadStatusFlagReg()&MA_EMP_DW ) flag |= 0x02;
if( flag==0 ) return 0;
else if( flag==0x03 ) return 1;
flag = 0;
if( machdep_ReadStatusFlagReg()&MA_EMP_DW ) flag |= 0x01;
if( machdep_ReadStatusFlagReg()&MA_EMP_DW ) flag |= 0x02;
if( flag==0 ) return 0;
else return 1;
}
/****************************************************************************
* machdep_WaitDelayedFifoEmpty
*
* Function:
* Wait untill Delayed FIFO Empty
* Arguments:
* Return:
* 0 success
* -1 time out
*
****************************************************************************/
SINT32 machdep_WaitDelayedFifoEmpty( void )
{
UINT32 read_data;
volatile UINT16 time;
do
{
read_data = machdep_CheckDelayedFifoEmpty();
if ( time++ > MA_STATUS_TIMEOUT )
{
/* timeout: stop timer */
return MASMW_ERROR;
}
}
while ( read_data==0 );
return MASMW_SUCCESS;
}
/****************************************************************************
* machdep_WaitImmediateFifoEmpty
*
* Function:
* Wait untill Immediate FIFO Empty
* Arguments:
* Return:
* 0 success
* -1 time out
*
****************************************************************************/
SINT32 machdep_WaitImmediateFifoEmpty( void )
{
UINT8 read_data = 0;
volatile UINT16 time = 0;
do
{
read_data = machdep_ReadStatusFlagReg();
if ( time++ > MA_STATUS_TIMEOUT )
{
/* timeout: stop timer */
return MASMW_ERROR;
}
} while( (read_data&MA_EMP_W)==0 );
return MASMW_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -