📄 dma.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 + -