mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.0 KiB
165 lines
4.0 KiB
/******************************************************************************\
|
|
* *
|
|
* Streaming.C - Hardware abstraction level library. *
|
|
* *
|
|
* Copyright (c) C-Cube Microsystems 1998 *
|
|
* All Rights Reserved. *
|
|
* *
|
|
* Use of C-Cube Microsystems code is governed by terms and conditions *
|
|
* stated in the accompanying licensing statement. *
|
|
* *
|
|
\******************************************************************************/
|
|
|
|
#include "headers.h"
|
|
#include "bmaster.h"
|
|
#include "cl6100.h"
|
|
#include "Hwif.h"
|
|
#include "boardio.h"
|
|
|
|
|
|
|
|
BOOL IsThereDataToSend(PHW_STREAM_REQUEST_BLOCK pSrb,DWORD dwPageToSend,DWORD dwCurrentSample)
|
|
{
|
|
PKSSCATTER_GATHER pSGList;
|
|
DWORD dwCount;
|
|
|
|
if( (pSGList = pSrb->ScatterGatherBuffer) && (dwCount = pSGList[dwPageToSend].Length) )
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void XferData(PHW_STREAM_REQUEST_BLOCK pSrb,PHW_DEVICE_EXTENSION pHwDevExt,DWORD dwPageToSend,
|
|
DWORD dwCurrentSample)
|
|
{
|
|
PKSSCATTER_GATHER pSGList;
|
|
DWORD dwCount;
|
|
|
|
if( (pSGList = pSrb->ScatterGatherBuffer) && (dwCount = pSGList[dwPageToSend].Length) )
|
|
{
|
|
IssuePendingCommands(pHwDevExt);
|
|
if( (dwCount )&& (dwCount <= 2048) )
|
|
{
|
|
DWORD* pdwPhysAddress = (DWORD*)pSGList[dwPageToSend].PhysicalAddress.LowPart;
|
|
// Fire the data
|
|
|
|
|
|
if(pSrb == pHwDevExt->pCurrentVideoSrb)
|
|
{
|
|
pHwDevExt->dwVideoDataUsed -= dwCount;
|
|
}
|
|
else if(pSrb == pHwDevExt->pCurrentAudioSrb)
|
|
{
|
|
pHwDevExt->dwAudioDataUsed -= dwCount;
|
|
}
|
|
else if(pSrb == pHwDevExt->pCurrentSubPictureSrb)
|
|
{
|
|
pHwDevExt->dwSubPictureDataUsed -= dwCount;
|
|
}
|
|
|
|
|
|
if( !BMA_Send( pdwPhysAddress, dwCount ) )
|
|
MonoOutStr("ZiVA: !!!! BMA_Send() has failed\n" );
|
|
else
|
|
{
|
|
PKSSTREAM_HEADER pHeader;
|
|
pHeader = (PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray)+
|
|
dwCurrentSample;
|
|
|
|
|
|
pHwDevExt->bInterruptPending = TRUE;
|
|
//tmp MonoOutULong(pHeader->TypeSpecificFlags >> 16);
|
|
//tmp MonoOutStr("(");
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MonoOutStr("dwCount is 0");
|
|
FinishCurrentPacketAndSendNextOne( pHwDevExt );
|
|
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MonoOutStr("NoDataToSend");
|
|
FinishCurrentPacketAndSendNextOne( pHwDevExt );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
** HwInterrupt()
|
|
**
|
|
** Routine is called when an interrupt at the IRQ level specified by the
|
|
** ConfigInfo structure passed to the HwInitialize routine is received.
|
|
**
|
|
** Note: IRQs may be shared, so the device should ensure the IRQ received
|
|
** was expected
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pHwDevExt - the device extension for the hardware interrupt
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
BOOLEAN STREAMAPI HwInterrupt( IN PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
BOOLEAN bMyIRQ = FALSE;
|
|
|
|
if(!pHwDevExt->bInitialized)
|
|
return FALSE;
|
|
|
|
if(pHwDevExt->bInterruptPending == FALSE)
|
|
MonoOutStr("{");
|
|
|
|
//tmp MonoOutStr("+");
|
|
|
|
if( BMA_Complete() )
|
|
{
|
|
//tmp if(pHwDevExt->bInterruptPending == FALSE)
|
|
//tmp MonoOutStr("}");
|
|
//tmp MonoOutStr(")");
|
|
bMyIRQ = TRUE;
|
|
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
FinishCurrentPacketAndSendNextOne( pHwDevExt );
|
|
|
|
// dvd_CheckCFIFO();//sri
|
|
|
|
}
|
|
else
|
|
{
|
|
//tmp if(pHwDevExt->bInterruptPending == FALSE)
|
|
//tmp MonoOutStr("]");
|
|
|
|
if(Aborted())
|
|
{
|
|
MonoOutStr("HWInt : Abort");
|
|
bMyIRQ = TRUE;
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
// FinishCurrentPacketAndSendNextOne( pHwDevExt );
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if( BRD_CheckDecoderInterrupt() )
|
|
{
|
|
INTSOURCES IntSrc;
|
|
DVD_Isr( &IntSrc );
|
|
// MonoOutStr( "DI" );
|
|
bMyIRQ = TRUE;
|
|
}
|
|
|
|
// Returning FALSE indicates that this was not an IRQ for this device, and
|
|
// the IRQ dispatcher will pass the IRQ down the chain to the next handler
|
|
// for this IRQ level
|
|
return bMyIRQ;
|
|
}
|
|
|