windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/jbs/mpinit.c
2020-09-26 16:20:57 +08:00

1140 lines
27 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*******************************************************************
*
* MPINIT.C
*
* Copyright (C) 1995 SGS-THOMSON Microelectronics.
*
*
* PORT/MINIPORT Interface init routines
*
*******************************************************************/
#include "common.h"
#include "strmini.h"
#include <ntddk.h>
#include <windef.h>
#include "ksguid.h"
#include "uuids.h"
#include "mpeg2ids.h"
#include "mpinit.h"
#include "mpst.h"
#include "mpvideo.h"
#include "mpaudio.h"
#include "debug.h"
#include "mpegprop.h"
#include "mpegguid.h"
#include "dmpeg.h"
#define DMA_BUFFER_SIZE 8192
// Few globals here, should be put in the
// structure
BOOL bInitialized = FALSE;
VOID STREAMAPI StreamReceiveAudioPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb);
VOID DummyTime(PHW_DEVICE_EXTENSION de);
VOID DummyHigh(PHW_DEVICE_EXTENSION de);
VOID DummyLow(PHW_DEVICE_EXTENSION de);
/********************************************************************
* Function Name : DriverEntry
* Args : Context1 and Context2
* Returns : Return of MpegPortInitialize
* Purpose : Entry Point into the MINIPORT Driver.
*
* Revision History : Last modified on 25/8/95 by JBS
********************************************************************/
ULONG DriverEntry ( PVOID Arg1, PVOID Arg2 )
{
HW_INITIALIZATION_DATA HwInitData;
DebugPrint((DebugLevelVerbose,"ST MPEG2 MiniDriver DriverEntry"));
// MpegPortZeroMemory(&HwInitData, sizeof(HwInitData));
HwInitData.HwInitializationDataSize = sizeof(HwInitData);
//
// Entry points for Port Driver
//
HwInitData.HwUnInitialize = HwUnInitialize;
HwInitData.HwInterrupt = HwInterrupt;
HwInitData.HwReceivePacket = AdapterReceivePacket;
HwInitData.HwCancelPacket = AdapterCancelPacket;
HwInitData.HwRequestTimeoutHandler = AdapterTimeoutPacket;
HwInitData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
HwInitData.PerRequestExtensionSize = sizeof(MRP_EXTENSION);
HwInitData.FilterInstanceExtensionSize = 0;
HwInitData.PerStreamExtensionSize = sizeof(STREAMEX); // random size for code testing
HwInitData.BusMasterDMA = FALSE;
HwInitData.Dma24BitAddresses = FALSE;
HwInitData.BufferAlignment = 3;
HwInitData.TurnOffSynchronization = FALSE;
HwInitData.DmaBufferSize = DMA_BUFFER_SIZE;
DebugPrint((DebugLevelVerbose,"SGS: call to portinitialize"));
return (StreamClassRegisterAdapter(Arg1, Arg2,&HwInitData));
}
VOID AdapterCancelPacket(PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevex = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
BOOL fRestart = FALSE; // determines whether this requires a restart
BOOL fReset = FALSE; // indicates we need to reset the device
PHW_STREAM_REQUEST_BLOCK pSrbTmp;
//
// need to find this packet, pull it off our queues, and cancel it
//
if (pdevex->pCurSrb == pSrb)
{
pdevex->pCurSrb = NULL;
fRestart = TRUE;
}
//
// look for it in the main device queues
//
for (pSrbTmp = CONTAINING_RECORD((&(pdevex->pSrbQ)),
HW_STREAM_REQUEST_BLOCK, NextSRB);
pSrbTmp->NextSRB && pSrbTmp->NextSRB != pSrb;
pSrbTmp = pSrbTmp->NextSRB);
if (pSrbTmp->NextSRB ==pSrb)
{
TRAP
pSrbTmp->NextSRB == pSrb->NextSRB;
}
if (pdevex->VideoDeviceExt.pCurrentSRB == pSrb)
{
StreamClassScheduleTimer(pSrb->StreamObject, pdevex,
0, VideoPacketStub, pSrb->StreamObject);
pdevex->VideoDeviceExt.pCurrentSRB = NULL;
//
// cancel the video timer
//
fRestart = TRUE;
fReset = TRUE;
}
if (pdevex->AudioDeviceExt.pCurrentSRB == pSrb)
{
TRAP
pdevex->AudioDeviceExt.pCurrentSRB = NULL;
fRestart = TRUE;
}
if (fReset)
{
miniPortVideoReset(pSrb, pSrb->HwDeviceExtension);
}
pSrb->Status = STATUS_CANCELLED;
switch (pSrb->Flags & (SRB_HW_FLAGS_DATA_TRANSFER |
SRB_HW_FLAGS_STREAM_REQUEST))
{
//
// find all stream commands, and do stream notifications
//
case SRB_HW_FLAGS_STREAM_REQUEST | SRB_HW_FLAGS_DATA_TRANSFER:
StreamClassStreamNotification(ReadyForNextStreamDataRequest,
pSrb->StreamObject);
StreamClassStreamNotification(StreamRequestComplete,
pSrb->StreamObject,
pSrb);
break;
case SRB_HW_FLAGS_STREAM_REQUEST:
TRAP
mpstCtrlCommandComplete(pSrb);
break;
default:
//
// must be a device request
//
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
}
if (fRestart)
{
StreamStartCommand(pdevex);
}
}
VOID AdapterTimeoutPacket(PHW_STREAM_REQUEST_BLOCK pSrb)
{
//
// if we timeout while playing, then we need to consider this
// condition an error, and reset the hardware, and reset everything
//
TRAP
//
// if we are not playing, and this is a CTRL request, we still
// need to reset everything
//
}
VOID AdapterOpenStream(PHW_STREAM_REQUEST_BLOCK pSrb)
{
PSTREAMEX strm = (PSTREAMEX)pSrb->StreamObject->HwStreamExtension;
//
// for now, just return success
//
pSrb->Status = STATUS_SUCCESS;
switch (pSrb->StreamObject->StreamNumber)
{
case 0:
//
// this is the video stream
//
strm->pfnWriteData = (PFN_WRITE_DATA)miniPortVideoPacket;
strm->pfnSetState = (PFN_WRITE_DATA)miniPortSetState;
strm->pfnGetProp = (PFN_WRITE_DATA)miniPortGetProperty;
pSrb->StreamObject->ReceiveDataPacket = (PVOID)StreamReceiveDataPacket;
break;
case 1:
//
// this is the audio stream
//
strm->pfnWriteData = (PFN_WRITE_DATA)miniPortAudioPacket;
pSrb->StreamObject->ReceiveDataPacket = (PVOID)StreamReceiveAudioPacket;
strm->pfnSetState = (PFN_WRITE_DATA)miniPortAudioSetState;
strm->pfnGetProp = (PFN_WRITE_DATA)miniPortAudioGetProperty;
break;
default:
TRAP
pSrb->Status = STATUS_NOT_IMPLEMENTED;
}
pSrb->StreamObject->ReceiveControlPacket = (PVOID)StreamReceiveCtrlPacket;
//pSrb->StreamObject->Dma = FALSE;
pSrb->StreamObject->Pio = TRUE;
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
/*
//
// switch on GUID
//
default:
//
// we don't own this GUID, so just fail the open stream
// call
//
*/
}
VOID STREAMAPI AdapterReceivePacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
//
// determine the type of packet.
//
switch (pSrb->Command)
{
case SRB_OPEN_STREAM:
AdapterOpenStream(pSrb);
break;
case SRB_GET_STREAM_INFO:
AdapterStreamInfo(pSrb);
break;
case SRB_INITIALIZE_DEVICE:
HwInitialize(pSrb);
break;
case SRB_TURN_POWER_ON:
case SRB_TURN_POWER_OFF:
pSrb->Status = STATUS_SUCCESS;
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
break;
default:
TRAP
pSrb->Status = STATUS_NOT_SUPPORTED;
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
}
/*
//
// switch on GUID
//
default:
//
// we don't own this GUID, so just fail the open stream
// call
//
*/
}
KSDATAFORMAT hwfmtiMpeg2Vid
= {
sizeof (KSDATAFORMAT),
0,
{0xe06d8020, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea},
//MEDIATYPE_MPEG2_PES,
// MEDIASUBTYPE_MPEG2_VIDEO,
{0xe06d8026, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea},
//FORMAT_MPEG2Video,
{0xe06d80e3, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea}
};
KSDATAFORMAT hwfmtiMpeg2Aud
= {
sizeof (KSDATAFORMAT),
0,
//MEDIATYPE_MPEG2_PES,
{0xe06d8020, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea},
//MEDIASUBTYPE_DOLBY_AC3_AUDIO,
{0xe06d802c, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x05f, 0x6c, 0xbb, 0xea},
//FORMAT_WaveFormatEx
{0x05589f81, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x000, 0x55, 0x59, 0x5a},
};
KSDATAFORMAT hwfmtiMpeg2Out;
/* = {
};
*/
static const KSPROPERTY_ITEM mpegVidPropItm[]={
{0,
TRUE,
sizeof (KSPROPERTY),
sizeof (BUF_LVL_DATA),
FALSE,
0,
0,
NULL,
0,
NULL
}};
static const KSPROPERTY_SET mpegVidPropSet[] = {
&KSPROPSETID_Mpeg2Vid,
SIZEOF_ARRAY(mpegVidPropItm),
(PKSPROPERTY_ITEM)mpegVidPropItm
};
VOID AdapterStreamInfo(PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
PHW_STREAM_INFORMATION pstrinfo = &(pSrb->CommandData.StreamBuffer->StreamInfo);
PBOOLEAN RelatedStreams;
ULONG ulTmp;
pSrb->CommandData.StreamBuffer->StreamHeader.NumberOfStreams = 3;
//
// set up the stream info structures for the MPEG2 video
//
pstrinfo->NumberOfPossibleInstances = 1;
pstrinfo->DataFlow = KSPIN_DATAFLOW_IN;
pstrinfo->DataAccessible = TRUE;
pstrinfo->FormatInfo = &hwfmtiMpeg2Vid;
RelatedStreams = (PBOOLEAN) (pstrinfo+
pSrb->CommandData.StreamBuffer->StreamHeader.NumberOfStreams);
pstrinfo->RelatedStreams = RelatedStreams;
RelatedStreams[0] = TRUE; // related to self
RelatedStreams[1] = FALSE;
RelatedStreams[2] = TRUE;
RelatedStreams += 4;
//
// set the property information
//
pstrinfo->NumStreamPropArrayEntries = 0;
pstrinfo->StreamPropertiesArray = mpegVidPropSet;
pstrinfo++;
//
// set up the stream info structures for the MPEG2 audio
//
pstrinfo->NumberOfPossibleInstances = 1;
pstrinfo->DataFlow = KSPIN_DATAFLOW_IN;
pstrinfo->DataAccessible = TRUE;
pstrinfo->FormatInfo = &hwfmtiMpeg2Aud;
pstrinfo->RelatedStreams = RelatedStreams;
pstrinfo->RelatedStreams[0] = FALSE;
pstrinfo->RelatedStreams[1] = TRUE; // related to self
pstrinfo->RelatedStreams[2] = TRUE;
RelatedStreams += 4;
pstrinfo++;
//
// set up the stream info structures for the MPEG2 NTSC stream
//
pstrinfo->NumberOfPossibleInstances = 1;
pstrinfo->DataFlow = KSPIN_DATAFLOW_OUT;
pstrinfo->DataAccessible = FALSE;
pstrinfo->FormatInfo = &hwfmtiMpeg2Out;
pstrinfo->RelatedStreams = RelatedStreams;
pstrinfo->RelatedStreams[0] = TRUE;
pstrinfo->RelatedStreams[1] = TRUE;
pstrinfo->RelatedStreams[2] = TRUE; // related to self
pSrb->Status = STATUS_SUCCESS;
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
}
VOID STREAMAPI StreamReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
// DEBUG_ASSERT(pdevext);
//
// determine the type of packet.
//
switch (pSrb->Command)
{
case SRB_WRITE_DATA:
//
// put it on the queue, and start dequeing if necessary
//
Enqueue(pSrb, pdevext);
if (!pdevext->pCurSrb)
{
StreamStartCommand(pdevext);
}
break;
default:
//
// invalid / unsupported command. Fail it as such
//
TRAP
pSrb->Status = STATUS_NOT_IMPLEMENTED;
StreamClassStreamNotification(ReadyForNextStreamDataRequest,
pSrb->StreamObject);
StreamClassStreamNotification(StreamRequestComplete,
pSrb->StreamObject,
pSrb);
}
}
VOID STREAMAPI StreamReceiveAudioPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
//
// determine the type of packet.
//
pSrb->Status = STATUS_SUCCESS;
((PSTREAMEX)pSrb->StreamObject->HwStreamExtension)
->pfnWriteData(pSrb);
}
VOID STREAMAPI StreamReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
// DEBUG_ASSERT(pdevext);
//
// determine the type of packet.
//
switch (pSrb->Command)
{
case SRB_SET_STREAM_STATE:
((PSTREAMEX)pSrb->StreamObject->HwStreamExtension)
->pfnSetState(pSrb);
break;
case SRB_GET_STREAM_PROPERTY:
((PSTREAMEX)pSrb->StreamObject->HwStreamExtension)
->pfnGetProp(pSrb);
break;
default:
//
// invalid / unsupported command. Fail it as such
//
TRAP
pSrb->Status = STATUS_NOT_IMPLEMENTED;
mpstCtrlCommandComplete(pSrb);
}
}
VOID mpstCtrlCommandComplete(PHW_STREAM_REQUEST_BLOCK pSrb)
{
StreamClassStreamNotification(
ReadyForNextStreamControlRequest,
pSrb->StreamObject);
StreamClassStreamNotification(StreamRequestComplete,
pSrb->StreamObject,
pSrb);
}
#if 0
VOID STREAMAPI StreamReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
PHW_DEVICE_EXTENSION pdevext =
((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
DEBUG_ASSERT(pdevext);
// determine the type of packet.
//
switch (pSrb->Command)
{
case SRB_WRITE_DATA:
case SRB_SET_STREAM_STATE:
//
// put it on the queue, and start dequeing if necessary
//
Enqueue(pSrb, pdevext);
if (!pdevext->pCurSrb)
{
StreamStartCommand(pdevext);
}
break;
default:
//
// invalid / unsupported command. Fail it as such
//
TRAP
pSrb->Status = STATUS_NOT_IMPLEMENTED;
StreamClassStreamNotification(ReadyForNextStreamRequest,
pSrb->StreamObject);
StreamClassStreamNotification(StreamRequestComplete,
pSrb->StreamObject,
pSrb);
}
/*
//
// switch on GUID
//
default:
//
// we don't own this GUID, so just fail the open stream
// call
//
*/
}
#endif
void Enqueue (PHW_STREAM_REQUEST_BLOCK pSrb,
PHW_DEVICE_EXTENSION pdevext)
{
PHW_STREAM_REQUEST_BLOCK pSrbTmp;
//
// enqueue the given SRB on the device extension queue
//
for (pSrbTmp = CONTAINING_RECORD((&(pdevext->pSrbQ)),
HW_STREAM_REQUEST_BLOCK, NextSRB);
pSrbTmp->NextSRB;
pSrbTmp = pSrbTmp->NextSRB);
pSrbTmp->NextSRB = pSrb;
pSrb->NextSRB = NULL;
}
PHW_STREAM_REQUEST_BLOCK Dequeue(PHW_DEVICE_EXTENSION pdevext)
{
PHW_STREAM_REQUEST_BLOCK pRet = NULL;
if (pdevext->pSrbQ)
{
pRet = pdevext->pSrbQ;
pdevext->pSrbQ = pRet->NextSRB;
}
return(pRet);
}
VOID StreamStartCommand (PHW_DEVICE_EXTENSION pdevext)
{
PHW_STREAM_REQUEST_BLOCK pSrb;
//
// See if there is something to dequeue
//
if (!(pSrb=Dequeue(pdevext)))
{
return;
}
pdevext->pCurSrb = pSrb;
switch (pSrb->Command)
{
case SRB_WRITE_DATA:
((PSTREAMEX)pSrb->StreamObject->HwStreamExtension)
->pfnWriteData(pSrb);
break;
default:
TRAP
}
}
VOID AdapterCloseStream(PHW_STREAM_REQUEST_BLOCK pSrb)
{
DEBUG_BREAKPOINT();
/*
//
// switch on GUID
//
default:
//
// we don't own this GUID, so just fail the open stream
// call
//
*/
}
/********************************************************************
* Function Name : HwInitialize
* Args : Pointer to Device Ext.
* Returns : TRUE if sucessful, FALSE otherwise
* Purpose : Initialize the Board, Setup IRQ, Initialize the
* Control and Card structures.
*
* Revision History : Last modified on 19/8/95 by JBS
********************************************************************/
NTSTATUS HwInitialize (
IN PHW_STREAM_REQUEST_BLOCK pSrb)
{
NTSTATUS Stat;
STREAM_PHYSICAL_ADDRESS adr;
ULONG Size;
ULONG i;
PUCHAR pDmaBuf;
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
PHW_DEVICE_EXTENSION pHwDevExt =
(PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
DebugPrint((DebugLevelVerbose,"Entry : HwInitialize()\n"));
bInitialized = TRUE;
if (ConfigInfo->NumberOfAccessRanges < 1)
{
DebugPrint((DebugLevelVerbose,"ST3520: illegal config info"));
pSrb->Status = STATUS_NO_SUCH_DEVICE;
goto exit;
}
//
// testing only !!!!
//
StreamClassCallAtNewPriority(NULL, pHwDevExt, Low, DummyLow, pHwDevExt);
StreamClassScheduleTimer(NULL, pHwDevExt, 1*1000*1000, DummyTime, pHwDevExt);
DebugPrint((DebugLevelVerbose, "No of access ranges = %lx", ConfigInfo->NumberOfAccessRanges));
pHwDevExt->ioBaseLocal = (PUSHORT)(ConfigInfo->AccessRanges[0].RangeStart.LowPart);
DebugPrint((DebugLevelVerbose, "Memory Range = %lx\n", pHwDevExt->ioBaseLocal));
DebugPrint((DebugLevelVerbose, "IRQ = %lx\n", ConfigInfo->BusInterruptLevel));
pHwDevExt->Irq = (USHORT)(ConfigInfo->BusInterruptLevel);
pHwDevExt->VideoDeviceExt.videoSTC = 0;
pHwDevExt->AudioDeviceExt.audioSTC = 0;
pHwDevExt->AudioDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.DeviceState = -1;
pHwDevExt->AudioDeviceExt.DeviceState = -1;
pHwDevExt->AudioDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.pCurrentSRB = NULL;
pHwDevExt->AudioDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.DeviceState = KSSTATE_PAUSE;
pHwDevExt->AudioDeviceExt.DeviceState = KSSTATE_PAUSE;
ConfigInfo->StreamDescriptorSize = 3 * (sizeof (HW_STREAM_INFORMATION) +
4 * sizeof (BOOLEAN)) + sizeof (HW_STREAM_HEADER);
Stat = STATUS_SUCCESS;
pDmaBuf = StreamClassGetDmaBuffer(pHwDevExt);
adr = StreamClassGetPhysicalAddress(pHwDevExt, NULL, pDmaBuf, DmaBuffer, &Size);
if(dmpgOpen((ULONG)(pHwDevExt->ioBaseLocal), pDmaBuf, (ULONG)(adr.LowPart)))
Stat = STATUS_SUCCESS;
else
Stat = STATUS_NO_SUCH_DEVICE;
DebugPrint((DebugLevelVerbose,"Exit : HwInitialize()\n"));
pSrb->Status = Stat;
exit:
StreamClassDeviceNotification(ReadyForNextDeviceRequest,
pSrb->HwDeviceExtension);
StreamClassDeviceNotification(DeviceRequestComplete,
pSrb->HwDeviceExtension,
pSrb);
}
VOID DummyLow(PHW_DEVICE_EXTENSION pHwDevEx)
{
ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);
StreamClassCallAtNewPriority(NULL, pHwDevEx, LowToHigh, DummyHigh, pHwDevEx);
}
VOID DummyHigh(PHW_DEVICE_EXTENSION de)
{
ASSERT(KeGetCurrentIrql() > DISPATCH_LEVEL);
DebugPrint((DebugLevelError,"Went from Low to High!!!"));
}
VOID DummyTime(PHW_DEVICE_EXTENSION de)
{
ASSERT(KeGetCurrentIrql() > DISPATCH_LEVEL);
DebugPrint((DebugLevelError,"Timer fired!!!"));
}
/********************************************************************
* Function Name : HwUnInitialize
* Args : Pointer to Device Ext.
* Returns : TRUE if sucessful, FALSE otherwise
* Purpose : Uninitialize the H/W and data initialized
* by HwInitialize Function
*
* Revision History : Last modified on 15/7/95 JBS
********************************************************************/
BOOLEAN HwUnInitialize ( IN PVOID DeviceExtension)
{
dmpgClose();
return TRUE;
}
#if 0
/********************************************************************
* Function Name : HwFindAdapter
* Args : Pointer to Device Ext, Bus Information, ArgString,
* port configuration information, Again
* Returns : MP_FOUND, NOT FOUND OR ERROR
* Purpose : Finds the H/W Adapter on the system
*
* Revision History : Last modified on 15/7/95 by JBS
********************************************************************/
MP_RETURN_CODES HwFindAdapter (
IN PVOID DeviceExtension,
IN PVOID HwContext,
IN PVOID BusInformation,
IN PCHAR ArgString,
IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
OUT PBOOLEAN Again
)
{
// Code to find the adapter has to be added. - JBS
ULONG ioAddress;
ULONG IrqLevel; // Temp code to be put in HW_DEV_EXT
PUSHORT ioBase;
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)DeviceExtension;
*Again = FALSE; // Only one card is allowed in the system
DebugPrint((DebugLevelVerbose, "Entry : HwFindAparter()\n"));
if(ConfigInfo->Length != sizeof(PORT_CONFIGURATION_INFORMATION))
{
DebugPrint((DebugLevelError,"Find Adapter : Different Size!!"));
return MP_RETURN_BAD_CONFIG;
}
ConfigInfo->DmaChannels[VideoDevice].DmaChannel = MP_UNINITIALIZED_VALUE;
ConfigInfo->DmaChannels[AudioDevice].DmaChannel = MP_UNINITIALIZED_VALUE;
if(ConfigInfo->AccessRanges[0].RangeLength == 0){
// IO Base was not specified in the registry
DebugPrint((DebugLevelError, "FindAdapter: IO Base not specified\n"));
return MP_RETURN_INSUFFICIENT_RESOURCES;
}
// DebugPrint((DebugLevelVerbose,"3520 Address Physical = %lx\n", ConfigInfo->AccessRanges[2].RangeStart));
// DebugPrint((DebugLevelVerbose,"PCI9060 Address Physical = %lx\n", ConfigInfo->AccessRanges[1].RangeStart));
ioAddress = MPEG_PORT_CONVERT_PHYSICAL_ADDRESS_TO_ULONG(
ConfigInfo->AccessRanges[2].RangeStart
);
ConfigInfo->AccessRanges[0].RangeStart = ConfigInfo->AccessRanges[2].RangeStart ;
DebugPrint((DebugLevelVerbose,"3520 Base Address = %lx\n", ioAddress));
if( (ConfigInfo->Interrupts[VideoDevice].BusInterruptLevel == MP_UNINITIALIZED_VALUE) &&
(ConfigInfo->Interrupts[AudioDevice].BusInterruptLevel == MP_UNINITIALIZED_VALUE) &&
DebugPrint((DebugLevelError, "FindAdapter: Interrupt not specfied correctly\n"));
return MP_RETURN_INVALID_INTERRUPT;
}
IrqLevel = ConfigInfo->Interrupts[VideoDevice].BusInterruptLevel;
DebugPrint((DebugLevelVerbose,"Video Interrupt = %lx\n", IrqLevel));
// ConfigInfo->Interrupts[AudioDevice].BusInterruptLevel = IrqLevel;
ioBase = MpegPortGetDeviceBase(
pHwDevExt, // HwDeviceExtension
ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
ConfigInfo->AccessRanges[0].RangeStart,
0x4, // NumberOfBytes
TRUE // InIoSpace - Memory mapped
);
DebugPrint((DebugLevelVerbose,"3520 Base Address = %lx\n", ioBase));
pHwDevExt->ioBaseLocal = ioBase;
ioBase = MpegPortGetDeviceBase(
pHwDevExt, // HwDeviceExtension
ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType
ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber
ConfigInfo->AccessRanges[1].RangeStart,
0x4, // NumberOfBytes
TRUE // InIoSpace - Memory mapped
);
DebugPrint((DebugLevelVerbose,"PCI9060 Address = %lx\n", ioBase));
pHwDevExt->ioBasePCI9060 = ioBase;
pHwDevExt->Irq = IrqLevel;
pHwDevExt->VideoDeviceExt.videoSTC = 0;
pHwDevExt->AudioDeviceExt.audioSTC = 0;
pHwDevExt->AudioDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.DeviceState = -1;
pHwDevExt->AudioDeviceExt.DeviceState = -1;
pHwDevExt->AudioDeviceExt.pCurrentSRB = NULL;
pHwDevExt->VideoDeviceExt.pCurrentSRB = NULL;
DebugPrint((DebugLevelVerbose, "Exit : HwFindAparter()"));
return MP_RETURN_FOUND;
}
#endif
/********************************************************************
* Function Name : HwInterrupt
* Args : Pointer to Device Ext.
* Returns : TRUE or FALSE
* Purpose : Called by port driver if there is an interrupt
* on the IRQ line. Must return False if it does not
* Processes the interrupt
*
* Revision History : Last modified on 15/7/95 by JBS
********************************************************************/
BOOLEAN HwInterrupt ( IN PVOID pDeviceExtension )
{
// Call the interrupt handler should check if the interrupt belongs to
BOOLEAN bRetValue;
if(!bInitialized)
return FALSE;
bRetValue = dmpgInterrupt();
return bRetValue;
}
/********************************************************************
* Function Name : HwStartIo
* Args : Pointer to Device Ext, Mini-Port Request Block (MRB)
* Returns : TRUE or FALSE
* Purpose : Main fuction which accepts the MRBs from port Driver
* Port driver calls this function for all the commands
* it wants to execute
*
* Revision History : Last modified on 15/7/95 JBS
********************************************************************/
BOOLEAN HwStartIo (
IN PVOID DeviceExtension,
PHW_STREAM_REQUEST_BLOCK pMrb
)
{
pMrb->Status = STATUS_SUCCESS;
switch (pMrb->Command)
{
#if 0
case MrbCommandAudioCancel :
miniPortCancelAudio(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoCancel :
miniPortCancelVideo(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoClearBuffer :
miniPortClearVideoBuffer(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioEndOfStream :
miniPortAudioEndOfStream(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoEndOfStream :
miniPortVideoEndOfStream(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioGetProperty :
miniPortAudioGetAttribute (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoGetProperty :
miniPortVideoGetAttribute (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioGetOnboardClock :
miniPortAudioGetStc(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoGetOnboardClock :
miniPortVideoGetStc(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioPacket :
miniPortAudioPacket(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoPacket :
miniPortVideoPacket(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioPause :
miniPortAudioPause(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoPause :
miniPortVideoPause(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioPlay :
miniPortAudioPlay(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoPlay :
miniPortVideoPlay(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioQueryDevice :
miniPortAudioQueryInfo (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoQueryDevice :
miniPortVideoQueryInfo (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioReset :
miniPortAudioReset (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoReset :
miniPortVideoReset (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioSetProperty :
miniPortAudioSetAttribute ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioUpdateOnboardClock :
miniPortAudioSetStc ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoUpdateOnboardClock :
miniPortVideoSetStc ( pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandAudioStop :
miniPortAudioStop( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
case MrbCommandVideoStop :
miniPortVideoStop( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
break;
#endif
}
return TRUE;
}
VOID HostDisableIT(VOID)
{
// Has to be implemented !! - JBS
}
VOID HostEnableIT(VOID)
{
// Has to be implemented !! - JBS
}