2025-04-27 07:49:33 -04:00

845 lines
24 KiB
C

//***************************************************************************
// Audio decoder process
//
//***************************************************************************
#include "common.h"
#include "regs.h"
#include "cadec.h"
#include "zrnpch6.h"
#include "cdack.h"
// ***************************************************************************
// T C 6 8 0 0 A F
// ***************************************************************************
void AUDIO_TC6800_INIT_PCM(PHW_DEVICE_EXTENSION pHwDevExt)
{
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0xa0 );
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x80 );
}
void AUDIO_TC6800_INIT_AC3(PHW_DEVICE_EXTENSION pHwDevExt)
{
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x20 );
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
}
void AUDIO_TC6800_INIT_MPEG(PHW_DEVICE_EXTENSION pHwDevExt)
{
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x20 );
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
}
void AUDIO_TC6800_DATA_OFF(PHW_DEVICE_EXTENSION pHwDevExt)
{
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x60 );
}
// ***************************************************************************
// Z R 3 8 5 2 1
// ***************************************************************************
void AUDIO_ZR385_OUT( PHW_DEVICE_EXTENSION pHwDevExt, UCHAR val )
{
PCIF_CHECK_SERIAL(pHwDevExt);
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x08 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, val );
// necessary?
PCIF_CHECK_SERIAL(pHwDevExt);
}
void AUDIO_ZR385_DOWNLOAD( PHW_DEVICE_EXTENSION pHwDevExt, PUCHAR pData, ULONG size )
{
ULONG i;
for( i = 0; i < size; i++ )
AUDIO_ZR385_OUT( pHwDevExt, *pData++ );
}
void AUDIO_ZR38521_BOOT_AC3(PHW_DEVICE_EXTENSION pHwDevExt)
{
AUDIO_ZR385_DOWNLOAD( pHwDevExt, ZRN_AC3_DEC, sizeof(ZRN_AC3_DEC) );
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioType == AUDIO_OUT_DIGITAL )
AUDIO_ZR385_DOWNLOAD( pHwDevExt, ZRN_AC3_SPD, sizeof(ZRN_AC3_SPD) );
}
void AUDIO_ZR38521_BOOT_MPEG(PHW_DEVICE_EXTENSION pHwDevExt)
{
// not support!
}
void AUDIO_ZR38521_BOOT_PCM(PHW_DEVICE_EXTENSION pHwDevExt)
{
AUDIO_ZR385_DOWNLOAD( pHwDevExt, ZRN_PCM, sizeof(ZRN_PCM) );
}
NTSTATUS AUDIO_ZR38521_CFG(PHW_DEVICE_EXTENSION pHwDevExt)
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x82 );
AUDIO_ZR385_OUT( pHwDevExt, 0x50 );
AUDIO_ZR385_OUT( pHwDevExt, 0x40 );
AUDIO_ZR385_OUT( pHwDevExt, 0x09 );
AUDIO_ZR385_OUT( pHwDevExt, 0x09 );
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioType == AUDIO_OUT_DIGITAL )
AUDIO_ZR385_OUT( pHwDevExt, 0x70 );
else
AUDIO_ZR385_OUT( pHwDevExt, 0x50 );
AUDIO_ZR385_OUT( pHwDevExt, 0x02 );
AUDIO_ZR385_OUT( pHwDevExt, 0x02 );
AUDIO_ZR385_OUT( pHwDevExt, 0x04 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_PCMX( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x88 );
AUDIO_ZR385_OUT( pHwDevExt, 0x81 );
AUDIO_ZR385_OUT( pHwDevExt, 0x82 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0xff );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_AC3( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x85 );
AUDIO_ZR385_OUT( pHwDevExt, 0x08 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0x11 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0xff );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_MPEG1( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x87 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0xff );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_PLAY( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x8a );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_MUTE_OFF( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x89 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_MUTE_ON( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x8b );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_STOP( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x8c );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_STOPF( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x8d );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_STCR( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x94 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x03 );
AUDIO_ZR385_OUT( pHwDevExt, 0xf6 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_VDSCR_ON( PHW_DEVICE_EXTENSION pHwDevExt ,ULONG stc )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x93 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x03 );
AUDIO_ZR385_OUT( pHwDevExt, 0xf4 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x02 );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0xfb );
AUDIO_ZR385_OUT( pHwDevExt,0xc8 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_VDSCR_OFF( PHW_DEVICE_EXTENSION pHwDevExt , ULONG stc )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x93 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x03 );
AUDIO_ZR385_OUT( pHwDevExt, 0xf4 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x02 );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0xfb );
AUDIO_ZR385_OUT( pHwDevExt,0xc8 );
AUDIO_ZR385_OUT( pHwDevExt,0x80 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_AVSYNC_OFF( PHW_DEVICE_EXTENSION pHwDevExt , ULONG stc )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt,0x93 );
AUDIO_ZR385_OUT( pHwDevExt,0x0d );
AUDIO_ZR385_OUT( pHwDevExt,0x03 );
AUDIO_ZR385_OUT( pHwDevExt,0xf4 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x02 );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0xfb );
AUDIO_ZR385_OUT( pHwDevExt,0xc8 );
AUDIO_ZR385_OUT( pHwDevExt,0xc0 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_AVSYNC_ON( PHW_DEVICE_EXTENSION pHwDevExt , ULONG stc )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt,0x93 );
AUDIO_ZR385_OUT( pHwDevExt,0x0d );
AUDIO_ZR385_OUT( pHwDevExt,0x03 );
AUDIO_ZR385_OUT( pHwDevExt,0xf4 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x02 );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,(UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0xfb );
AUDIO_ZR385_OUT( pHwDevExt,0xc8 );
AUDIO_ZR385_OUT( pHwDevExt,0x40 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_STAT( PHW_DEVICE_EXTENSION pHwDevExt , PULONG pDiff )
{
UCHAR val;
if( pDiff == NULL )
return STATUS_UNSUCCESSFUL;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 ) {
*pDiff = 0x0908;
return STATUS_UNSUCCESSFUL;
}
*pDiff = 0;
AUDIO_ZR385_OUT( pHwDevExt,0x8e );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
// Check DIFTH
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
*pDiff |= (ULONG)val << 8;
AUDIO_ZR385_OUT( pHwDevExt,0x00 );
// Check DIFTL
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
*pDiff |= val & 0xff;
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS AUDIO_ZR38521_KCOEF( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( pHwDevExt, 0x93 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x03 );
AUDIO_ZR385_OUT( pHwDevExt, 0xf0 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x03 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x59 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x7f );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x59 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
void AUDIO_ZR38521_REPEAT_02( PHW_DEVICE_EXTENSION pHwDevExt )
{
AUDIO_ZR385_OUT( pHwDevExt, 0x93 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0xc3 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0x13 );
AUDIO_ZR385_OUT( pHwDevExt, 0xfb );
AUDIO_ZR385_OUT( pHwDevExt, 0xd0 );
AUDIO_ZR385_OUT( pHwDevExt, 0x44 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
}
void AUDIO_ZR38521_REPEAT_16( PHW_DEVICE_EXTENSION pHwDevExt )
{
AUDIO_ZR385_OUT( pHwDevExt, 0x93 );
AUDIO_ZR385_OUT( pHwDevExt, 0x0d );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0xc3 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x01 );
AUDIO_ZR385_OUT( pHwDevExt, 0x13 );
AUDIO_ZR385_OUT( pHwDevExt, 0xfb );
AUDIO_ZR385_OUT( pHwDevExt, 0xd3 );
AUDIO_ZR385_OUT( pHwDevExt, 0xc4 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
}
NTSTATUS AUDIO_ZR38521_BFST( PHW_DEVICE_EXTENSION pHwDevExt , PULONG pErrCode )
{
UCHAR val;
if( pErrCode == NULL )
return STATUS_UNSUCCESSFUL;
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
if( val != 0x80 ) {
*pErrCode = 0x0908;
return STATUS_UNSUCCESSFUL;
}
*pErrCode = 0;
AUDIO_ZR385_OUT( pHwDevExt, 0x8e );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
// Check IST
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
val &= 0x07;
*pErrCode |= (ULONG)val << 8;
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
// Check BFST
PCIF_CHECK_SERIAL(pHwDevExt);
val = READ_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SR );
val &= 0x07;
*pErrCode |= val;
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
AUDIO_ZR385_OUT( pHwDevExt, 0x00 );
return STATUS_SUCCESS;
}
// ***************************************************************************
// T C 9 4 2 5 F
// ***************************************************************************
void AUDIO_TC9425_INIT_DIGITAL( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
val = 0;
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioType != AUDIO_OUT_ANALOG )
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioMode == AUDIO_TYPE_AC3 )
val |= 0x40;
if( (((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioCgms & 0x02) == 0x00 ) {
val |= 0x20; // Copying is permitted without restriction
DebugPrint( ( DebugLevelTrace, "DVDTS: AUDIO Copy OK\r\n" ) );
}
else {
val &= 0xDF; // Basically no copying is permitted (depend on L-Bit below)
DebugPrint( ( DebugLevelTrace, "DVDTS: AUDIO Copy NG\r\n" ) );
}
// COPY, EMPH
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, val );
if( (((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioCgms & 0x01) == 0x00 ) {
val = 0x98; // L-Bit==0; One generation of copies may be made
DebugPrint( ( DebugLevelTrace, "DVDTS: AUDIO 1 Time Copy OK\r\n" ) );
}
else {
val = 0x99; // L-Bit==1; No copying is permitted
DebugPrint( ( DebugLevelTrace, "DVDTS: AUDIO 1 Time Copy NG\r\n" ) );
}
// Category Code, LBIT
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, val );
// Channel Num
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioFreq == AUDIO_FS_32 )
val = 0xc0;
else if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioFreq == AUDIO_FS_44 )
val = 0x00;
else if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioFreq == AUDIO_FS_48 )
val = 0x40;
else
val = 0x40;
// FS1, FS2, CKA1, CKA2
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, val );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
}
void AUDIO_TC9425_INIT_ANALOG( PHW_DEVICE_EXTENSION pHwDevExt )
{
UCHAR val;
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
// MONO, CHS, EM, EMP
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0xc0 );
//
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioType == AUDIO_OUT_DIGITAL )
val = 0x79;
else
val = 0x69;
if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioFreq == AUDIO_FS_96 )
val |= 0x04;
else if( ((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioFreq == AUDIO_FS_48 )
val |= 0x04;
// BIT, DOIN, DOSEL, IFSEL, RLS
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, val );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0xc0 );
AUDIO_TC9425_SET_VOLUME( pHwDevExt ,((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioVolume );
}
void AUDIO_TC9425_SET_VOLUME( PHW_DEVICE_EXTENSION pHwDevExt , ULONG vol )
{
UCHAR ucvol;
((PMasterDecoder)pHwDevExt->DecoderInfo)->ADec.AudioVolume = vol;
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x00 );
ucvol = (UCHAR)vol;
ucvol = INVERSE_BYTE( pHwDevExt, ucvol );
ucvol = (UCHAR)( ucvol >> 1 );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, ucvol );
PCIF_CHECK_SERIAL( pHwDevExt );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( pHwDevExt->ioBaseLocal + PCIF_SW, 0x40 );
}
UCHAR INVERSE_BYTE( PHW_DEVICE_EXTENSION pHwDevExt, UCHAR uc )
{
ULONG i;
UCHAR retch = 0;
for( i = 0; i < 8; i++ )
retch |= ( uc & 0x01 ) << ( 7 - i );
return retch;
}