416 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			416 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*******************************************************************
 | |
| *
 | |
| *				 MPINIT.C
 | |
| *
 | |
| *				 Copyright (C) 1995 SGS-THOMSON Microelectronics.
 | |
| *
 | |
| *
 | |
| *				 PORT/MINIPORT Interface init routines
 | |
| *
 | |
| *******************************************************************/
 | |
| 
 | |
| #include "common.h"
 | |
| #include "mpegmini.h"
 | |
| #include "mpinit.h"
 | |
| #include "mpst.h"
 | |
| #include "mpvideo.h"
 | |
| #include "mpaudio.h"
 | |
| #include "mpovrlay.h"
 | |
| #include "debug.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| *		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 Context1, PVOID Context2 )
 | |
| {
 | |
| 
 | |
| 	HW_INITIALIZATION_DATA HwInitData;
 | |
| 	BUSINFO BusInfo;
 | |
| 
 | |
| 	 DebugPrint((DebugLevelVerbose,"ST MPEG2 MiniPort DriverEntry"));
 | |
| 	 MpegPortZeroMemory(&HwInitData, sizeof(HwInitData));
 | |
| 	 HwInitData.HwInitializationDataSize = sizeof(HwInitData);
 | |
| 
 | |
| 	// Entry points for Port Driver
 | |
| 	HwInitData.HwInitialize 	= HwInitialize;
 | |
| 	HwInitData.HwUnInitialize 	= HwUnInitialize;
 | |
| 	HwInitData.HwStartIo 		= HwStartIo;
 | |
| 	HwInitData.HwFindAdapter 	= HwFindAdapter;
 | |
| 	HwInitData.HwInterrupt[VideoDevice]  = HwInterrupt;
 | |
| 
 | |
| 	HwInitData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
 | |
| #if 1
 | |
|    HwInitData.NumberOfAccessRanges = 0x4;
 | |
|    HwInitData.AdapterInterfaceType = PCIBus;
 | |
|    HwInitData.VendorIdLength = 4;
 | |
|    HwInitData.VendorId = "104a";
 | |
|    HwInitData.DeviceIdLength = 4;
 | |
| 	HwInitData.DeviceId = "3520";
 | |
|    HwInitData.NoDynamicRelocation = FALSE;
 | |
| #else
 | |
| 	 mpstDriverEntry(&BusInfo);
 | |
| 	 HwInitData.NumberOfAccessRanges = BusInfo.NumberOfAccessRanges;
 | |
| 	 HwInitData.AdapterInterfaceType = BusInfo.AdapterInterfaceType;
 | |
| 	 HwInitData.VendorIdLength = BusInfo.VendorIdLength;
 | |
| 	 HwInitData.VendorId = BusInfo.VendorId;
 | |
| 	 HwInitData.DeviceIdLength = BusInfo.DeviceIdLength;
 | |
| 	 HwInitData.DeviceId = BusInfo.DeviceId;
 | |
|    HwInitData.NoDynamicRelocation = BusInfo.NoDynamicRelocation;
 | |
| #endif
 | |
| 	 DebugPrint((DebugLevelVerbose,"Exit from DriverEntry"));
 | |
| 	return (MpegPortInitialize(Context1, Context2,&HwInitData, NULL));
 | |
| }
 | |
|          
 | |
| /********************************************************************
 | |
| *		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
 | |
| ********************************************************************/
 | |
| 
 | |
| BOOLEAN HwInitialize (IN PVOID DeviceExtension )
 | |
| {
 | |
| 	PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)DeviceExtension; 		
 | |
| 
 | |
| 	DebugPrint((DebugLevelVerbose,"Entry : HwInitialize()"));
 | |
| 
 | |
| 	mpstHwInitialize (pHwDevExt);
 | |
| 	pHwDevExt->VideoDeviceExt.pCurrentMrb = NULL;
 | |
| 	pHwDevExt->AudioDeviceExt.pCurrentMrb = NULL;
 | |
| 	pHwDevExt->VideoDeviceExt.DeviceState = MpegStatePaused;
 | |
| 	pHwDevExt->AudioDeviceExt.DeviceState = MpegStatePaused;
 | |
| 	DebugPrint((DebugLevelVerbose,"Exit : HwInitialize()"));
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| *		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)
 | |
| {
 | |
| 	DeviceExtension = DeviceExtension;
 | |
| 	mpstHwUnInitialize ();
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| *		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;
 | |
| #ifdef NT
 | |
|    *Again = FALSE; // Only one card is allowed in the system
 | |
|    DEBUG_PRINT((DebugLevelVerbose, "Entry : HwFindAparter()\n"));
 | |
| 	if(ConfigInfo->Length != sizeof(PORT_CONFIGURATION_INFORMATION))
 | |
| 	{
 | |
| 		DEBUG_PRINT((DebugLevelError,"Find Adapter : Different Size!!"));
 | |
| 		return MP_RETURN_BAD_CONFIG;		
 | |
| 	}
 | |
| 
 | |
| 	 ConfigInfo->DmaChannels[VideoDevice].DmaChannel = MP_UNINITIALIZED_VALUE;
 | |
| 	 ConfigInfo->DmaChannels[AudioDevice].DmaChannel = MP_UNINITIALIZED_VALUE;
 | |
| 	 ConfigInfo->DmaChannels[OverlayDevice].DmaChannel = MP_UNINITIALIZED_VALUE;
 | |
| 
 | |
|     if(ConfigInfo->AccessRanges[0].RangeLength == 0){
 | |
|         // IO Base was not specified in the registry
 | |
|         DEBUG_PRINT((DebugLevelError, "FindAdapter: IO Base not specified\n"));
 | |
|         return MP_RETURN_INSUFFICIENT_RESOURCES;
 | |
|     }
 | |
| 
 | |
| //	 DEBUG_PRINT((DebugLevelVerbose,"3520 Address Physical = %lx\n", ConfigInfo->AccessRanges[2].RangeStart));
 | |
| //	 DEBUG_PRINT((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 ;
 | |
| 	 DEBUG_PRINT((DebugLevelVerbose,"3520 Base Address = %lx\n", ioAddress));
 | |
| 
 | |
|     if( (ConfigInfo->Interrupts[VideoDevice].BusInterruptLevel == MP_UNINITIALIZED_VALUE) &&
 | |
|         (ConfigInfo->Interrupts[AudioDevice].BusInterruptLevel == MP_UNINITIALIZED_VALUE) &&
 | |
|         (ConfigInfo->Interrupts[OverlayDevice].BusInterruptLevel == MP_UNINITIALIZED_VALUE)){
 | |
|         DEBUG_PRINT((DebugLevelError, "FindAdapter: Interrupt not specfied correctly\n"));
 | |
|         return MP_RETURN_INVALID_INTERRUPT;
 | |
|     }
 | |
| 
 | |
|     IrqLevel = ConfigInfo->Interrupts[VideoDevice].BusInterruptLevel;
 | |
| 	 DEBUG_PRINT((DebugLevelVerbose,"Video Interrupt = %lx\n", IrqLevel));
 | |
| 
 | |
| //    ConfigInfo->Interrupts[AudioDevice].BusInterruptLevel = IrqLevel;
 | |
| //    ConfigInfo->Interrupts[OverlayDevice].BusInterruptLevel = IrqLevel;
 | |
|     ioBase = MpegPortGetDeviceBase(
 | |
|                     pHwDevExt,                  // HwDeviceExtension
 | |
|                     ConfigInfo->AdapterInterfaceType,   // AdapterInterfaceType
 | |
|                     ConfigInfo->SystemIoBusNumber,      // SystemIoBusNumber
 | |
|                     ConfigInfo->AccessRanges[0].RangeStart,
 | |
|                     0x4,                    // NumberOfBytes
 | |
|                     TRUE                   // InIoSpace - Memory mapped
 | |
|                     );
 | |
| 
 | |
|   DEBUG_PRINT((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
 | |
|                     );
 | |
| 
 | |
|   DEBUG_PRINT((DebugLevelVerbose,"PCI9060 Address = %lx\n", ioBase));
 | |
| 
 | |
| 	pHwDevExt->ioBasePCI9060 = ioBase;
 | |
| 	pHwDevExt->Irq	= IrqLevel;
 | |
| #else
 | |
| 	BOARDINFO BoardInfo;
 | |
| 	*Again = FALSE;
 | |
| 	DeviceExtension = DeviceExtension;
 | |
| 	ConfigInfo = ConfigInfo;
 | |
| 	HwContext = HwContext;
 | |
| 	BusInformation = BusInformation;
 | |
| 	ArgString = ArgString;
 | |
| 
 | |
| 	mpstHwFindAdaptor(&BoardInfo);
 | |
| 	pHwDevExt->ioBaseLocal		= BoardInfo.ioBaseLocal;
 | |
| 	pHwDevExt->ioBasePCI9060	= BoardInfo.ioBasePCI9060;
 | |
| 	pHwDevExt->Irq	= BoardInfo.Irq;
 | |
| #endif
 | |
| 	pHwDevExt->VideoDeviceExt.videoSTC = 0;
 | |
| 	pHwDevExt->AudioDeviceExt.audioSTC = 0;
 | |
| 	pHwDevExt->AudioDeviceExt.pCurrentMrb = NULL;
 | |
| 	pHwDevExt->VideoDeviceExt.pCurrentMrb = NULL;
 | |
| 	pHwDevExt->VideoDeviceExt.DeviceState = MpegStateStartup;
 | |
| 	pHwDevExt->AudioDeviceExt.DeviceState = MpegStateStartup;
 | |
| 	pHwDevExt->AudioDeviceExt.pCurrentMrb = NULL;
 | |
| 	pHwDevExt->VideoDeviceExt.pCurrentMrb = NULL;
 | |
| 	 DebugPrint((DebugLevelVerbose, "Exit : HwFindAparter()"));
 | |
| 
 | |
| 	return MP_RETURN_FOUND;
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| /********************************************************************
 | |
| *		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;
 | |
| 	pDeviceExtension = pDeviceExtension;
 | |
| 	bRetValue = mpstHwInterrupt ();
 | |
| 	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, 
 | |
| 				PMPEG_REQUEST_BLOCK pMrb
 | |
| 				)
 | |
| {
 | |
| 	pMrb->Status = MrbStatusSuccess;
 | |
| 	switch (pMrb->Command)
 | |
| 	{
 | |
| 		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 MrbCommandOverlayEnable	:
 | |
| 					miniPortVideoEnable(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 			  break;
 | |
| 
 | |
| 		case MrbCommandOverlayDisable	:
 | |
| 					miniPortVideoDisable(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 MrbCommandAudioGetAttribute			:
 | |
| 					miniPortAudioGetAttribute (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 			
 | |
| 
 | |
| 		case MrbCommandVideoGetAttribute			:
 | |
| 					miniPortVideoGetAttribute (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandOverlayGetAttribute		:
 | |
| 					miniPortOverlayGetAttribute (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandOverlayGetDestination 	:
 | |
| 					miniPortOverlayGetDestination(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandOverlayGetMode				:
 | |
| 					miniPortOverlayGetMode(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandAudioGetStc					:
 | |
| 					miniPortAudioGetStc(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandVideoGetStc					:
 | |
| 					miniPortVideoGetStc(pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandOverlayGetVgaKey			:
 | |
| 					miniPortOverlayGetVgaKey(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 MrbCommandAudioQueryInfo				:
 | |
| 					miniPortAudioQueryInfo (pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandVideoQueryInfo				:
 | |
| 					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 MrbCommandAudioSetAttribute			:
 | |
| 					miniPortAudioSetAttribute ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandOverlaySetAttribute 		:
 | |
| 					miniPortOverlaySetAttribute ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandOverlaySetBitMask	 		:
 | |
| 					miniPortOverlaySetBitMask ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandOverlaySetDestination 	:
 | |
| 					miniPortOverlaySetDestination ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandOverlaySetMode				:
 | |
| 					miniPortOverlaySetMode ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandAudioSetStc					:
 | |
| 					miniPortAudioSetStc ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandVideoSetStc					:
 | |
| 					miniPortVideoSetStc ( pMrb, (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 		case MrbCommandOverlaySetVgaKey			:
 | |
| 					miniPortOverlaySetVgaKey ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandAudioStop					:
 | |
| 					miniPortAudioStop( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandVideoStop					:
 | |
| 					miniPortVideoStop( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 
 | |
| 		case MrbCommandOverlayUpdateClut			:
 | |
| 					miniPortOverlayUpdateClut ( pMrb , (PHW_DEVICE_EXTENSION)DeviceExtension);
 | |
| 				break;
 | |
| 	}
 | |
| 	return TRUE;
 | |
| }
 | |
| #ifdef NT
 | |
| VOID HostDisableIT(VOID)
 | |
| {
 | |
| 		// Has to be implemented !! - JBS
 | |
| }
 | |
| 
 | |
| VOID HostEnableIT(VOID)
 | |
| {
 | |
| 		// Has to be implemented !! - JBS
 | |
| 
 | |
| }	
 | |
| #endif
 | |
| 
 |