407 lines
11 KiB
C++
407 lines
11 KiB
C++
//***************************************************************************
|
|
// Initialize process
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "common.h"
|
|
|
|
#include "regs.h"
|
|
#include "cdack.h"
|
|
#include "cvdec.h"
|
|
#include "cvpro.h"
|
|
#include "cadec.h"
|
|
#include "ccpgd.h"
|
|
#include "ccpp.h"
|
|
#include "dvdcmd.h"
|
|
|
|
extern void BadWait( DWORD dwTime );
|
|
//--- 97.09.23 K.Chujo
|
|
extern void USCC_on( PHW_DEVICE_EXTENSION pHwDevExt );
|
|
extern void USCC_off( PHW_DEVICE_EXTENSION pHwDevExt );
|
|
//--- End.
|
|
|
|
extern "C" BOOLEAN STREAMAPI HwInterrupt( IN PHW_DEVICE_EXTENSION pHwDevExt );
|
|
|
|
/*
|
|
** DriverEntry()
|
|
*/
|
|
extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
|
|
{
|
|
HW_INITIALIZATION_DATA HwInitData;
|
|
|
|
// TRAP;
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:DriverEntry\r\n") );
|
|
|
|
RtlZeroMemory( &HwInitData, sizeof(HW_INITIALIZATION_DATA) );
|
|
|
|
HwInitData.HwInitializationDataSize = sizeof(HwInitData);
|
|
HwInitData.HwInterrupt = (PHW_INTERRUPT)HwInterrupt;
|
|
HwInitData.HwReceivePacket = AdapterReceivePacket;
|
|
HwInitData.HwCancelPacket = AdapterCancelPacket;
|
|
HwInitData.HwRequestTimeoutHandler = AdapterTimeoutPacket;
|
|
HwInitData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
|
|
HwInitData.PerRequestExtensionSize = sizeof(SRB_EXTENSION);
|
|
HwInitData.PerStreamExtensionSize = sizeof(STREAMEX);
|
|
HwInitData.FilterInstanceExtensionSize = 0;
|
|
HwInitData.BusMasterDMA = TRUE;
|
|
HwInitData.Dma24BitAddresses = FALSE;
|
|
HwInitData.BufferAlignment = 4;
|
|
HwInitData.TurnOffSynchronization = FALSE;
|
|
HwInitData.DmaBufferSize = DMASIZE;
|
|
|
|
return (
|
|
StreamClassRegisterMinidriver(
|
|
(PVOID)DriverObject,
|
|
(PVOID)RegistryPath,
|
|
&HwInitData )
|
|
);
|
|
}
|
|
|
|
void GetPCIConfigSpace(IN PHW_STREAM_REQUEST_BLOCK pSrb)
|
|
{
|
|
|
|
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
|
|
|
|
if( StreamClassReadWriteConfig(
|
|
|
|
pSrb->HwDeviceExtension,
|
|
|
|
TRUE, // indicates a READ (FALSE means a WRITE)
|
|
|
|
(PVOID)&pHwDevExt->PciConfigSpace,
|
|
|
|
0, // this is the offset into the PCI space,
|
|
// change this to whatever you need to read
|
|
|
|
64 // this is the # of bytes to read. Changer
|
|
// it to the correct #.
|
|
)) {
|
|
|
|
//
|
|
// process the config info your read here.
|
|
//
|
|
{
|
|
ULONG i, j;
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:PCI Config Space\r\n" ) );
|
|
|
|
for( i=0; i<64; ) {
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: " ) );
|
|
for( j=0; j<8 && i<64; j++, i++ ) {
|
|
DebugPrint( (DebugLevelTrace, "0x%02x ", (UCHAR)*(((PUCHAR)&pHwDevExt->PciConfigSpace) + i) ) );
|
|
}
|
|
DebugPrint( (DebugLevelTrace, "\r\n" ) );
|
|
}
|
|
}
|
|
//
|
|
// note that the PCI_COMMON_CONFIG structure in WDM.H can be used
|
|
// for referencing the PCI data.
|
|
//
|
|
|
|
}
|
|
|
|
//
|
|
// now return to high priority to complete initialization
|
|
//
|
|
|
|
StreamClassCallAtNewPriority(
|
|
NULL,
|
|
pSrb->HwDeviceExtension,
|
|
LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE) InitializationEntry,
|
|
pSrb
|
|
);
|
|
return;
|
|
}
|
|
|
|
void InitializationEntry(IN PHW_STREAM_REQUEST_BLOCK pSrb)
|
|
{
|
|
DWORD st, et;
|
|
|
|
st = GetCurrentTime_ms();
|
|
|
|
HwInitialize( pSrb );
|
|
|
|
et = GetCurrentTime_ms();
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:init %dms\r\n", et - st ) );
|
|
|
|
StreamClassDeviceNotification( ReadyForNextDeviceRequest,
|
|
pSrb->HwDeviceExtension );
|
|
StreamClassDeviceNotification( DeviceRequestComplete,
|
|
pSrb->HwDeviceExtension,
|
|
pSrb );
|
|
}
|
|
|
|
/*
|
|
** HwInitialize()
|
|
*/
|
|
NTSTATUS HwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt =
|
|
(PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:HwInitialize()\r\n") );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: pHwDevExt = %p\r\n", pHwDevExt ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: pSrb->HwDeviceExtension = %p\r\n", pSrb->HwDeviceExtension ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: NumberOfAccessRanges = %d\r\n", ConfigInfo->NumberOfAccessRanges ) );
|
|
|
|
if ( ConfigInfo->NumberOfAccessRanges < 1 ) {
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:illegal config info") );
|
|
pSrb->Status = STATUS_NO_SUCH_DEVICE;
|
|
return( FALSE );
|
|
}
|
|
|
|
// Debug Dump ConfigInfo
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: Port = %p\r\n", ConfigInfo->AccessRanges[0].RangeStart.LowPart ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: Length = %p\r\n", ConfigInfo->AccessRanges[0].RangeLength ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: IRQ = %p\r\n", ConfigInfo->BusInterruptLevel ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: Vector = %p\r\n", ConfigInfo->BusInterruptVector ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: DMA = %p\r\n", ConfigInfo->DmaChannel ) );
|
|
|
|
// initialize the size of stream descriptor information.
|
|
ConfigInfo->StreamDescriptorSize =
|
|
STREAMNUM * sizeof(HW_STREAM_INFORMATION) +
|
|
sizeof(HW_STREAM_HEADER);
|
|
|
|
// pick up the I/O windows for the card.
|
|
pHwDevExt->ioBaseLocal =
|
|
(PUCHAR)ConfigInfo->AccessRanges[0].RangeStart.QuadPart;
|
|
|
|
// pick up the Interrupt level
|
|
pHwDevExt->Irq =
|
|
ConfigInfo->BusInterruptLevel;
|
|
|
|
// pick up the Revision id
|
|
pHwDevExt->RevID =
|
|
(ULONG)pHwDevExt->PciConfigSpace.RevisionID;
|
|
|
|
STREAM_PHYSICAL_ADDRESS adr;
|
|
ULONG Size;
|
|
PUCHAR pDmaBuf;
|
|
|
|
pDmaBuf = (PUCHAR)StreamClassGetDmaBuffer( pHwDevExt );
|
|
pHwDevExt->pDmaBuf = pDmaBuf;
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: DMA Buffer Logical Addr = 0x%x\r\n", pDmaBuf ) );
|
|
|
|
adr = StreamClassGetPhysicalAddress( pHwDevExt, NULL, pDmaBuf, DmaBuffer, &Size) ;
|
|
pHwDevExt->addr = adr;
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: DMA Buffer Physical Addr = 0x%x\r\n", adr.LowPart ) );
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: DMA Buffer Size = %d\r\n", Size ) );
|
|
|
|
//
|
|
NTSTATUS Stat;
|
|
PUCHAR ioBase = pHwDevExt->ioBaseLocal;
|
|
DEVICE_INIT_INFO DevInfo;
|
|
|
|
DevInfo.ioBase = ioBase;
|
|
|
|
// initialize the hardware settings
|
|
pHwDevExt->StreamType = STREAM_MODE_DVD;
|
|
pHwDevExt->TVType = DISPLAY_MODE_NTSC;
|
|
pHwDevExt->VideoAspect = ASPECT_04_03;
|
|
pHwDevExt->LetterBox = FALSE;
|
|
pHwDevExt->PanScan = FALSE;
|
|
|
|
pHwDevExt->AudioMode = AUDIO_TYPE_AC3;
|
|
// pHwDevExt->AudioMode = AUDIO_TYPE_PCM;
|
|
|
|
pHwDevExt->AudioType = AUDIO_OUT_ANALOG;
|
|
pHwDevExt->AudioVolume = 0x7f;
|
|
pHwDevExt->AudioCgms = AUDIO_CGMS_03; // No copying is permitted
|
|
pHwDevExt->AudioFreq = AUDIO_FS_48;
|
|
|
|
pHwDevExt->VideoMute = FALSE;
|
|
pHwDevExt->AudioMute = FALSE;
|
|
pHwDevExt->SubpicMute = FALSE;
|
|
pHwDevExt->OSDMute = TRUE;
|
|
pHwDevExt->SubpicHilite = FALSE;
|
|
|
|
pHwDevExt->PlayMode = PLAY_MODE_NORMAL;
|
|
pHwDevExt->RunMode = PLAY_MODE_NORMAL; // PlayMode after BOOT is Normal Mode;
|
|
|
|
pHwDevExt->pSrbDMA0 = NULL;
|
|
pHwDevExt->pSrbDMA1 = NULL;
|
|
pHwDevExt->SendFirst = FALSE;
|
|
pHwDevExt->DecodeStart = FALSE;
|
|
//--- 97.09.08 K.Chujo
|
|
pHwDevExt->TimeDiscontFlagCount = 0;
|
|
//--- End.
|
|
//--- 97.09.09 K.Chujo
|
|
pHwDevExt->DataDiscontFlagCount = 0;
|
|
//--- End.
|
|
|
|
pHwDevExt->bKeyDataXfer = FALSE;
|
|
|
|
pHwDevExt->CppFlagCount = 0;
|
|
pHwDevExt->pSrbCpp = NULL;
|
|
pHwDevExt->bCppReset = FALSE;
|
|
|
|
pHwDevExt->XferStartCount = 0;
|
|
|
|
// pHwDevExt->lSeemVBuff = 0;
|
|
// pHwDevExt->dwSeemSTC = 0;
|
|
//--- 97.09.08 K.Chujo
|
|
pHwDevExt->dwSTCInit = 0;
|
|
pHwDevExt->bDMAscheduled = FALSE;
|
|
pHwDevExt->fCauseOfStop = 0;
|
|
pHwDevExt->bDMAstop = FALSE;
|
|
pHwDevExt->bVideoQueue = FALSE;
|
|
pHwDevExt->bAudioQueue = FALSE;
|
|
pHwDevExt->bSubpicQueue = FALSE;
|
|
//--- End.
|
|
//--- 97.09.24
|
|
pHwDevExt->VideoMaxFullRate = 1 * 10000;
|
|
pHwDevExt->AudioMaxFullRate = 1 * 10000;
|
|
pHwDevExt->SubpicMaxFullRate = 1 * 10000;
|
|
//--- End.
|
|
|
|
pHwDevExt->cOpenInputStream = 0;
|
|
|
|
pHwDevExt->pstroVid = NULL;
|
|
pHwDevExt->pstroAud = NULL;
|
|
pHwDevExt->pstroSP = NULL;
|
|
pHwDevExt->pstroYUV = NULL;
|
|
pHwDevExt->pstroCC = NULL;
|
|
|
|
pHwDevExt->DAck.init( &DevInfo );
|
|
pHwDevExt->VDec.init( &DevInfo );
|
|
pHwDevExt->ADec.init( &DevInfo );
|
|
pHwDevExt->VPro.init( &DevInfo );
|
|
pHwDevExt->CPgd.init( &DevInfo );
|
|
pHwDevExt->ADec.SetParam(
|
|
pHwDevExt->AudioMode,
|
|
pHwDevExt->AudioFreq,
|
|
pHwDevExt->AudioType,
|
|
pHwDevExt->AudioCgms,
|
|
&pHwDevExt->DAck
|
|
);
|
|
pHwDevExt->VPro.SetParam( pHwDevExt->AudioMode, pHwDevExt->SubpicMute );
|
|
|
|
pHwDevExt->CPro.init( &DevInfo );
|
|
|
|
// Set Stream Mode
|
|
// initialize decoder
|
|
Stat = pHwDevExt->DAck.PCIF_RESET();
|
|
if( Stat != STATUS_SUCCESS ) {
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:illegal config info") );
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
return FALSE;
|
|
}
|
|
pHwDevExt->VDec.VIDEO_RESET();
|
|
pHwDevExt->VPro.VPRO_RESET_FUNC();
|
|
pHwDevExt->VPro.SUBP_RESET_FUNC();
|
|
// pHwDevExt->DAck.PCIF_INIT();
|
|
// WRITE_PORT_UCHAR( ioBase + PCIF_CNTL, 0x10 );
|
|
pHwDevExt->CPgd.CPGD_RESET_FUNC();
|
|
|
|
// pHwDevExt->DAck.PCIF_DMA_ABORT();
|
|
//
|
|
// // check end abort
|
|
// // Bad Coding !!!!!!!
|
|
// for( ; ; ) {
|
|
// UCHAR val;
|
|
//
|
|
// val = READ_PORT_UCHAR( ioBase + PCIF_INTF );
|
|
// if( !( val & 0x04 ) )
|
|
// break;
|
|
// }
|
|
|
|
pHwDevExt->VDec.VIDEO_ALL_INT_OFF();
|
|
pHwDevExt->DAck.PCIF_VSYNC_ON();
|
|
pHwDevExt->VDec.VIDEO_MODE_DVD( );
|
|
pHwDevExt->DAck.PCIF_PACK_START_ON();
|
|
// pHwDevExt->VDec.VIDEO_USER_INT_ON();
|
|
|
|
// Set Display Mode
|
|
pHwDevExt->VDec.VIDEO_OUT_NTSC();
|
|
pHwDevExt->VPro.VPRO_INIT_NTSC();
|
|
pHwDevExt->CPgd.CPGD_INIT_NTSC();
|
|
pHwDevExt->DAck.PCIF_ASPECT_0403();
|
|
pHwDevExt->VPro.VPRO_VIDEO_MUTE_OFF();
|
|
pHwDevExt->CPgd.CPGD_VIDEO_MUTE_OFF();
|
|
|
|
// Set Digital Out
|
|
pHwDevExt->VideoPort = 0; // Disable
|
|
pHwDevExt->DAck.PCIF_SET_DIGITAL_OUT( pHwDevExt->VideoPort );
|
|
|
|
// Set Digital Palette
|
|
|
|
// UCHAR paldata[256];
|
|
// ULONG l;
|
|
//
|
|
// for( l = 0; l < 256; l++ )
|
|
// paldata[l] = (UCHAR)l;
|
|
//
|
|
// pHwDevExt->DAck.PCIF_SET_PALETTE( PALETTE_Y, paldata );
|
|
// pHwDevExt->DAck.PCIF_SET_PALETTE( PALETTE_Cb, paldata );
|
|
// pHwDevExt->DAck.PCIF_SET_PALETTE( PALETTE_Cr, paldata );
|
|
|
|
BOOLEAN bStatus;
|
|
|
|
bStatus = pHwDevExt->CPro.reset( NO_GUARD );
|
|
|
|
ASSERTMSG( "\r\n...CPro Status Error!!( reset )", bStatus );
|
|
|
|
// Set Audio Mode
|
|
if( pHwDevExt->AudioMode == AUDIO_TYPE_AC3 ) {
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_BOOT_AC3();
|
|
|
|
pHwDevExt->ADec.AUDIO_ZR38521_CFG();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_AC3();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_KCOEF();
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_AC3();
|
|
pHwDevExt->VPro.SUBP_SELECT_AUDIO_SSID();
|
|
}
|
|
else if( pHwDevExt->AudioMode == AUDIO_TYPE_PCM ) {
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_BOOT_PCM();
|
|
|
|
pHwDevExt->ADec.AUDIO_ZR38521_CFG();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_PCMX();
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_PCM();
|
|
pHwDevExt->VPro.SUBP_SELECT_AUDIO_SSID();
|
|
}
|
|
else
|
|
TRAP;
|
|
|
|
pHwDevExt->ADec.AUDIO_ZR38521_REPEAT_16();
|
|
pHwDevExt->ADec.AUDIO_TC9425_INIT_DIGITAL();
|
|
pHwDevExt->ADec.AUDIO_TC9425_INIT_ANALOG();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_MUTE_OFF();
|
|
|
|
// AudioType Analog
|
|
pHwDevExt->DAck.PCIF_AMUTE2_OFF();
|
|
pHwDevExt->DAck.PCIF_AMUTE_OFF();
|
|
|
|
// NTSC Copy Gaurd
|
|
{
|
|
BOOL ACGstatus;
|
|
|
|
ACGstatus = pHwDevExt->CPgd.CPGD_SET_AGC_CHIP( pHwDevExt->RevID );
|
|
|
|
ASSERTMSG( "\r\n...Analog Copy Guard Error!!", ACGstatus );
|
|
|
|
// NTSC Analog Copy Guard Default Setting for Windows98 Beta 3
|
|
// Aspect Ratio 4:3
|
|
// Letter Box OFF
|
|
// CGMS 3 ( No Copying is permitted )
|
|
// APS 2 ( AGC pulse ON, Burst Inv ON (2line) )
|
|
pHwDevExt->CPgd.CPGD_SET_CGMSnCPGD( 0, 0, 3, 2 );
|
|
}
|
|
|
|
//--- 97.09.23 K.Chujo; Closed Caption
|
|
USCC_on( pHwDevExt );
|
|
//--- End.
|
|
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD:HwInitialize() exit\r\n") );
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
return TRUE;
|
|
}
|