⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.h

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 H
字号:
#ifndef __DMA_H
#define __DMA_H

#include "dmabuf.h"

/*
#define	MIPS_DMA_WRAPPER
*/

#if (CONFIG==CONFIG_DVD)
#define	MIPS_DMA_LBC
#endif

#define	VADDR_MODE_GLOBAL_PHY	0
#define	VADDR_MODE_CDDSP	1
#define	VADDR_MODE_OSD		2
#define	VADDR_MODE_SUP		3
#define	VADDR_MODE_OGT		VADDR_MODE_SUP
#define	VADDR_MODE_AUD		4
#define	VADDR_MODE_VID		5
#define	VADDR_MODE_ECHO		6
#define	VADDR_MODE_GLOBAL	7

/*
 ** DMA buffer emulation on ARM
 ** NOTE: this is due to a problem about sub-word access of ARM interface.
 */
#include "regmap.h"

#if CONFIG==CONFIG_DVD
EXTERN_DATABUF WorkBuf		dma_buf;
EXTERN_DATABUF t_vidout_buf	vidout_buf;
#else
#define	dma_buf			regs0->dma_mem
#endif

/*
 **	MACRO.
 **	__DMA_load
 **	__DMA_save
 **
 **	real-jobs
 */
/*
 **	64M/16M AGDC (since '99 July) version
 */
#define	__DMA_load(AddrMode, VAddr, HAddr, DAddr, Len) {		\
	    regs0->dma_mode = ((((UINT32)(DAddr)) & 0xff) << 8) |	\
			      ((((Len) >> 5) - 1) << 3) | (AddrMode);	\
	    regs0->dma_yaddr = (VAddr);					\
	    regs0->dma_xaddr = (HAddr);					\
	}
#define	__DMA_save(AddrMode, VAddr, HAddr, DAddr, Len) {		\
	    regs0->dma_mode = ((((UINT32)(DAddr)) & 0xff) << 8) |	\
			      ((0x01) << 5) |				\
			      ((((Len) >> 5) - 1) << 3) | (AddrMode);	\
	    regs0->dma_yaddr = (VAddr);					\
	    regs0->dma_xaddr = (HAddr);					\
	}

/*
 **	16M version
 */
#ifdef M16
#define	__DMA_load(AddrMode, VAddr, HAddr, DAddr, Len) {		\
	    regs0->dma_yaddr   = ((AddrMode) << 12) | (VAddr);		\
	    regs0->dma_addrlen = ((Len) << 8) | (((UINT32)(DAddr)) & 0xff); \
	    regs0->dma_xaddr   = 0x0000 | ((HAddr));			\
	}
#define	__DMA_save(AddrMode, VAddr, HAddr, DAddr, Len) {		\
	    regs0->dma_yaddr   = ((AddrMode) << 12) | (VAddr);		\
	    regs0->dma_addrlen = ((Len) << 8) | (((UINT32)(DAddr)) & 0xff); \
	    regs0->dma_xaddr   = 0x8000 | ((HAddr));			\
	}
#endif	M16

#ifdef ENABLE_INLINE
static inline void __DMA_wait()
{
#ifdef __LX4080
    asm volatile ("\
	0: lw    $2, %0;\
	   beqz  $2, 0b;\
	"::"m" (regs0->dma_done):"$2");
#else
    while (!(regs0->dma_done));
#endif
}
#else
#define	__DMA_wait()		{while (!(regs0->dma_done));}
#endif

#if defined(UNIX)
/*
 **	Emulator on UNIX platform
 */
void			SDRAM_load(int, int, int, void *, int);
void			SDRAM_save(int, int, int, void *, int);
void			DMA_load(int, int, int, int, int);
void			DMA_save(int, int, int, int, int);
void			DMA_wait(void);
#else
#if defined(MIPS_DMA_WRAPPER) || defined(MIPS_DMA_LBC)
void			__MIPS_DMA_load(int, int, int, int, int);
void			__MIPS_DMA_save(int, int, int, int, int);
void			__MIPS_DMA_wait(void);

#define	DMA_load(AddrMode, VAddr, HAddr, DAddr, Len)	\
	__MIPS_DMA_load(AddrMode, VAddr, HAddr, DAddr, Len)
#define DMA_save(AddrMode, VAddr, HAddr, DAddr, Len)	\
	__MIPS_DMA_save(AddrMode, VAddr, HAddr, DAddr, Len)
#define	DMA_wait()					\
	__MIPS_DMA_wait()

#include "memmap.h"
/*	This is silly, but we'd like to maintain some backward compatibility somewhere */
static inline void MIPS_DMA_load_VIDEO(int VAddr, int HAddr, int DAddr, int Len)
{
    int			i;
    UINT32		*p = (UINT32 *) & (dma_buf.b[DAddr]);
    UINT32		*q = (UINT32 *) (SDRAM_BASE + (VAddr + VBV_YS) * 1024 + HAddr);

    for (i = 0; i < Len; i += 4)
	*p++ = *q++;
}

static inline void MIPS_DMA_save_VIDEO(int VAddr, int HAddr, int DAddr, int Len)
{
    int			i;
    UINT32		*p = (UINT32 *) (SDRAM_BASE + (VAddr + VBV_YS) * 1024 + HAddr);
    UINT32		*q = (UINT32 *) & (dma_buf.b[DAddr]);

    for (i = 0; i < Len; i += 4)
	*p++ = *q++;
}

static inline void MIPS_DMA_wait_VIDEO()
{
}

static inline void MIPS_flush_LBC_cache()
{
    volatile UINT32	*p = (volatile UINT32 *)SDRAM_BASE_UNCACHED;

    (void)p[0];
    (void)p[8];
//  *(volatile UINT32 *)(SDRAM_BASE_UNCACHED +  0) = *(volatile UINT32 *)(SDRAM_BASE_UNCACHED +  0);
//  *(volatile UINT32 *)(SDRAM_BASE_UNCACHED + 32) = *(volatile UINT32 *)(SDRAM_BASE_UNCACHED + 32);
//  *(volatile UINT32 *)(SDRAM_BASE_UNCACHED + 64) = *(volatile UINT32 *)(SDRAM_BASE_UNCACHED + 64);
}

#else
#define	DMA_load(a,b,c,d,e)	__DMA_load(a,b,c,d,e)
#define	DMA_save(a,b,c,d,e)	__DMA_save(a,b,c,d,e)
#define	DMA_wait()		__DMA_wait()
#endif
#endif

/*
 **	Address sequencer (2D)
 */
#define	ADDR_adv_one(x,y,w,l)	{	\
	    if (((x) += (l)) >= (w)) {	\
		(x) -= (w); ++(y);	\
	    }				\
	}

#define	ADDR_adv(x,y,w,h,l)	{	\
	    if (((x) += (l)) >= (w)) {	\
		(x) -= (w);		\
		if ((++(y)) >= (h))	\
		    (y) = 0;		\
	    }				\
	}

#ifdef SUPPORT_STORE_PSD_TBL
#define	ADDR_adv_cdrom_move(x,y,w,l)	{	\
	    if (((x) += (l)) >= (w)) {		\
		(x) -= (w); (x) += (736); (y)++;\
	    }					\
	}
#endif	SUPPORT_STORE_PSD_TBL

#ifdef SUPPORT_CD_MOVE
#define	ADDR_adv_cdmove(x,y,w,h,l)	{	\
	    if (((x) += (l)) >= (w)) {		\
		(x) -= (w); (x) += (736);	\
		if ((++(y)) >= (h))		\
		    (y) = 0;			\
	    }					\
	}
#endif
#ifdef SUPPORT_AUD_MOVE
#define	ADDR_adv_audmove(x,y,w,h,l)	{	\
	    if (((x) += (l)) >= (w)) {		\
		(x) -= (w); (x) += (736);	\
		if ((++(y)) >= (h))		\
		    (y) = 0;			\
	    }					\
	}
#endif

void			DMA_push(int, int);
void			DMA_pop(int, int);

#endif	__DMA_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -