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

📄 mamachdep.c

📁 是一个手机功能的模拟程序
💻 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 + -