Source code of Windows XP (NT5)
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.
|
|
//
// 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 :
//
#include "common.h"
#include "strmini.h"
#include "stdefs.h"
#include "i20reg.h"
#include "memio.h"
#include "codedma.h"
#include "debug.h"
#include "sti3520A.h"
CODEDMA CodeDma; LPCODEDMA lpCodeDma;
#define ALLOCATE_DMA_BUFFER 0x8107
#define RELEASE_DMA_BUFFER 0x8108
#define COPY_TO_DMA_BUFFER 0x8109
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 FARAPI CodeDmaOpen(BYTE *pDmaBuf, DWORD PhysicalAddress) { lpCodeDma = &CodeDma; lpCodeDma->WritePtr = 0; lpCodeDma->TransferCompleted = TRUE; lpCodeDma->lpBuf = pDmaBuf; return InitCodeCtl(PhysicalAddress); }
BOOL FARAPI CodeDmaFlush(void) { StopTransfer(); FlushTransfer(); lpCodeDma->WritePtr = 0; lpCodeDma->TransferCompleted = TRUE; return TRUE; }
BOOL FARAPI CodeDmaClose(void) { return TRUE; }
BOOL NEARAPI InitCodeCtl(DWORD PhysicalAddress) { lpCodeDma->CodeCtl = 0x10200002; memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); lpCodeDma->CodeCtl = 0x00200002; memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); memOutDword(I20_CODEMB, PhysicalAddress); return TRUE; }
void NEARAPI StartTransfer(void) { lpCodeDma->CodeCtl |= 0x00000080; memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); }
void NEARAPI StopTransfer(void) { lpCodeDma->CodeCtl &= (~(0x00000080L)); memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); }
void NEARAPI FlushTransfer(void) { lpCodeDma->CodeCtl |= 0x10000000; memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); lpCodeDma->CodeCtl &= (~0x10000000); memOutDword(I20_CODECTL, lpCodeDma->CodeCtl); }
WORD NEARAPI GetTransferLocation(void) { DWORD xx; xx = memInDword(I20_CODEMP); return (WORD)(xx&0xFFFF); }
DWORD FARAPI CodeDmaSendData(BYTE *lpData, DWORD Size) { DWORD Remaining, Next;
if(!lpCodeDma->TransferCompleted) return 0L;
if(lpCodeDma->WritePtr + Size < DMA_BUFFER_SIZE) { RtlCopyMemory((BYTE *)(lpCodeDma->lpBuf+lpCodeDma->WritePtr), lpData, Size); lpCodeDma->WritePtr += Size; return Size; }
else { if(!VideoIsEnoughPlace(DMA_BUFFER_SIZE*2)) return 0;
Next = DMA_BUFFER_SIZE - lpCodeDma->WritePtr; if(Next) RtlCopyMemory((BYTE *)(lpCodeDma->lpBuf+lpCodeDma->WritePtr), lpData, Next); memOutDword(I20_CODEMP, 0); lpCodeDma->TransferCompleted = FALSE; lpCodeDma->WritePtr=0; StartTransfer(); return Next; } }
void FARAPI CodeDmaStopTransfer(void) { }
void FARAPI CodeDmaStartTransfer(void) { }
void FARAPI CodeDmaInterrupt(void) { StopTransfer(); lpCodeDma->TransferCompleted = TRUE; }
|