345 lines
8.0 KiB
C
345 lines
8.0 KiB
C
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
// MODULE : CODEDMA.C
|
||
// PURPOSE : Compressed Data DMA Transfer
|
||
// AUTHOR : JBS Yadawa
|
||
// CREATED : 7/20/96
|
||
//
|
||
//
|
||
// Copyright (C) 1996 SGS-THOMSON Microelectronics
|
||
//
|
||
//
|
||
// REVISION HISTORY:
|
||
// -----------------
|
||
//
|
||
// DATE : COMMENTS
|
||
// ---- : --------
|
||
//
|
||
// 12-28-96 : Support of a large DMA buffer to do the dma of video
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
#include "strmini.h"
|
||
#include "stdefs.h"
|
||
#include "i20reg.h"
|
||
#include "codedma.h"
|
||
#include "sti3520A.h"
|
||
#include "board.h"
|
||
#include "memio.h"
|
||
|
||
// Static varables, gloabl to this file and only used here
|
||
static CODEDMA CodeDma;
|
||
static PCODEDMA lpCodeDma;
|
||
|
||
#define CODE_STEP_SIZE 8192L
|
||
#define DMA_BUFFER_SIZE 8192L
|
||
|
||
// Static functions
|
||
BOOL NEARAPI InitCodeCtl(DWORD);
|
||
void NEARAPI StartTransfer(void);
|
||
void NEARAPI StopTransfer(void);
|
||
void NEARAPI FlushTransfer(void);
|
||
WORD NEARAPI GetTransferLocation(void);
|
||
DWORD NEARAPI GetCodeMemBase(void);
|
||
DWORD NEARAPI GetCodeControlReg(void);
|
||
BOOL NEARAPI OpenCodeCtrl(void);
|
||
|
||
BOOL Initialized=FALSE;
|
||
|
||
BYTE RemainingBytes[4];
|
||
DWORD nRemainingBytes;
|
||
BYTE stop = 1;
|
||
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaOpen
|
||
// PARAMS : DMA Buffer and Physical Address of Dma Buffer
|
||
// RETURNS : Pointer to codedma
|
||
//
|
||
// PURPOSE : Initialise pointers and return the right values
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
PCODEDMA FARAPI CodeDmaOpen(BYTE FARPTR *pDmaBuf, DWORD PhysicalAddress)
|
||
{
|
||
|
||
lpCodeDma = &CodeDma;
|
||
lpCodeDma->WritePtr = 0;
|
||
lpCodeDma->ReadPtr = 0;
|
||
lpCodeDma->Transferring = FALSE;
|
||
lpCodeDma->RefillRequest=FALSE;
|
||
lpCodeDma->TransferCompleted = TRUE;
|
||
lpCodeDma->lpBuf = pDmaBuf;
|
||
lpCodeDma->Prev = 0;
|
||
lpCodeDma->Cur = 0;
|
||
lpCodeDma->Last = 0;
|
||
Initialized = TRUE;
|
||
nRemainingBytes = 0;
|
||
if(InitCodeCtl(PhysicalAddress))
|
||
return lpCodeDma;
|
||
return NULL;
|
||
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaFlush
|
||
// PARAMS : None
|
||
// RETURNS : TRUE on success, FALSE otherwise
|
||
//
|
||
// PURPOSE : Flush any data in the dma buffer
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
BOOL FARAPI CodeDmaFlush(void)
|
||
{
|
||
StopTransfer();
|
||
FlushTransfer();
|
||
lpCodeDma->WritePtr = 0;
|
||
lpCodeDma->ReadPtr = 0;
|
||
lpCodeDma->Prev = 0;
|
||
lpCodeDma->Last = 0;
|
||
lpCodeDma->Cur = 0;
|
||
lpCodeDma->TransferCompleted = TRUE;
|
||
lpCodeDma->Transferring = FALSE;
|
||
lpCodeDma->RefillRequest=FALSE;
|
||
nRemainingBytes = 0;
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaClose
|
||
// PARAMS : None
|
||
// RETURNS : TRUE on success FALSE otherwise
|
||
//
|
||
// PURPOSE : reset state
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
|
||
BOOL FARAPI CodeDmaClose(void)
|
||
{
|
||
Initialized = FALSE;
|
||
return TRUE;
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : InitCodeCtl
|
||
// PARAMS : Physical address
|
||
// RETURNS : TRUE on success FALSE otherwise
|
||
//
|
||
// PURPOSE : Program the code memory base pointers
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
BOOL NEARAPI InitCodeCtl(DWORD PhysicalAddress)
|
||
{
|
||
lpCodeDma->CodeCtl = 0x00200002;
|
||
memOutDword(I20_CODECTL, lpCodeDma->CodeCtl);
|
||
memOutDword(I20_CODEMB, PhysicalAddress);
|
||
memOutDword(I20_CODEMP, 0);
|
||
return TRUE;
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : StartTransfer
|
||
// PARAMS : None
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Start transferring the video data
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
void NEARAPI StartTransfer(void)
|
||
{
|
||
lpCodeDma->Transferring = TRUE;
|
||
lpCodeDma->CodeCtl |= 0x00000080;
|
||
memOutDword(I20_CODECTL, lpCodeDma->CodeCtl);
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : StopTransfer
|
||
// PARAMS : None
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Stop transferring the video data
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
void NEARAPI StopTransfer(void)
|
||
{
|
||
lpCodeDma->CodeCtl &= (~(0x00000080L));
|
||
memOutDword(I20_CODECTL, lpCodeDma->CodeCtl);
|
||
lpCodeDma->Transferring = FALSE;
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : FlushTransfer
|
||
// PARAMS : None
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Flush the buffer
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
void NEARAPI FlushTransfer(void)
|
||
{
|
||
lpCodeDma->CodeCtl |= 0x10000000;
|
||
memOutDword(I20_CODECTL, lpCodeDma->CodeCtl);
|
||
lpCodeDma->CodeCtl &= (~0x10000000);
|
||
memOutDword(I20_CODECTL, lpCodeDma->CodeCtl);
|
||
memOutDword(I20_CODEMP,0);
|
||
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : GetTransferLocation
|
||
// PARAMS : None
|
||
// RETURNS : CurrentTransferLocation
|
||
//
|
||
// PURPOSE : Get the codeMP
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
WORD NEARAPI GetTransferLocation(void)
|
||
{
|
||
DWORD xx;
|
||
xx = memInDword(I20_CODEMP);
|
||
return (WORD)(xx&0xFFFF);
|
||
}
|
||
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaSendData
|
||
// PARAMS : Data pointer and size to transfer
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Write size bytes to dma buffer
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
DWORD FARAPI CodeDmaSendData(BYTE FARPTR *lpData, DWORD Size)
|
||
{
|
||
DWORD dwBytesToSend;
|
||
DWORD dwBytesNotSent;
|
||
DWORD dwBytesSent;
|
||
|
||
if((lpCodeDma->TransferCompleted)) // || ((DWORD)GetTransferLocation()*4L == DMA_BUFFER_SIZE))
|
||
{
|
||
|
||
StopTransfer();
|
||
dwBytesToSend = Size+nRemainingBytes;
|
||
dwBytesNotSent = dwBytesToSend%4;
|
||
dwBytesSent = dwBytesToSend - dwBytesNotSent;
|
||
// DbgPrint("CodeDma : Size = %ld, ToSend=%ld, Sent=%ld, NotSent=%ld, Remaining=%ld\n", Size, dwBytesToSend, dwBytesSent, dwBytesNotSent, nRemainingBytes);
|
||
memOutDword(I20_CODEMP, (DWORD)(DMA_BUFFER_SIZE-dwBytesSent)/4L);
|
||
if(nRemainingBytes)
|
||
RtlCopyMemory(lpCodeDma->lpBuf+ ((DMA_BUFFER_SIZE) - dwBytesSent),
|
||
RemainingBytes, nRemainingBytes);
|
||
|
||
if(dwBytesSent > nRemainingBytes)
|
||
RtlCopyMemory(lpCodeDma->lpBuf+((DMA_BUFFER_SIZE)+nRemainingBytes-dwBytesSent),
|
||
lpData, dwBytesSent-nRemainingBytes);
|
||
if(dwBytesNotSent)
|
||
RtlCopyMemory(RemainingBytes, lpData+Size-dwBytesNotSent, dwBytesNotSent);
|
||
nRemainingBytes = dwBytesNotSent;
|
||
if(dwBytesSent)
|
||
{
|
||
lpCodeDma->TransferCompleted = FALSE;
|
||
StartTransfer();
|
||
}
|
||
return Size;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
void FARAPI CodeDmaStopTransfer(void)
|
||
{
|
||
StopTransfer();
|
||
}
|
||
|
||
void FARAPI CodeDmaStartTransfer(void)
|
||
{
|
||
if(!lpCodeDma->Transferring)
|
||
StartTransfer();
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaInterrupt
|
||
// PARAMS : None
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Process the codedma interrupt
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
void FARAPI CodeDmaInterrupt(void)
|
||
{
|
||
lpCodeDma->TransferCompleted = TRUE;
|
||
StopTransfer();
|
||
}
|
||
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//
|
||
//
|
||
// FUNCTION : CodeDmaRefill
|
||
// PARAMS : None
|
||
// RETURNS : None
|
||
//
|
||
// PURPOSE : Refill the dma buffers
|
||
//
|
||
//
|
||
//
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
||
void FARAPI CodeDmaRefill(void)
|
||
{
|
||
|
||
}
|
||
|