218 lines
4.8 KiB
C++
218 lines
4.8 KiB
C++
|
//**************************************************************************
|
|||
|
//
|
|||
|
// Title : WDMBuff.cpp
|
|||
|
//
|
|||
|
// Date : 1997.12.08 1st making
|
|||
|
//
|
|||
|
// Author : Toshiba [PCS](PSY) Hideki Yagi
|
|||
|
//
|
|||
|
// Copyright 1997 Toshiba Corporation. All Rights Reserved.
|
|||
|
//
|
|||
|
// -------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// Change log :
|
|||
|
//
|
|||
|
// Date Revision Description
|
|||
|
// ------------ ---------- -----------------------------------------------
|
|||
|
// 1997.12.08 000.0000 1st making.
|
|||
|
//
|
|||
|
//**************************************************************************
|
|||
|
#include "includes.h"
|
|||
|
|
|||
|
#include "wdmbuff.h"
|
|||
|
#include "dvdinit.h"
|
|||
|
|
|||
|
|
|||
|
CWDMBuffer::CWDMBuffer( void )
|
|||
|
{
|
|||
|
m_pSrb = NULL;
|
|||
|
m_WDMBuffNext = NULL;
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
m_EndFlag = TRUE; //TRUE:last buffer FALSE:non last buffer
|
|||
|
m_BuffNumber = 0;
|
|||
|
m_StartPacketNumber = 0;
|
|||
|
m_PacketNum = 0;
|
|||
|
m_BeforePacketNum = 0;
|
|||
|
m_Enable = FALSE;
|
|||
|
#endif REARRANGEMENT
|
|||
|
}
|
|||
|
|
|||
|
CWDMBuffer::~CWDMBuffer( void )
|
|||
|
{
|
|||
|
m_pSrb = NULL;
|
|||
|
m_WDMBuffNext = NULL;
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
//<2F>lj<EFBFBD><C789><EFBFBD><EFBFBD>ϐ<EFBFBD><CF90>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
m_EndFlag = TRUE;
|
|||
|
m_BuffNumber = 0;
|
|||
|
m_StartPacketNumber = 0;
|
|||
|
m_PacketNum = 0;
|
|||
|
m_BeforePacketNum = 0;
|
|||
|
m_Enable = FALSE;
|
|||
|
#endif REARRANGEMENT
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
IMBoardListItem *CWDMBuffer::GetNext( void )
|
|||
|
{
|
|||
|
return( m_WDMBuffNext );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CWDMBuffer::SetNext( IMBoardListItem *item )
|
|||
|
{
|
|||
|
m_WDMBuffNext = item;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DWORD CWDMBuffer::GetPageNum( void )
|
|||
|
{
|
|||
|
ASSERT( m_pSrb != NULL );
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
return ((DWORD) m_PacketNum);
|
|||
|
#else
|
|||
|
return( (DWORD)(m_pSrb->NumberOfPhysicalPages) ); // Is it OK??????
|
|||
|
#endif REARRANGEMENT
|
|||
|
|
|||
|
// return( (DWORD)(m_pSrb->NumberOfBuffers) ); // Is it OK??????
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DWORD CWDMBuffer::GetPageSize( DWORD pagenum )
|
|||
|
{
|
|||
|
ULONG PageSize;
|
|||
|
// DWORD i, j;
|
|||
|
// PKSSTREAM_HEADER pStruc;
|
|||
|
|
|||
|
ASSERT( m_pSrb != NULL );
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
ASSERT( m_PacketNum >= pagenum );
|
|||
|
#else
|
|||
|
ASSERT( m_pSrb->NumberOfPhysicalPages >= pagenum );
|
|||
|
#endif REARRANGEMENT
|
|||
|
|
|||
|
ASSERT( pagenum != 0 );
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
PageSize = m_pSrb->ScatterGatherBuffer[m_BeforePacketNum + pagenum - 1].Length;
|
|||
|
#else
|
|||
|
PageSize = m_pSrb->ScatterGatherBuffer[pagenum-1].Length;
|
|||
|
#endif REARRANGEMENT
|
|||
|
|
|||
|
// DBG_PRINTF( ("WDMBUFF: PageSzie = 0x%0x\n\r", PageSize ) );
|
|||
|
|
|||
|
/*
|
|||
|
j = 0;
|
|||
|
for( i=0; i<(m_pSrb->NumberOfBuffers); i++ ){
|
|||
|
pStruc = &((PKSSTREAM_HEADER)(m_pSrb->CommandData.DataBufferArray))[i];
|
|||
|
if( pStruc->DataUsed != 0 ){
|
|||
|
if( !(pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ) ){
|
|||
|
// DVD valid data to transfer to decoder board.
|
|||
|
PageSize = m_pSrb->ScatterGatherBuffer[j].Length;
|
|||
|
j++;
|
|||
|
}
|
|||
|
if( j>=pagenum )
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
*/
|
|||
|
ASSERT( (PageSize % 2048) == 0 );
|
|||
|
|
|||
|
return( (DWORD)PageSize );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CWDMBuffer::GetPagePointer( DWORD pagenum, DWORD *LinAddr, DWORD *PhysAddr )
|
|||
|
{
|
|||
|
PHYSICAL_ADDRESS pAdd;
|
|||
|
DWORD i, j;
|
|||
|
PKSSTREAM_HEADER pStruc;
|
|||
|
|
|||
|
ASSERT( m_pSrb != NULL );
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
ASSERT( m_PacketNum >= pagenum );
|
|||
|
#else
|
|||
|
ASSERT( m_pSrb->NumberOfPhysicalPages >= pagenum );
|
|||
|
#endif REARRANGEMENT
|
|||
|
|
|||
|
ASSERT( pagenum != 0 );
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
pAdd = m_pSrb->ScatterGatherBuffer[m_BeforePacketNum + pagenum - 1].PhysicalAddress;
|
|||
|
#else
|
|||
|
pAdd = m_pSrb->ScatterGatherBuffer[pagenum-1].PhysicalAddress;
|
|||
|
#endif REARRANGEMENT
|
|||
|
|
|||
|
*PhysAddr = (DWORD)(pAdd.LowPart);
|
|||
|
*LinAddr = (DWORD)0;
|
|||
|
|
|||
|
// Linear address is validate?
|
|||
|
|
|||
|
j = 0;
|
|||
|
|
|||
|
for( i=0; i<(m_pSrb->NumberOfBuffers); i++ ){
|
|||
|
pStruc = &((PKSSTREAM_HEADER)(m_pSrb->CommandData.DataBufferArray))[i];
|
|||
|
ASSERT( pStruc != NULL );
|
|||
|
if( pStruc->DataUsed != 0 ){
|
|||
|
if( !(pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED) )
|
|||
|
{
|
|||
|
// DVD valid data to transfer to decoder board.
|
|||
|
*LinAddr = (DWORD)(pStruc->Data);
|
|||
|
j++;
|
|||
|
}
|
|||
|
if( j>=pagenum )
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
ASSERT( j != 0 );
|
|||
|
ASSERT( *LinAddr != 0 );
|
|||
|
return( TRUE );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DWORD CWDMBuffer::GetBufferFlag( void )
|
|||
|
{
|
|||
|
return( (DWORD)0 );
|
|||
|
// return( (DWORD)m_pSrb->Flags );
|
|||
|
}
|
|||
|
|
|||
|
BOOL CWDMBuffer::SetSRB( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|||
|
{
|
|||
|
ASSERT( pSrb != NULL );
|
|||
|
|
|||
|
if( pSrb == NULL ){
|
|||
|
return( FALSE );
|
|||
|
}
|
|||
|
|
|||
|
m_pSrb = pSrb;
|
|||
|
return( TRUE );
|
|||
|
}
|
|||
|
|
|||
|
PHW_STREAM_REQUEST_BLOCK CWDMBuffer::GetSRB( void )
|
|||
|
{
|
|||
|
ASSERT( m_pSrb != NULL );
|
|||
|
return( m_pSrb );
|
|||
|
}
|
|||
|
|
|||
|
VOID CWDMBuffer::Init( void )
|
|||
|
{
|
|||
|
m_pSrb = NULL;
|
|||
|
m_WDMBuffNext = NULL;
|
|||
|
|
|||
|
#ifndef REARRANGEMENT
|
|||
|
m_EndFlag = TRUE;
|
|||
|
m_BuffNumber = 0;
|
|||
|
m_StartPacketNumber = 0;
|
|||
|
m_PacketNum = 0;
|
|||
|
m_BeforePacketNum = 0;
|
|||
|
m_Enable = FALSE;
|
|||
|
#endif REARRANGEMENT
|
|||
|
}
|
|||
|
|
|||
|
|