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

📄 madevdrv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			default:
				bZeroVal = 0x00;
				break;
		}

		/* write Zero value */
		if( dFormat==0x80 || dFormat==0x81 )
			sdResult = WriteStereoAdpcmZeroVal( dRamAdrs + dWaveSize, MA_WAVE_SIZE - dWaveSize );
		else
			sdResult = MaDevDrv_SendDirectRamVal( dRamAdrs + dWaveSize, MA_WAVE_SIZE - dWaveSize, bZeroVal );

		/* error  */
		if ( sdResult != MASMW_SUCCESS)
		{
			return sdResult;
		}
		pbWaveData  += dWaveSize;
		dWaveSize   -= dWaveSize;
	}

	/* update stream info */
	pgMaDevDrvInfo->StreamInfo[dSaId].pbWaveData  = pbWaveData;
	pgMaDevDrvInfo->StreamInfo[dSaId].dWaveSize   = dWaveSize;

	return MASMW_SUCCESS;
}
/****************************************************************************
 *	StreamUpdate
 *
 *	Description:
 *			Update wave data to the stream audio.
 *	Arguments:
 *			dSaId	stream audio slot number
 *	Return:
 *			0		success
 *			< 0		error code
 *
 ****************************************************************************/
static SINT32 StreamUpdate( UINT32 dSaId )
{
	SINT32	sdResult = MASMW_SUCCESS;
	UINT32	dFormat;
	UINT8 *	pbWaveData;
	UINT32	dWaveSize;
	UINT32	dPgPoint;
	UINT32	dPrvPoint;
	UINT32	dEndPoint;
	UINT32	dWriteSize;
	UINT32	dRamAdrs;
	UINT8	bZeroVal = 0x00;
	UINT32	dRegIndex;
	UINT8	bPacket[6];
	UINT8	bCh;

	if( pgMaDevDrvInfo->StreamInfo[dSaId].bState==MADEVDRV_STREAM_STATE_IDLE )
		return sdResult;

	/* read current PG */
	dPgPoint = (UINT32)MaDevDrv_ReadIntermediateReg( MAI_STREAM_PG_0 + dSaId );

	dPrvPoint	= pgMaDevDrvInfo->StreamInfo[dSaId].dPrvPoint;
	dFormat 	= pgMaDevDrvInfo->StreamInfo[dSaId].dFormat;

	dPgPoint = (UINT32)((dPgPoint & 0x3F) << 4);

	/* set Zero value */
	switch( dFormat&0x7f ) {
		case 0:					/* MA-2 ADPCM */
		case 1:					/* ADPCM */
		case 2:					/* 8-bit ofset binary */
			bZeroVal = (UINT8)0x80;
			break;
		case 3:					/* 8-bit 2's comp binary */
		case 4:					/* 16-bit 2's comp binary */
			bZeroVal = 0x00;
			break;
		default:
			bZeroVal = 0x00;
			break;
	}
	/* check PG */
	if ( dPgPoint == dPrvPoint )
	{
		return sdResult;
	}

	pbWaveData = pgMaDevDrvInfo->StreamInfo[dSaId].pbWaveData;
	dWaveSize  = pgMaDevDrvInfo->StreamInfo[dSaId].dWaveSize;


	dRamAdrs = dPrvPoint + (MA_RAM_START_ADDRESS + (MA_RAM_BLOCK_SIZE * (7-dSaId)) + 0x20);

	if( dPrvPoint < dPgPoint )
	{
	/*                Prv                Pg
	        0          V                 V                1023
			+--+--------------------------------------------+
			|32|       |xxxxxxxxxxxxxxxxx|                  |
			+--+--------------------------------------------+

				MA_WAVE_SIZE = 1024 -32
				MA_MAX_PG    = 1024 -32
	*/

		dWriteSize = dPgPoint - dPrvPoint;

		if( dWaveSize >= dWriteSize )
		{
		/*            Prv                Pg
	        0          V                 V                1023
			+--+--------------------------------------------+
			|32|       |ddddddddddddddddd|                  |
			+--+--------------------------------------------+
		*/
			/* write data */
			sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWriteSize );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}
			pbWaveData += dWriteSize;
			dWaveSize  -= dWriteSize;
		}
		else
		{
		/*            Prv                Pg
	        0          V                 V                1023
			+--+--------------------------------------------+
			|32|       |ddddddddddd|00000|                  |
			+--+--------------------------------------------+
		*/
			if( dWaveSize != 0 )
			{
				/* write data */
				sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWaveSize );
				/* error */
				if ( sdResult != MASMW_SUCCESS )
				{
					return sdResult;
				}

				pbWaveData += dWaveSize;
				dWriteSize -= dWaveSize;
				dRamAdrs   += dWaveSize;
				dWaveSize   = 0;
			}

			/* write ZERO value */
			if( dFormat==0x80 || dFormat==0x81 )
				sdResult = WriteStereoAdpcmZeroVal( dRamAdrs, dWriteSize );
			else
				sdResult = MaDevDrv_SendDirectRamVal( dRamAdrs, dWriteSize, bZeroVal );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}
		}
	}

	else
	{
	/*                 Pg               Prv
	        0          V                 V                1023
			+--+--------------------------------------------+
			|32|xxxxxxx|                 |xxxxxxxxxxxxxxxxxx|
			+--+--------------------------------------------+
	*/
		dWriteSize = MA_MAX_PG - dPrvPoint;
		if( dWaveSize >= dWriteSize )
		{
		/*                 Pg               Prv
		        0          V                 V                1023
				+--+--------------------------------------------+
				|32|       |                 |dddddddddddddddddd|
				+--+--------------------------------------------+
		*/
			/* write data */
			sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWriteSize );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}

			/* PCM ? */
			if( (dFormat&0x7f)>1 )
			{
				switch( dFormat ) {
					case 0x02:		/* 8bit mono, offset bin */
					case 0x03:		/* 8bit mono, 2's comp */
						--dWriteSize;
						break;
					case 0x82:		/* 8bit stereo, offset bin */
					case 0x83:		/* 8bit stereo, 2's comp */
					case 0x04:		/* 16bit mono */
						dWriteSize -= 2;
						break;
					case 0x84:		/* 16bit stereo */
						dWriteSize -= 4;
						break;
					default:
						break;
				}
			}
			pbWaveData += dWriteSize;
			dWaveSize  -= dWriteSize;
		}
		else
		{
		/*                 Pg               Prv
		        0          V                 V                1023
				+--+--------------------------------------------+
				|32|       |                 |dddddddddddd000000|
				+--+--------------------------------------------+
		*/
			if( dWaveSize != 0 )
			{
				/* write data */
				sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWaveSize );
				/* error */
				if ( sdResult != MASMW_SUCCESS )
				{
					return sdResult;
				}

				pbWaveData += dWaveSize;
				dRamAdrs   += dWaveSize;
				dWriteSize -= dWaveSize;
				dWaveSize   = 0;
			}

			/* write ZERO value */
			if( dFormat==0x80 || dFormat==0x81 )
				sdResult = WriteStereoAdpcmZeroVal( dRamAdrs, dWriteSize );
			else
				sdResult = MaDevDrv_SendDirectRamVal( dRamAdrs, dWriteSize, bZeroVal );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}
		}

		dWriteSize = dPgPoint;
		dRamAdrs = MA_MIN_PG + (MA_RAM_START_ADDRESS + (MA_RAM_BLOCK_SIZE * (7-dSaId)) + 0x20);

		if( dWaveSize >= dWriteSize )
		{
		/*                 Pg               Prv
		        0          V                 V                1023
				+--+--------------------------------------------+
				|32|ddddddd|                 |                  |
				+--+--------------------------------------------+
		*/
			/* write data */
			sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWriteSize );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}

			pbWaveData += dWriteSize;
			dWaveSize  -= dWriteSize;
		}
		else
		{
		/*                 Pg               Prv
		        0          V                 V                1023
				+--+--------------------------------------------+
				|32|ddd0000|                 |                  |
				+--+--------------------------------------------+
		*/
			if( dWaveSize != 0 )
			{
				/* write data */
				sdResult = MaDevDrv_SendDirectRamData( dRamAdrs, 0, pbWaveData, dWaveSize );
				/* error */
				if ( sdResult != MASMW_SUCCESS )
				{
					return sdResult;
				}

				pbWaveData += dWaveSize;
				dRamAdrs   += dWaveSize;
				dWriteSize -= dWaveSize;
				dWaveSize   = 0;
			}

			/* write ZERO value */
			if( dFormat==0x80 || dFormat==0x81 )
				sdResult = WriteStereoAdpcmZeroVal( dRamAdrs, dWriteSize );
			else
				sdResult = MaDevDrv_SendDirectRamVal( dRamAdrs, dWriteSize, bZeroVal );
			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}
		}
	}

	/* update stream info */

	/* data pointer */
	pgMaDevDrvInfo->StreamInfo[dSaId].pbWaveData = pbWaveData;
	/* data size */
	pgMaDevDrvInfo->StreamInfo[dSaId].dWaveSize  = dWaveSize;
	/* position */
	pgMaDevDrvInfo->StreamInfo[dSaId].dPrvPoint  = dPgPoint;

	if( pgMaDevDrvInfo->StreamInfo[dSaId].bState==MADEVDRV_STREAM_STATE_ENDOFDATA )
	{

		dEndPoint = pgMaDevDrvInfo->StreamInfo[dSaId].dEndPoint;

	/************************************************************

			      Prv        End       Pg
	  Case I       v          v        v
			     ------------------------


			       Pg        Prv      End
	  Case II      v          v        v
			     ------------------------


		    	  End         Pg      Prv
	  Case III     v          v        v
			     ------------------------

	*************************************************************/

		if( (dPrvPoint< dEndPoint && dEndPoint<=dPgPoint)  ||
			(dPgPoint < dPrvPoint && dPrvPoint< dEndPoint) ||
			(dEndPoint<=dPgPoint  && dPgPoint < dPrvPoint) )
		{
			pgMaDevDrvInfo->StreamInfo[dSaId].bState = MADEVDRV_STREAM_STATE_IDLE;

			/* make packet for KeyOff */
			dRegIndex = (UINT32)( MAC_EXT_WT_VOICE_ADDRESS+(9+dSaId)*6 + 5 );

			sdResult = MaDevDrv_ReceiveData( dRegIndex );
			/* error  */
			if ( sdResult < MASMW_SUCCESS )
			{
				return sdResult;
			}
			bCh = (UINT8)( sdResult & 0x0F );

			bPacket[0] = (UINT8)(  dRegIndex       & 0x7F );		/* address part */
			bPacket[1] = (UINT8)( (dRegIndex >> 7) | 0x80 );
			bPacket[2] = (UINT8)(  0x30 | bCh      | 0x80 );		/* data part, KeyOff */

			/* write direct packet */
			sdResult = MaDevDrv_SendDirectPacket( bPacket, 3 );

			/* error */
			if ( sdResult != MASMW_SUCCESS )
			{
				return sdResult;
			}

			/* clear STEREO bit for stereo data */
			if(dSaId==0 && (pgMaDevDrvInfo->StreamInfo[dSaId].dFormat&0x80) )
			{
				dRegIndex += 6;
				bPacket[0] = (UINT8)(  dRegIndex       & 0x7F );		/* address part */
				bPacket[1] = (UINT8)( (dRegIndex >> 7) | 0x80 );
				bPacket[2] = (UINT8)(  0x30 | bCh      | 0x80 );		/* data part, KeyOff */

				/* write direct packet */
				sdResult = MaDevDrv_SendDirectPacket( bPacket, 3 );

				/* error */
				if ( sdResult != MASMW_SUCCESS )
				{
					return sdResult;
				}

				/* wait 20us */
				machdep_Wait( 20000 );

				/* clear STEREO bit */
				MaDevDrv_WriteIntermediateReg( MAI_STM_CTRL, 0 );
			}

			if ( pgMaDevDrvInfo->dSeqId == 1 )
			{
			}
		}
		else
		{
			pgMaDevDrvInfo->StreamInfo[dSaId].dPrvPoint = dPgPoint;
		}
	}
	/* change state to ENDOFDATA */
	else if( dWaveSize==0 )
	{
		pgMaDevDrvInfo->StreamInfo[dSaId].bState=MADEVDRV_STREAM_STATE_ENDOFDATA;
	}

	return sdResult;
}
/****************************************************************************
 *	ControlInterrupt
 *
 *	Description:
 *			Enable or disable the interrupt.
 *	Arguments:
 *			dIrqFlagReg	IRQ control reg
 *			dCtrl		control flag (0: enable, 1: disable)
 *			bIntCtrl	interrupt number
 *	Return:
 *			MASMW_SUCCESS(0)
 *
 ****************************************************************************/
static SINT32 ControlInterrupt( UINT32 dIrqCtrlReg, UINT32 dCtrl, UINT8 bIntCtrl )
{
	UINT8	bData;

	MADEVDRV_DBGMSG(("ControlInterrupt: dIrqCtrlReg=%ld, dCtrl=%ld, bIntCtrl=%02X\n", dIrqCtrlReg, dCtrl, bIntCtrl));

	bData = MaDevDrv_ReadIntermediateReg( dIrqCtrlReg );

	if ( dCtrl==ENABLE_IRQ )		/* enable */
	{
		bData |= bIntCtrl;
	}
	else							/* diable */
	{
		bData &= (UINT8)( ~bIntCtrl );
	}

	MaDevDrv_WriteIntermediateReg( dIrqCtrlReg, bData );
	return MASMW_SUCCESS;
}
/****************************************************************************
 *	SoftInt0
 *
 *	Description:
 *			Software interrupt #0 interrupt handler.
 *	Argument:
 *			dCtrl	unused
 *	Return:
 *			None
 *
 ****************************************************************************/
static void SoftInt0( UINT32 dCtrl )
{
	UINT8	bRamVal;					/* ram value */
	UINT8	bMaster;

	(void)dCtrl;						/* for unused warning message */

	MADEVDRV_DBGMSG(("SoftInt0: dCtrl=%ld\n", dCtrl));

	/* read SoftIntRAM #0 */
	bRamVal = MaDevDrv_ReadIntermediateReg( MAI_SOFTINT_RAM_0 );

	switch( bRamVal&0x60 )
	{
	case 0x00:		/* stop  */
	case 0x40:		/* start */
		MaDevDrv_StreamHandler( 0, 0, 0, bRamVal, 0 );	/* SA #0, setup */
		break;
	case 0x20:		/* slave */
		if( pgMaDevDrvInfo->bSlave!=0xff )
		{
			bMaster = pgMaDevDrvInfo->bSlave;
			pgMaDevDrvInfo->bSlave		= (UINT8)(bRamVal&0x1f);
			MaDevDrv_StreamHandler( 0, 1, 0, bMaster, 0 );	/* SA #1, setup */
		}
		else
		{
			pgMaDevDrvInfo->bSlave		= (UINT8)(bRamVal&0x1f);
		}
		break;
	case 0x60:		/* master */
		if( pgMaDevDrvInfo->bSlave!=0xff )
		{
			MaDevDrv_StreamHandler( 0, 0, 0, bRamVal, 0 );	/* SA #0, setup */
		}
		else
		{
			pgMaDevDrvInfo->bSlave		= (UINT8)(bRamVal);
		}
		break;
	}
}
/****************************************************************************
 *	SoftInt1
 *
 *	Description:
 *			Software interrupt #1 interrupt handler.
 *	Argument:
 *			dCtrl	unused
 *	Return:
 *			None
 *
 *

⌨️ 快捷键说明

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