2025-04-27 07:49:33 -04:00

345 lines
8.0 KiB
C
Raw Permalink 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.

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//
// 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)
{
}