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

📄 dsa.c

📁 一个两碟控制的VCD的代码,两碟之间的转动及连续播放,已大量生产的CODE.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* Copyright 1996, ESS Technology, Inc.					*/
/* SCCSID @(#)dsa.c	1.133 10/22/98 */

/*
 * $Log$
 */

/*
 * Many of the DSA routines are actual SERVO routines if -DSERVO
 */ 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "buffer.h"
#include "common.h"
#include "const.h"
#include "cd.h"
#include "constvar.h"
#include "debug.h"
#include "display.h"
#include "dsa.h"
#include "fsosd.h"
#include "ioport.h"
#include "macros.h"
#include "sysinfo.h"
#include "tdm.h"
#include "timedef.h"
#include "util.h"
#include "mvd.h"
#include "play.h"
#include "vcxi.h"
#include "vscale.h"
#include "xport.h"
#include "vp.h"
#include "echo.h"
#include "sysinfo.h"
#include "config.h"
#include "custom.h"
#include "keydef.h" 
                   
#ifdef P315
#include "panel.h"
#endif

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

#ifdef SERVO
#include "servo.h"
#endif SERVO


#if 0
#define DPRINTF(a) printf a
#else
#define DPRINTF(a)
#endif

/************************************************************************
 *   DSA variables , for CD control					*
 ************************************************************************/
#ifndef CLEAR_DSA_ACK		/* We'll get rid of this via config.h.	*/
/*
 * In our hardware, AUX0 and AUX1 are open collector pads.
 * AUX2 and AUX3 are tristate which requires external pull-up resistors
 * for our application.
 *
 * We use
 *	AUX0	as	DSA ACK
 *	AUX1	as	DSA DATA
 *	AUX3	as	DSA STROBE
 */
#ifdef P315
#define  DSA_ACK		0x04	/* AUX0 is connected to ACK	*/
#define  DSA_DA			0x02	/* AUX1 is connected to DATA	*/
#define  DSA_ST			0x01	/* AUX3 is connected to STROBE	*/
#define  DSA_STEN		0x20	/* AUX3 is tristate, so this	*/
#else
#define  DSA_ACK		0x01	/* AUX0 is connected to ACK	*/
#define  DSA_DA			0x02	/* AUX1 is connected to DATA	*/
#define  DSA_ST			0x08	/* AUX3 is connected to STROBE	*/
#define  DSA_STEN		0x20	/* AUX3 is tristate, so this	*
					 * enables output.		*/
#endif

#ifdef P315
/* Macros to set DSA output's value */
#define	CLEAR_DSA_ACK	CLEAR_AUX2
#define	CLEAR_DSA_DATA	CLEAR_AUX1
#define	CLEAR_DSA_STROBE	CLEAR_AUX0

#define	SET_DSA_ACK	TRISTATE_AUX2
#define	SET_DSA_DATA	TRISTATE_AUX1
#define	SET_DSA_STROBE	TRISTATE_AUX0


/* Macros to evaluate DSA input's value */
#define	DSA_ACK_HIGH		(mvd[riface_aux1] & DSA_ACK)
#define	DSA_DATA_HIGH		(mvd[riface_aux1] & DSA_DA)
#define	DSA_STROBE_HIGH		(mvd[riface_aux1] & DSA_ST)

#define	DSA_ACK_LOW		(!DSA_ACK_HIGH)
#define	DSA_DATA_LOW		(!DSA_DATA_HIGH)
#define	DSA_STROBE_LOW		(!DSA_STROBE_HIGH)

#else

/* Macros to set DSA output's value */
#define	CLEAR_DSA_ACK	CLEAR_AUX0
#define	CLEAR_DSA_DATA	CLEAR_AUX1
#define	CLEAR_DSA_STROBE	CLEAR_AUX3

#define	SET_DSA_ACK	TRISTATE_AUX0
#define	SET_DSA_DATA	TRISTATE_AUX1
#define	SET_DSA_STROBE	TRISTATE_AUX3


/* Macros to evaluate DSA input's value */
#define	DSA_ACK_HIGH		(mvd[riface_aux1] & DSA_ACK)
#define	DSA_DATA_HIGH		(mvd[riface_aux1] & DSA_DA)
#define	DSA_STROBE_HIGH		(mvd[riface_aux1] & DSA_ST)

#define	DSA_ACK_LOW		(!DSA_ACK_HIGH)
#define	DSA_DATA_LOW		(!DSA_DATA_HIGH)
#define	DSA_STROBE_LOW		(!DSA_STROBE_HIGH)

#endif	/* P315 */
#endif /* CLEAR_DSA_ACK */

/* dsa commands */
#define DSA_STOP		0x02
#define	DSA_PAUSE		0x04
#define	DSA_PAUSERELEASE	0x05
#define DSA_OPEN		0x0a
#define DSA_CLOSE		0x0b
#define	DSA_GO_MIN		0x10
#define	DSA_GO_SEC		0x11
#define	DSA_GO_FRM		0x12
#define DSA_LTOC		0x14	/* Long table of content	*/
#define DSA_MODE		0x15
#define DSA_GET_DISC_STATUS	0x50
#define	DSA_DAC			0x70
#define DSA_ROTATE_CLOCKWISE	0x80
#define DSA_ROTATE_ANTI_CLOCKWISE	0x81
#define DSA_CLEARTOC            0x6a     /* For CD7001 */

/* servo commands */
#define	SERVO_FOUND		0x01
#define	SERVO_STOPPED		0x02
#define SERVO_DISC_STATUS	0x03
#define	SERVO_ERROR		0x04
#define	SERVO_MOVING		0x0b
#define	SERVO_OPENED		0x0c
#define	SERVO_CLOSED		0x0d
#define	SERVO_TRACK		0x10
#define	SERVO_INDEX		0x11
#define	SERVO_MIN		0x12
#define	SERVO_SEC		0x13
#define	SERVO_MODE_STATUS	0x17
#define	SERVO_LTOC_TRACK	0x60
#define	SERVO_LTOC_CTL_ADR	0x61
#define	SERVO_LTOC_SMIN		0x62
#define	SERVO_LTOC_SSEC		0x63
#define	SERVO_LTOC_SFRM		0x64
#define	SERVO_DAC_STATUS	0x70
#define SERVO_CAROUSEL_MOVING	0x80
#define SERVO_CAROUSEL_STOPPED	0x81

#define	SERVOERR_NODISC		0x2
#define SERVO_CLEARTOCED        0x6a                /* For CD7001 */


#ifdef SERVO
/*victor nov*/
extern int kickfg,SERVO_update_second,SERVO_update_track;
extern int Job_schedule;
extern int SERVO_stop();
extern int SERVO_close();
extern int SERVO_open();
extern int SERVO_search();
extern int SERVO_new_Qcode;
extern unsigned int SERVO_Qarray_new[],SERVO_Qarray_current[];
extern int target_min, target_sec, target_frame;
extern int GFS_ok, SERVO_mode;
unsigned char Qcode[10];
/* 
 *  unsigned int Qtemp[50];
 */
unsigned int temptemp;
#endif SERVO


extern int vcd20_start, vcd20_end;

/* 
 * CD-module's mode bits
 * 2:0	sets the speed
 *		000: illegal
 *		001: normal CD-DA speed
 *		010: double speed
 *		other values are reserved
 * 3	0: audio mode; 1: CD-ROM mode
 * 5:4	Actual Title, time, index (ATTI) setting
 *		00: no title, index, or time send during play modes
 *		01: sending title, index, and absolute time (min/sec)
 *		10: sending title, index and relative time  (min/sec)
 *		11: reserved
 * 7-6	reserved
 */	
#define	MODE_SPEED_NORMAL	0x1
#define	MODE_SPEED_DOUBLE	0x2
#define	MODE_AUDIO		0x0
#define	MODE_CDROM		0x8
#define	MODE_ATTI_NONE		0x0
#define	MODE_ATTI_ABS		0x10
#define	MODE_ATTI_REL		0x20

/*
 * Set DAC mode
 */
#define	DAC_IIS_FS		0x1
#define	DAC_IIS_2FS		0x2
#define	DAC_IIS_4FS		0x3
#define	DAC_SONY16_FS		0x4
#define	DAC_SONY16_2FS		0x5
#define	DAC_SONY16_4FS		0x6
#define	DAC_SONY18_FS		0x7
#define	DAC_SONY18_2FS		0x8
#define	DAC_SONY18_4FS		0x9


/* DSA transmission state (tran_state) */
#define D_IDLE       		0
#define D_SYNC01     		1
#define D_SYNC02     		2
#define D_SYNC03     		3
#define D_TRAN01     		4
#define D_TRAN02     		5
#define D_TRAN03     		6
#define D_ACK02      		7

/* DSA receiving state (rec_state) */
#define R_IDLE	    		0
#define R_W_SYNC1    		1
#define R_REC0       		2
#define R_REC1       		3
#define R_W_ACK0     		4
#define R_W_ACK1     		5

#ifdef    SONY84412_ERR110
int dsa_stop_timer = 0;
#define   CLEAR_FOK             CLEAR_EAUX0
#define   TRISTATE_FOK          TRISTATE_EAUX0
#endif

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

#ifdef SERVO_6003
int             disc_6003_status;  	/* 6003 disc status */
int             eject_6003_retry;  	/* Philips 6003 loader open/clese *
					 * retry flag */
int             power_6003_timer = 0;  	/* power on/off delay time */
#endif

#ifdef  LEDON                        /* MEIXINDA*/
unsigned char    led_flag = 0;
PRIVATE  int     led_timer = 0;
PRIVATE unsigned char    led_state = 0;
#endif



int             stop_timer;
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 int servo_track_changed; /* A flag indicates a new track has 
				     come. */

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

int		currentTVmode;	/* TV_NTSC or TV_PAL */
int 		bcd_num_of_track; /* used in OSD */
int		save_ramcode = -1;
unsigned char	*CDI_ptr;

int read_tv_system = 2;

static int cdda_glbTimer;	/* record the time when we start cdda. */
/************************************************************************
 * Variables local to this module					*
 ************************************************************************/
PRIVATE unsigned char retry_go = 0;
PRIVATE	int	dsa_flag;	/* DSA flag. Indicate whether DSA 	*
				 * transmission/reciving is completed.	*/
PRIVATE	int	dsa_word;	/* DSA result from servo		*/
PRIVATE	int	dsa_rcv_mask;	/* Mask for dsa_receive routine.	*/
PRIVATE	int	tran_state = D_IDLE; /* trans_dsa state variable	*/
PRIVATE	int	rec_state = R_IDLE; /* rec_dsa state variable		*/
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 RDSATimeCount;

PRIVATE	unsigned int	servo_index;/* Index number reported by servo	*/
PRIVATE	unsigned int	servo_min;  /* Relative min reported by servo	*/
PRIVATE	unsigned int	servo_sec;  /* Relative sec reported by servo	*/
PRIVATE unsigned int	CDDA_play_time;
PRIVATE unsigned int    CDDA_track_start_time;

IMPORT int DiscMode;

/************************************************************************
 * Debug variables							*
 ************************************************************************/
DEBUGVAR(go_time, 0);		/* The last dsa_go time			*/
DEBUGVAR(dbgDSAclose, 0);	/* Debug variable for dsa_close routine	*/
DEBUGVAR(dbgDSAdac, 0);		/* Debug variable for dsa_dac 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		*/

/************************************************************************
 * Functions declared and used within this module only.			*
 ************************************************************************/
PRIVATE	int		dsa_dac(int);
PRIVATE	int		dsa_mode(int);
PRIVATE	int		dsa_go(unsigned int);
PRIVATE	int		dsa_go_step_by_step(unsigned int);
PRIVATE	void		init_dsa(void);
PRIVATE	int		receive_dsa_all(int);
void            trans_dsa(int, int);
PRIVATE	int		processCDI(unsigned int *, int);
PRIVATE	void		reset_dsa_go();
#ifdef DEBUG_OSD    		/* for debugging */
PRIVATE unsigned int    reverse_data(unsigned int);
void 			debug_osd(char *, unsigned int , int);
#endif

/************************************************************************
 * Imported functions							*
 ************************************************************************/
IMPORT	void		microEngine();
IMPORT	void		DISP_cigam();
IMPORT	void		DISP_naicigam();
void CUST_init()
{
#ifdef SERVO
    vcx_cd_drive = CD_SONY;
#else
    vcx_cd_drive = CD_SONY;
#endif
#ifdef P315
    vcx_cd_drive = CD_MITSUBISHI;
#endif
    vcx_xfer_mode = 5; 
}

void dsa_reset()
{
    servo_info = 0;
    servo_min = 0;
    servo_sec = 0;
}

#if 0 /* TESTING */

int abc;
int abc_data[100];
extern int q;

void test_dsa()
{
    switch (abc) {
    case 1: 
	dsa_open();
	break;
    case 2: 
	dsa_close();
	break;
    case 3: 
	initMicroObject();
	break;
    case 4: 
	initCD();
	break;
    case 5:
	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 DIGEST
    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;
    }

⌨️ 快捷键说明

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