?? dsa.c
字號:
/* 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 + -