📄 vp.h
字号:
VP_cmdq_cmd(a); \} while(0)#define VP_ucode(ncmdq, a) VP_cbus(ncmdq, a)/* vp_ucode should be faded out */#define vp_ucode(a) VP_ucode(NCMDQ_VP_ucode, a)#define vp_ucode_only(a) VP_ucode(0, a)#define wait4l_only VP_block(0, UCODE_IDLE)#define VP_mcmd(ncmdq, a) VP_cbus(ncmdq, a)/* vp_mcmd should be faded out */#define vp_mcmd(a) VP_mcmd(NCMDQ_VP_mcmd, a)#define vp_mcmd_only(a) VP_mcmd(0, a)/************************************************************ * blocking commands at interface with internal queue * might have to be issued twice to take into account delay induced * by internal vp queue, in such case use VP_block_twice() ************************************************************//************************************************************ * VP_MCMD_ISSUED: * why needed is still to be investigated!!! * stuffing between vp_mcmd and dmay in rla case * must be issued immediate after vp_mcmd to avoid certain timing problem: * there could be a scenerio that the vp_mcmd has been executed, causing * waitio_ready to wait forever ************************************************************/typedef enum { UCODE_IDLE =0x21f, IO_IDLE =0x9f, VP_MCMD_ISSUED =0x9b, VP_CMDQ_NOT_EMPTY_N_IO_IDLE =0x0fe,} READY_MASK;#define VP_block(ncmdq, ready_mask) \{ \ if (ncmdq) VP_cmdq_wait(ncmdq); \ mvd[buscon_cmdque_vpstatwait] = ready_mask; \}#define VP_block_twice(ncmdq, ready_mask) \{ \ if (ncmdq) VP_cmdq_wait(ncmdq); \ mvd[buscon_cmdque_vpstatwait] = ready_mask; \ mvd[buscon_cmdque_vpstatwait] = ready_mask; \}/************************************************************ * send endio to terminate vp_mcmd used in io ************************************************************/#define VP_endio(ncmdq) \{ \ VP_block(ncmdq, 0x400); \ VP_block(0, 0x8400); \}/************************************************************ * VP_xfer a general way for transfering 1d data between dram and vp * for 2d data use VP_xfer_2d * e.g. to output idct result to dram: * VP_xfer(VPCMD_R_DPCM, vpadr, VPDMA_BREAK+VPDMA_WIDTH2, offset+xy2a(x,y,720), 4, 16); ************************************************************//* internal use in VP_xfer */#define VPDIR(cmd) (((cmd) & 0x1000) ? VPDMA_VP2MEM : VPDMA_MEM2VP)#define VP_xfer(ncmdq, cmd, vpadr, mode, addr, dx, dy) do { \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_cmd((cmd) + (vpadr)); \ VP_cmdq_deltas((dx), (dy)); \ VP_cmdq_dmax(VPDIR(cmd) + (mode) + a2x(addr)); \ VP_cmdq_dmay(a2y(addr)); \} while (0)#define VP_xfer_bf(ncmdq, cmd, vpadr, mode, addr, dx, dy) do { \ vp_mcmd_only(VPCMD_BFRAME_ON); \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_cmd((cmd) + (vpadr)); \ VP_cmdq_deltas((dx), (dy)); \ VP_cmdq_dmax(VPDIR(cmd) + (mode) + a2x(addr)); \ VP_cmdq_dmay(0x8000+a2y(addr)); \ vp_mcmd_only(VPCMD_BFRAME_OF); \} while (0)#define VP_xfer_sw(ncmdq, cmd, vpadr, mode, addr, dx, dy, z) do { \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_cmd((cmd) + (vpadr)); \ VP_cmdq_deltas((dx), (dy)); \ VP_cmdq_dmax(VPDIR(cmd) + (mode) + a2x(addr)); \ if (z) VP_cmdq_dmay(0x8000+a2y(addr)); \ else VP_cmdq_dmay(a2y(addr)); \} while (0)#ifdef R3418#define VP_xfer_quick(ncmdq, cmd, vpadr, addr) do { \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_cmd((cmd) + (vpadr)); \ mvd[buscon_cmdque_vpdeltas] = last_vpdma_setup; \ VP_cmdq_dmay((addr)); \ VP_xfer_wait(); \} while (0)#else#define VP_xfer_quick(ncmdq, cmd, vpadr, addr) do { \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_cmd((cmd) + (vpadr)); \ VP_cmdq_dmay(a2y(addr)); \} while (0)#endif#define VP_ucode_wait() do { \ VP_block_twice(NCMDQ_VP_block_twice, UCODE_IDLE); \} while (0);/************************************************************ * vp_mcmd is issued outside for better optimization * offset, DX, X all in dword unit * remember to select INC2 * need width term * BframeComp can be 0 or 0x8000 ************************************************************/#define VP_xfer_2d(ncmdq, x, y, DX, DY, offset, width, vpdma_mode, vpdir, BframeComp) \{ \ int addr = (offset)+xy2a(x,y,width); \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_cmdq_deltas(DX, DY); \ VP_cmdq_dmax((vpdir) + (vpdma_mode) + (VPDMA_BREAK) + a2x(addr)); \ VP_cmdq_dmay(a2y(addr)+BframeComp); \}/************************************************************ * wait until cmdq is empty, then read out port value * such wait is necessary to make sure that port value is valid ************************************************************/#define VP_read(ncmdq, port) \{ \ if (ncmdq) VP_cmdq_wait(ncmdq); \ VP_block_twice(0, UCODE_IDLE); \ VP_cmdq_wait_empty; \ mvd[buscon_cmdque_vprd] = 0x0; \ while (!(mvd[buscon_cmdque_status]& 0x8)); \ port = (mvd[buscon_cmdque_rdrlatchl] & 0xffff); \}/************************************************************ * CMDQ_reset discard all pending cmdq entries ************************************************************//* since it's reset, probably it does not go thru command queue, * so no need for cmdq_wait??? */#define VP_cmdq_reset(ncmdq) \{ \ if (ncmdq) VP_cmdq_wait(ncmdq); \ mvd[buscon_cmdque_cntl] = 0x20; \ mvd[buscon_cmdque_cntl] = 0x00; \}#define CMDQ_reset() VP_cmdq_reset(0)/************************************************************ * global typedef ************************************************************/typedef enum { rnone, rksearch, rkcross, rkaraoke, rspatial, rcdda, rhscale, rpal2ntsc, rntsc2pal, rtwo2one, rdemphasis, rvolume_128, recho, recho_dp, rmpgnonpage, rmp3_destereo, rmp3_mult48, rmp3_imdct12, rmp3_imdct36, rmp3nonpage, rjpgnonpage, rgslnonpage, rgamnonpage, requnonpage, rkscnonpage, rrvbnonpage, rzeropoint, rdigest, rwma, rac3lib, rwma1, rdummy, /* rdummy should never be used in indexing array */} RAMCODE;/************************************************************ * Global variables ************************************************************/#define VP_RESTORE_MPG_UCODE 0x0001#define VP_RESTORE_MP3_UCODE 0x0002#define VP_RESTORE_JPG_UCODE 0x0004#define VP_RESTORE_GSL_UCODE 0x0008#define VP_RESTORE_GAM_UCODE 0x0010#define VP_RESTORE_EQU_UCODE 0x0020#define VP_RESTORE_KSC_UCODE 0x0040#define VP_RESTORE_RVB_UCODE 0x0080GBLDEF0(volatile unsigned int VP_need_to_restore_ucode);/************************************************************ * external function declaration ************************************************************/EXPORT void VP_init(int);EXPORT void VP_reset(void);EXPORT void VP_load_ucode(RAMCODE name);EXPORT void VP_version(void);EXPORT void VP_xfer_wait(void);EXPORT void VP_set_rvb_delay_hack(void);#else /* FAKE */#define VP_xfer_wait()#define VP_ucode_wait()#define VP_load_ucode(name)#define VP_cmdq_wait(n)#endif#endif /* _VP_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -