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

📄 dsasl.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 4 页
字号:
/* Copyright 2005, ESS Technology, Inc.					*/
/* SCCSID @(#)dsasl.c	1.00 03/09/05 */

/*
 * $Log$
 */

/*
 * Removed SERVO..servo targets shall use separate "dsa" modules
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "vcxi.h"
#include "buffer.h"
#include "const.h"
#include "cd.h"
#include "debug.h"
#include "display.h"
#include "dsa.h"
#include "micro.h"
#include "tdm.h"
#include "timedef.h"
#include "util.h"
#include "play.h"
#include "av_play.h"
#include "vscale.h"
#include "xport.h"
#include "vp.h"
#include "echo.h"
#ifdef TWO_FIELDS_OSD
#include "cg.h"
#else
#include "fsosd.h"
#endif

#ifdef FRACTINT
#include "fractint.h"
#endif

#ifdef SILAN_SERVO
#include "servo.h"
#include "gpio.h"
#endif SILAN_SERVO

#ifdef MP3
#include "mp3.h"
#endif MP3

#ifdef ANTI_SHOCK
#include "recorder.h"
#endif ANTI_SHOCK

/*------------------------------------------------------------------------
 * Debugging macros
 *------------------------------------------------------------------------*/
#ifdef DEBUG_OSD
extern int osdreg;
#define CPRINTF(a,b) {osdreg+=3;if(osdreg>13)osdreg=1;debug_osd(a,b,osdreg);}
#else
#define CPRINTF(a,b)
#endif

#if 0
int bpt;
#define BREAKPOINT(x) {bpt=x;while(bpt) VCX_service();}
#else
#define BREAKPOINT(x)
#endif

/************************************************************************
 *   DSA variables , for CD control					*
 ************************************************************************/
#ifdef SILAN_SERVO
IMPORT char	kickfg,SERVO_new_Qcode, SERVO_mode;
IMPORT unsigned char SERVO_Qarray_new[], SERVO_Qarray_current[];
IMPORT uint 	SERVO_target_msf;
IMPORT int      servo_kick_timer,servo_kick_timer_interval;
IMPORT int      dsa_word;

IMPORT int      SERVO_stop(int);
IMPORT void     SERVO_delay_n_ms(int n_ms);

#ifdef TOP_LOADER
char top_loader	= 1;		//FOR SERVOSL.C USE 
#else
char top_loader	= 0;
#endif 

#ifdef DOOR_HALF_SPEED
char door_off_time = 10;		//FOR SERVOSL.C USE 
char door_on_time  = 20;		//on_time  + off_time <= 50 ms
								
#else
char door_off_time = 0;
char door_on_time  = 0;
#endif 


#ifdef FOCUS_MOTOR_OFF
char motor_off = 1;				//FOR SERVOSL.C USE 								
#else
char motor_off = 0;
#endif 



#endif /* SERVO */

/************************************************************************
 * Global variables							*
 ************************************************************************/

CDINFO		CDinfo;
int		power_up = 1;	/* Flag is set to 0 after system starts. */
int		num_of_track;	/* # of tracks in the CD 		*/
int		first_seg_ad;	/* BCD sector location for first segment*
				 * address. Comes from INFO.VCD. It is	*
				 * always in MM:SS:FF form. Should be	*
				 * XXYY00. In most case, XX is 00 and 	*
				 * YY is 05 but there is no guarantee.	*
				 * (From INFO.VCD)			*/

int		CDinited = 0;	/* 0: key info of CD has not been read	*
				 * 1: CD info has been read/stored	*/

char		forceDSAabort = 0;/* Force DSA to quit and return as if	*
				 * command succeed.			*/
unsigned int	err_code = 0;	/* Error code from DSA routines		*/
unsigned char 	servo_track_changed; /* A flag indicates a new track	*
				      * has come. */

unsigned int	servo_info;	/* store TTMMSSFF info from servo.	*/

int		currentTVmode;	/* TV_NTSC or TV_PAL */
int 		bcd_num_of_track; /* used in OSD */
unsigned char	*CDI_ptr;
IMPORT  int open_delay;
IMPORT  unsigned char servo_next_m ;

/************************************************************************
 * Variables local to this module					*
 ************************************************************************/
PRIVATE	int	currDSAmode = 0;/* Current CDROM's DSA mode. We'll only	*
				 * issue dsa_mode command if the new	*
				 * mode is different from the current	*
				 * mode.				*/

PRIVATE unsigned int	CDDA_play_time;	/* Play time for current track	*/
PRIVATE unsigned int    CDDA_track_start_time;

/* States in dsa_go_step_by_step */
#define	DSA_GO_INIT		0
#define DSA_GO_STILL_SEARCHING	1
#define DSA_GO_FOUND_TARGET	2
PRIVATE int	dsa_go_state = DSA_GO_INIT;

#define PLAY_SECTOR_CONST	        0x5
#define GET_SECTOR_WAIT		        45
#define PLAY_SECTOR_WAIT	        90
#define GET_SECTOR_WAITOK	        0x5
#define PLAY_SECTOR_WAITOK	        0x5


/************************************************************************
 * Debug variables							*
 ************************************************************************/
DEBUGVAR(go_time, 0);		/* The last dsa_go time			*/
DEBUGVAR(dbgDSAclose, 0);	/* Debug variable for dsa_close routine	*/
DEBUGVAR(dbgDSAgo, 0);		/* Debug variable for dsa_go routine	*/
DEBUGVAR(dbgDSAmode, 0);	/* Debug variable for dsa_mode routine	*/
DEBUGVAR(dbgDSAopen, 0);	/* Debug variable for dsa_open routine	*/
DEBUGVAR(dbgDSApause, 0);	/* Debug variable for dsa_pause routine	*/
DEBUGVAR(dbgDSApauserelease, 0);/* Debug variable for dsa_pauserelease	*/
DEBUGVAR(dbgDSArelease, 0);	/* Debug variable for dsa_release	*/
DEBUGVAR(dbgDSArcv, 0);		/* Debug variable for receive_dsa	*/
DEBUGVAR(dbgDSAstop, 0);	/* Debug variable for dsa_stop routine	*/
#ifdef SERVO_7
DEBUGVAR(dbgDSAcleartoc,0);     /* Debug variable for dsa_cleartoc routine */
#endif
DEBUGVAR(dbgPlaySector, 0);	/* Can't find the given sector from 20	*
				 * frames ealier.			*/
DEBUGVAR(dbgGetSector, 0);	/* Can't get the sector (because SYNC	*
				 * pattern is not found).		*/
DEBUGVAR(glbSec, 0);		/* Global time in seconds		*/
DEBUGVAR(dbgTransDsa, 0);	/* Debug variable for trans_dsa		*/
DEBUGVAR(dbgReceiveDsa, 0);	/* Debug variable for receive_dsa	*/
DEBUGVAR(dbgServiceVcxi, 0);	/* Number of time service_vcxi is called*/
DEBUGVAR(dbgSafeServiceVcxi, 0);/* Number of "save" service_vcxi calls	*/
DEBUGVAR(dbgMaxRDSA, 0);	/* Max. RDSATimeCount			*/
DEBUGVAR(dbgMaxRcvAll, 0);	/* Max. number of receive_dsa calls	*
				 * before we get a full piece of data	*/
DEBUGVAR(dbgMaxRcvElapse, 0);	/* Max. elapsed time for receive_dsa_all*/
DEBUGVAR(dbgMaxTran, 0);	/* Max. number of trans_dsa loop count	*/
DEBUGVAR(dbgMaxTranElapse, 0);	/* Max. elapsed time for trans_dsa	*/
DEBUGVAR(dbgServoRcv, 0);	/* receive_dsa_all time out		*/
DEBUGVAR(dbgServoTran, 0);	/* trans_dsa time out			*/
DEBUGVAR(dbgMaxLtocCnt, 0);	/* Max. number of LTOC replies		*/

/************************************************************************
 * Global functions
 ************************************************************************/
PUBLIC	int		dsa_go(unsigned int);

/************************************************************************
 * Functions declared and used within this module only.			*
 ************************************************************************/
PRIVATE	int		dsa_go_step_by_step(unsigned int);
PRIVATE	void		init_dsa(void);
PRIVATE	int		receive_dsa_all(int);
PRIVATE	void		reset_dsa_go();
IMPORT int		SERVO_close();
IMPORT int		SERVO_open();

IMPORT	int		servo_pause(void);
IMPORT	int		servo_pause_release(void);
IMPORT	void	RESET_servo_flag(void);
/************************************************************************
 * Imported functions							*
 ************************************************************************/
IMPORT	void		DISP_cigam(int);
IMPORT	void		DISP_naicigam(void);

void CUST_init()
{
#ifdef MSERVO
    vcx_cd_drive = CD_MATSUSHITA;
#else
    vcx_cd_drive = CD_SONY;
#endif


#ifdef EXT_INPUT
    vcx_ext_format = CD_SONY;
#endif

    vcx_xfer_mode = 5;
}

void dsa_reset()
{
    servo_info = 0;
}

#if 0 /* TESTING */

int abc;
/*
int abc_data[100];
*/
IMPORT int q;

void test_dsa()
{
    switch (abc) {
    case 1:
	dsa_open();
	break;
    case 2:
	dsa_close(0);
	break;
    case 3:
	initMicroObject();
	break;
    case 4:
	initCD();
	break;
    case 5:
	dsa_stop();
/*
	dsa_ltoc(abc_data, 100);
*/
	break;
    case 6:
	dsa_go(0x120000);
	system_reset();
	system_start();
	begCDtime = 0x120030;
	endCDtime = 0x999999;
	break;
    case 7:
	fuzzyPlaySector(0x120000, 2324);
	break;
    case 8:
	begCDtime = 0x120004;
	endCDtime = 0x999999;
	dsa_go(0x120000);
	system_reset();
	system_start();
 	TDM_isCDDA = 0;
	XPORT_play20video(XPORT_OFFSET_FUZZY_PLAY, 0xe0);
	TDM_turn_on();
	break;
    case 9:
	playSectors(0x120000, 0xe0, 2324);
	begCDtime = 0x120004;
	endCDtime = 0x999999;
	break;
    case 10:
	system_reset();
	system_start();
	playSectors(0x500, 0x1e2, 2324);
	begCDtime = 0x500;
	endCDtime = 0x3500;
	break;
    case 11:
	fill_screen(1);
	break;
#ifdef 0
    case 12:
	digestPage(0);
	q = 9;
	break;
#endif
    case 13:
	TDM_off = 1;
	while (TDM_off)
	    ;

	begCDtime = 0x120004;
	endCDtime = 0x999999;
	dsa_go(0x120000);
	system_reset();
	system_start();
 	TDM_isCDDA = 0;
	XPORT_play20video(XPORT_OFFSET_FUZZY_PLAY, 0xe0);
	TDM_turn_on();
	break;
    case 14:
/*
	system_reset();
	system_start();
	playCDDA(0x010000, 0x100000);
	TDM_turn_on();
*/
	break;
    default:
	break;
    }

    abc = 0;
}

#endif

/*
 * Service microcontroller, CD ROM (etc)
 */

void CUST_background()
{
    /*
     * If the NTSC/PAL switch is changed, then change TV mode
     * accordingly.
     *
     * NOTE: Enable POLL_TV_SWITCH only if your system has
     * dedicated pin for TV switch. Don't enable POLL_TV_SWITCH
     * if the TV switch is shared(i.e. VFD). In that case,
     * the TV mode can only be detected at power-up.
     */
#ifdef POLL_TV_SWITCH
#ifdef DSC
    if (!IS_POWER_DOWN)
#endif
    {
	PREPARE_DETECTION;
	if (currentTVmode == TV_NTSC) {
	    if (!DETECT_NTSC)  {
		play_change_tv_mode();
	    }
	} else {
	    if (DETECT_NTSC) {
		play_change_tv_mode();
	    }
	}
    }
#endif /* POLL_TV_SWITCH */


    if (power_up) {
	/* if in power-down mode, avoid doing power-up stuff */
	if (!IS_POWER_DOWN) {
	    initMicroObject();
	    init_dsa();
	    initCD();		/* Customize your init CD routine	*/
	}
	power_up = 0;		/* Reset after initCD() 		*/
    } else {
	DEBUGINC(1, dbgServiceVcxi);
	receive_dsa();
/*
	test_dsa();
*/
	DEBUGINC(1, dbgSafeServiceVcxi);
	DEBUGASSIGN(glbSec, (glbTimer / ((currentTVmode == TV_PAL) ? 50 : 60)));

#ifdef TWO_FIELDS_OSD
        CG_service(1);
#else
        OSD_schedule_check();
#endif

	upper_state_machine(1);/* Customize your play state machine	*/
    }
}


/************************************************************************
 * Utility routines							*
 ************************************************************************/
/*
 * Read "num" sectors into the start of the system buffer. This routine is
 * only called to get system information (not MPEG A/V data)
 *
 * Inputs:
 *	begin:   CD sector time in MMSSFF (each is in BCD)
 *	num:	 number of CD sectors to copy. This number has to be
 *		 smaller than sys_buf_size/size.
 *	dest:
 *		non-zero: data to VBV
 *		       0: data to ABV
 *
 * Return:
 *	-2:	force abort
 *	-1:	failed dsa_go() or servo problem
 *	 0:	if failed
 *	 1:	if successful
 */
int getSectors(begin, num, dest)
unsigned int begin;
int num, dest;
{
    unsigned int dsatime, tmp;
    unsigned int next_time;
    int xfer_done;
    int counter;
    int timeout;
#ifdef MP3CDG
    int beg1, end1, end_status;
    int cur_time, stop_time;
#endif


    /* target time check..
     * make sure it's larger than Leadin + "adjustment".
     */
    if (CDtime_check(begin) || (begin < 0x204)) return(0);

#ifdef MP3CDG
    if (MP3CDG_started){
        beg1 = begCDtime; end1 = endCDtime;
        cur_time = currCDtime; stop_time = stopCDtime;
        end_status = end_of_play;
    }
#endif

    begCDtime = begin;
    endCDtime = adjCDtime(begCDtime, logical2physical(num), 1);

    /* Set DSA_GO time to be 4d frames ealier than user specified	*/
		dsatime	   = adjCDtime(begCDtime, 0x25, -1);	//game 1,st track

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -