📄 memcfg.c
字号:
//
// FILE
// memcfg.c
//
// DESCRIPTION
// configure memory
//
#include "config.h"
#include "global.h"
#include "regmap.h"
#include "stdlib.h"
#include "kinf.h"
#include "kernel.h"
#include "memmap.h"
#include "memmap0.h"
#include "framebuf.h"
#include "avd.h"
#include "dsp3_if.h"
#include "reset.h"
#include "sdctrl.h"
#include "memcfg.h"
#include "user_init.h"
#include "fsNAV.h"
#include "mem_anchor.h" //terry,2004/1/20 01:13PM
#include "atapi_if.h"
#ifndef DVDRELEASE
#define MEMCFG_DBG 1
#endif
#define memcfg_printf(s...) ((void)0)
#ifdef MEMCFG_DBG
#include "sio.h"
#include "emuio.h"
#define MONE_CONFIG
#undef memcfg_printf
#define memcfg_printf printf_w
#endif
void init_gp_parameter(int w)
{
mode_aspect = 0;
vpp_zoom = 0;
line_offset = (w+31)/32*32 ;
set_framebuf_linear_mode_width(line_offset);
avd_disp_intp_mode(AVD_DISP_INTP_PROGRESSIVE);
}
#ifdef NO_BLACK_for_PIC_CD
void copy_ref1_frame_mpg2gp(void)
{
UINT8 *mpg,*gp;
UINT16 luma_sz;
UINT32 sz;
printf("regs0->ref1_luma:%d\n",regs0->ref1_luma);
printf("regs0->bidir_luma:%d\n",regs0->bidir_luma);
printf("GP_REF1_LUMA:%d\n",GP_REF1_LUMA);
mpg = (UINT8 *)(SDRAM_BASE_CACHED + regs0->ref1_luma*1024);
gp = (UINT8 *)(SDRAM_BASE_CACHED + GP_REF1_LUMA*1024);
sz = (regs0->bidir_luma-regs0->ref1_luma)*1024;
luma_sz = regs0->vppref1_chroma - regs0->vppref0_luma;
printf("mpg:%x gp:%x sz:%d %d\n",mpg,gp,sz/1024,sz);
memcpy(gp,mpg,sz);
regs0->ref1_luma = GP_REF1_LUMA;
regs0->ref1_chroma = GP_REF1_LUMA + LUMA_SIZE;
regs0->vppref1_luma = GP_REF1_LUMA;
regs0->vppref1_chroma = GP_REF1_LUMA + LUMA_SIZE;
}
void init_pic_cd_first_play(void)
{
copy_ref1_frame_mpg2gp();
set_disbuf_now(1);
regs0->ref0_luma = GP_REF0_LUMA;//terry,2004/2/4 07:39PM
regs0->ref0_chroma = GP_REF0_CHROMA;
regs0->vppref0_luma = GP_REF0_LUMA;
regs0->vppref0_chroma = GP_REF0_CHROMA;
init_gp_parameter(720);
set_fbuf_size( GP_LUMA_SIZE, GP_CHROMA_SIZE ); //terry,2004/2/18 02:40PM
clrFrameBuffer(FRAME_REF0);
}
void init_hw_gp_md(void)
{
memory_config_saved = MEMORY_GRAPH_PAL;
disable_video();
memcfg_set_framebuf_anchor(anchor_gp);
clrFrameBuffer(FRAME_REF1);
#ifdef SDRAM_NO_REORDER
setup_vpp_mapping(3,1);
#else
setup_vpp_mapping(3,0);
#endif
setvpp_linear_mode_width(736);
vpp_reset_framebuf_state();
enable_video();
}
#endif
/* // 2004/07/02 yltseng mark
#if defined( SUPPORT_JPEG_MIC ) && !defined( MOVE_PAL_AUDYA )//terry,2004/1/14 01:47PM
void set_dsp_codec_addr( int jpeg, int iConfig )
{
if(jpeg)
set_aud_buf(A_MIC_DSP24YA, A_AUDYA, A_MIC_PCM_YA);
else
set_aud_buf(A_DSP24YA, A_AUDYA, A_PCMYA);
}
#endif
*/
/*// 2004/11/18 yltseng
// 2004/07/02 yltseng
void set_dsp_codec_addr()
{
#ifdef SUPPORT_JPEG_MIC
if( pFsJpeg->gifsFuncBtn == FS_FUNC_JPEG )
set_aud_buf( A_MIC_DSP24YA, A_AUDYA, A_MIC_PCM_YA );
else
#endif
#ifdef MOVE_PAL_AUDYA
set_aud_buf( A_DSP24YA, ( regs0->mc_compress != 0 ) ? P_AUDYA : A_AUDYA, A_PCMYA );
if( pFsJpeg->gifsFuncBtn != FS_FUNC_JPEG )
reset_audio_buf();
#else
set_aud_buf( A_DSP24YA, A_AUDYA, A_PCMYA );
#endif
}
*/
//
// setup other buffer start-address.
static inline void
SetupOtherBufferPointer( void )
{
// DVD DSP DMA Buffer pointer
regs0->cdwya = A_CDYA;
regs0->cdwya_limit = CDSIZE;
//Audio DSP code,bit-stream,output pcm buffer pointer
//set_dsp_codec_addr(); // 2004/11/18 yltseng
//iop code pointer
regs0->iopya = A_IOPYA;
regs0->iop_memlimit = IOP_SIZE*4;//unit equ. 256 bytes
//de-interlace paramenter
regs0->dip_ref_base = A_DEINTLACE_YA;
}
//
// FUNCTION
// config_Lmem(enable)
//
// +------------------+ row_st
// | B | |
// +----------+ |
// | |
// +------------------+ base
//
static void
config_Lmem(int enable)
{
if (enable)
{
regs0->sdctrl_lmem_base = 0x1; //unit:2MB
regs0->sdctrl_lmem_row_st = SDCTRL_L_TYPE_W_256|SDCTRL_L_TYPE_EN|(P_REF0_LUMA);
// regs0->sdctrl_lmem_row_st = SDCTRL_L_TYPE_W_256|SDCTRL_L_TYPE_EN|281;
}
else
{
regs0->sdctrl_lmem_row_st = SDCTRL_L_TYPE_DIS;
}
}
static void
config_mc_compression(int enable)
{
if (enable)
{
#ifdef ONLY_B_PIC
regs0->mc_compress = 0x100;//picture type B.P.I
#else
regs0->mc_compress = 0x111;//picture type B.P.I
#endif
}
else
{
regs0->mc_compress = 0;
}
}
static void
YCbCrGrapeMdCfg(int w,int h)
{
init_gp_parameter(w);
set_dis_pic_size(w,h);
setup_display_now();
#ifdef SDRAM_NO_REORDER
setup_vpp_mapping(3,1);
#else
setup_vpp_mapping(3,0);
#endif
}
UINT16 memory_config_w_saved;
UINT16 memory_config_h_saved;
//
// FUNCTION
// reset_mem_cfg
//
// DESCRIPTION
// reset memory configuration so that next time will always setup all
// memory related registers
//
void
reset_mem_cfg(void)
{
memory_config_saved = 0xff;
}
void
memcfg_set_framebuf_anchor(const UINT16 p[])
{
// mc luma
regs0->ref0_luma = p[0];
regs0->ref1_luma = p[1];
regs0->bidir_luma = p[2];
// mc chroma
regs0->ref0_chroma = p[3];
regs0->ref1_chroma = p[4];
regs0->bidir_chroma = p[5];
// vpp luma
regs0->vppref0_luma = p[6];
regs0->vppref1_luma = p[7];
regs0->vppbidir_luma = p[8];
// vpp chroma
regs0->vppref0_chroma = p[9];
regs0->vppref1_chroma = p[10];
regs0->vppbidir_chroma = p[11];
}
#ifdef DVD_AUDIO
//terry,2004/2/17 02:13PM
void config_dvd_audio_memmap(void)
{
if (regs0->dis_pic_id==1) {
fbuf_copy(0,1);
}
memcfg_set_framebuf_anchor(anchor_dvdaudio);
//printf("\n\n**** CHANGE ANCHOR\n\n");
//delay_srv_10ms(100);
}
#endif
// 2004/07/07 yltseng
#if defined( SDRAM_16Mb_Mode ) && defined( SUPPORT_FILE_SYSTEM_MODE )
void ModifyFsBufAddr()
{
extern UINT32 _fs9660_buf;
UINT32 uiCurFsAddr;
if( regs0->mc_compress )
uiCurFsAddr = SDRAM_BASE + P_FS9660YA * 1024;
else
uiCurFsAddr = SDRAM_BASE + N_FS9660YA * 1024;
if( cd_type_loaded == CDROM && uiCurFsAddr != _fs9660_buf )
{
memcpyS( (void*)uiCurFsAddr, (void*)_fs9660_buf, FS9660_SIZE * 1024 );
_fs9660_buf = uiCurFsAddr;
}
}
#else
inline void ModifyFsBufAddr() {} // 2004/08/26 yltseng
#endif
// 2004/07/21 yltseng
#if defined( USE_NAV_BUF_16M ) || defined( USE_NAV_BUF_16M_DECREASE_SUBPICTURE )
inline void ModifyNavBufAddr()
{
extern UINT32 g_uiNavBufAddr;
UINT32 uiCurNavBufAddr;
if( regs0->mc_compress )
uiCurNavBufAddr = SDRAM_BASE + P_NAVYA * 1024;
else
uiCurNavBufAddr = SDRAM_BASE + N_NAVYA * 1024;
if( g_uiNavBufAddr != uiCurNavBufAddr )
wb_tag_init();
g_uiNavBufAddr = uiCurNavBufAddr;
}
#else
inline void ModifyNavBufAddr() {}
#endif
#ifdef SUPPORT_MP4 // 2004/08/11 yltseng
static void SetEvbyaLimit( UINT32 uiLimit )
{
if( GetCurrentFileType() == CDROM_MP4 )
regs0->evbya_limit = A_AVIEVBSZ;
else
regs0->evbya_limit = uiLimit;
}
#else
static inline void SetEvbyaLimit( UINT32 uiLimit )
{
regs0->evbya_limit = uiLimit;
}
#endif
//
// FUNCTION
// config_memory_size
//
// DESCRIPTON
// setup memory configuration, abort if same with previous setting
//
void
config_memory_size(int config, int w, int h, int force)
{
int blue;
#ifdef SDRAM_16Mb_Mode//terry,2003/10/21 10:03AM
int osd_enable;//terry,2003/10/20 03:24PM
#endif
int configX;
unsigned evbya_old;
unsigned osdya_n;
unsigned supya_n;
#ifdef NO_BLACK_for_PIC_CD
if(pic_cd_first_play) return;
#endif
#ifdef DVD_AUDIO
if (AOB) config = MEMORY_DVD_AUDIO;
else pDSV->asv_loaded_addr=0; //terry,2004/2/19 05:02PM
#endif
#if !defined( SDRAM_16Mb_Mode ) || defined( SUPPORT_FILE_SYSTEM_MODE )//2004/08/11 yltseng
//config mvc buffer
regs0->mvcya = MVC_BUF_YA;
#endif
configX = config;
if (force)
{
if (config==MEMORY_UNKNOWN_PAL) {
config = MEMORY_DVD_PAL;
configX = 0xff; // spepcial marker, force update next time
} else if (config==MEMORY_UNKNOWN_NTSC) {
config = MEMORY_DVD_NTSC;
configX = 0xff; // spepcial marker, force update next time
}
}
else
{
if (config==MEMORY_UNKNOWN_PAL) {
if (w==memory_config_w_saved && h==memory_config_h_saved) return;
config = MEMORY_DVD_PAL;
configX = 0xff; // spepcial marker, force update next time
} else if (config==MEMORY_UNKNOWN_NTSC) {
if (w==memory_config_w_saved && h==memory_config_h_saved) return;
config = MEMORY_DVD_NTSC;
configX = 0xff; // spepcial marker, force update next time
} else if (config==memory_config_saved) {
#ifdef DVD_AUDIO
if ( (AOB) && ((memory_config_w_saved!=w) || (memory_config_h_saved!=h))) {
disable_video();
clrFrameBuffer(FRAME_REF0|FRAME_REF1);
setVPP_PictureSize(w,h);
enable_video();
memory_config_w_saved = w;
memory_config_h_saved = h;
}
#endif
return; // abort
}
}
#ifdef MONE_CONFIG
memcfg_printf("\n\n===========>config mem %x(%x)\n", config, memory_config_saved);
#endif
//
// check what color to fill during black
blue = (config==MEMORY_PREVIEW);
//
// blank the display
disable_video();
#ifdef SDRAM_16Mb_Mode//terry,2003/10/21 10:03AM
osd_enable = regs0->osd_en;//terry,2003/10/20 03:23PM
osd_disable();
#endif
delay_srv_10ms(1);
vpp_set_bg_color(0,0x8080); //black color
//
// enable all clocks
setup_clock_gating(0);
regs0->clken0 = 0xffff; // enable
regs0->clken1 = 0xffff; // enable
evbya_old = regs0->evbya;
#ifdef MEMCFG_MOVE_OSDSUP
// 2004/06/12 yltseng
osdya_n = MN_OSDYA;
supya_n = MN_SUPYA;
#else
osdya_n = A_OSDYA;
supya_n = A_SUPYA;
#endif
#ifdef MODIFY_OSD_SHOW_NEW_STYLE_WINDOW
if(full_scrn & MESSAGE)//zhaoyanhua add 2003-12-18 10:12
DrawNewWindow();
#endif
switch(config)
{
case MEMORY_GRAPH_NTSC: // 736x480
{
memcfg_set_framebuf_anchor(anchor_gn);
set_fbuf_size( GP_LUMA_SIZE, GP_CHROMA_SIZE );
YCbCrGrapeMdCfg(720,480);
setvpp_linear_mode_width(736);
}
break;
case MEMORY_GRAPH_PAL: // 736x576
{
memcfg_set_framebuf_anchor(anchor_gp);
set_fbuf_size( GP_LUMA_SIZE, GP_CHROMA_SIZE);
YCbCrGrapeMdCfg(720,576);
setvpp_linear_mode_width(736);
}
break;
case MEMORY_GRAPH_SMALL: // 352x288
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -