|
|
//***************************************************************************
// 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; }
|