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 + -
显示快捷键?