⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcfg.c

📁 Sunplus 8202S source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -