dma.h

来自「代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考」· C头文件 代码 · 共 211 行

H
211
字号
#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 AddrMode, int VAddr, int HAddr, int DAddr,
												int Len);
void    __MIPS_DMA_save(int AddrMode, int VAddr, int HAddr, int DAddr,
												int Len);
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 DAddr, int Len);
void    DMA_pop(int DAddr, int Len);

#endif/*__DMA_H*/

⌨️ 快捷键说明

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