windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/toshiba/dvdinit.cpp
2020-09-26 16:20:57 +08:00

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