📄 dsasl.c
字号:
/* 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 + -