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