📄 dsa.c
字号:
/*
** FILE
** dsa.c
**
** DESCRIPTION
** control DSA interface.
**
*/
#include "config.h"
#include "global.h"
#include "macro.h"
#include "regmap.h"
#include "dma.h"
//#include "cfont.h"//no used
#include "osd.h"
#include "sio.h"
//#include "vfd.h"
#include "epp.h"
#include "cd.h"
#include "ringbuf.h"
#include "func.h"
#include "util.h"
#include "dsa.h"
#include "set.h"
#include "servo.h"
#include "ircmd.h"
#include "gpio.h"
#include "iop.h"//2003/4/1
extern void ShowTitle(void);
//#define MON_INTR
//#define MONE_DSA_READ
//#define MONE_DSA_WRITE
//#define MONE_DSA_FOUND
//#define MONE_DSA_ERROR
//#define DSA_ERROR_STRING
//#define MONE_TIMEOUT_DSA
//#define MONE_VCD_ESP
//#define MONE_CDDA_ESP
#ifdef DSA_ERROR_STRING
typedef struct
{
BYTE errcode;
const char *str;
}
t_error_string;
const t_error_string dsa_error_table[] = {
{CDKIT_ERR_NONE, "No error"},
{CDKIT_ERR_FOCUS, "Focus error or no disc"},
{CDKIT_ERR_SUBCODE, "Subcode error, no valid subcode"},
{CDKIT_ERR_TOC, "TOC error, out of lead-in area"},
{CDKIT_ERR_RADIAL, "Radial error"},
{CDKIT_ERR_SLEDGE, "Fatal sledge error"},
{CDKIT_ERR_MOTOR, "Turn table motor error"},
{CDKIT_ERR_SEARCH_TIMEOUT, "Search time out"},
{CDKIT_ERR_SEARCH_BINARY, "Search binary error"},
{CDKIT_ERR_SEARCH_INDEX, "Search index error"},
{CDKIT_ERR_SEARCH_TIME, "Search time error"},
{CDKIT_ERR_ILLEGAL_COMMAND, "Illegal command"},
{CDKIT_ERR_ILLEGAL_VALUE, "Illegal value"},
{CDKIT_ERR_ILLEGAL_TIME, "Illegal time value"},
{CDKIT_ERR_COMMUNICATION, "Communication error"},
{CDKIT_ERR_TRAY, "Tray error"},
{CDKIT_ERR_HF_DETECTOR, "HF detector error"},
{0xff, (void *)0}
};
const char *dsa_error_string(BYTE x)
{
int i;
for(i = 0; dsa_error_table[i].errcode != 0xff; i++)
if(x == dsa_error_table[i].errcode)
return dsa_error_table[i].str;
return "Generic error";
}
#else
#define dsa_error_string(x) "DSA general error"
#endif
#define dsaResetCommandQueue() (dsa_cmd_head=dsa_cmd_tail=0)
#ifdef IOP_DSA
//#define dsaReadRx() (regs0->iop_data[2])
//#define dsaWriteTx(a) (regs0->iop_data[1] = (a))
#define dsaReadRx() (regs0->iop_data[2])
#define dsaWriteTx(a) (regs0->iop_data[3] = (a))
#else
#define dsaReadRx() (regs0->dsa_rx_reg)
#define dsaWriteTx(a) (regs0->dsa_tx_reg = (a))
#endif
#define SetQcodeTRK(c) (cd_qcode_trk=(c))
#define SetQcodeMM(c) (cd_qcode_mm=(c))
#define SetQcodeSS(c) (cd_qcode_ss=(c))
#define SetQcodeFF(c) (cd_qcode_ff=(c))
/*
** FUNCTION
** reset_dsa
**
** DESCRIPTION
** initialize DSA interface
*/
int reset_dsa(void)
{
#if 0
#ifdef UNIX
regs0->dsa_ctrl = 0x8000;
while(regs0->dsa_ctrl & 0x8000)
;
#endif
#if SUPPORT_DSA
/* clear receive registers. */
#ifdef IOP_DSA
SetDsaReset;
#else
do
{
(void)regs0->dsa_rx_reg;
} while(IsDsaRxFull);
#endif
#endif
//?dsa_state = 0;
dsaResetCommandQueue();
SetQcodeMM(0);
SetQcodeSS(0);
SetQcodeFF(0);
#ifdef SUPPORT_SFT_DSA
Sft_DSA_reset();
#endif
#endif
return 0;
}
/*
** FUNCTION
** dsaSendCommand(cmd)
**
** DESCRIPTION
** write a DSA command into DSA command queue
*/
#ifdef dsaSendCommand
#undef dsaSendCommand
#endif
#ifdef SUPPORT_COMBO
void dsaSendCommand(UINT32 cmd)
{
static BYTE mm = 0, ss = 2, ff = 0;
UINT32 rx = 0;
switch (cmd & 0xff00)
{
case DSA_OPEN_TRAY:
rx = Servo_command(SERVO_OPEN_CMD, 0, 0, 0);
break;
case DSA_CLOSE_TRAY:
rx = Servo_command(SERVO_CLOSE_CMD, 0, 0, 0);
break;
case DSA_PLAY:
rx = Servo_command(SERVO_PLAY_TRACK_CMD, cmd & 0x00ff, 0, 0);
break;
case DSA_PAUSE_RELEASE:
rx = Servo_command(SERVO_PLAY_CMD, 0, 0, 0);
break;
case DSA_PAUSE:
rx = Servo_command(SERVO_PAUSE_CMD, 0, 0, 0);
break;
case DSA_STOP:
rx = Servo_command(SERVO_STOP_CMD, 0, 0, 0);
break;
case DSA_READ_TOC:
case DSA_READ_LONG_TOC:
rx = Servo_command(SERVO_READTOC_CMD, cmd & 0x00ff, 0, 0);
break;
#ifdef READ_MUTI_SESSION
case DSA_GET_SESSION_INFO:
rx = Servo_command(SERVO_SESSION_CMD, 0, 0, 0);
break;
#endif
case DSA_GOTO_MM:
mm = cmd & 0x00ff;
break;
case DSA_GOTO_SS:
ss = cmd & 0x00ff;
break;
case DSA_GOTO_FF:
ff = cmd & 0x00ff;
rx = Servo_command(SERVO_GOTO_CMD, mm, ss, ff);
break;
case DSA_SET1_MODE:
rx = Servo_command(SERVO_SET_CMD, cmd & 0xff, 0, 0);
break;
case DSA_SET_VOLUME:
#ifdef PANASONIC_SERVO
rx = Servo_command(SERVO_SETVOL_CMD, cmd & 0xff, 0, 0);
#endif
break;
case DSA_SLEDGE_OFF_CMD:
#ifdef SUPPORT_COMBO
rx = Servo_command(SERVO_SLEDGE_OFF_CMD, cmd & 0xff, 0, 0);
#endif
case DSA_SET_MODE:
if((cmd & (CDDA_SPEED_1x | CDDA_SPEED_2x)) == CDDA_SPEED_2x)
rx = Servo_command(SERVO_SPEED_CMD, 2, 0, 0);
else if((cmd & (CDDA_SPEED_1x | CDDA_SPEED_2x)) == CDDA_SPEED_1x)
rx = Servo_command(SERVO_SPEED_CMD, 1, 0, 0);
default:
break;
}
/*
if(rx)
{
dsa_response(rx);
}
*/
}
#else
#ifdef LINEAR_PLAYBACK
void dsaSendCommand(UINT32 cmd)
{
}
#else
void dsaSendCommand(UINT32 cmd)
{
int head = dsa_cmd_head;
//int tail = dsa_cmd_tail;
dsa_cmd[head] = cmd;
dsa_cmd_head = WRAPr(head + 1, DSA_CMD_BUF_SIZE);
#if 0 //kevinlu 2002.7.29 not need send
if(IsDsaTxEmpty)
{
UINT32 x = dsa_cmd[tail];
dsaWriteTx(x);
#ifdef IOP_DSA
SetDsaTxFull;
#endif
dsa_cmd_tail = WRAPr(tail + 1, DSA_CMD_BUF_SIZE);
#ifdef MONE_DSA_WRITE
psprintf(linebuf, "DSAW: %04x\n", x);
epp_write_wait(linebuf);
#endif
}
#endif
}
#endif
#endif
/*
** FUNCTION
** dsa_response
**
** DESCRIPTION
** handle CD-kit returned status report.
*/
/*static inline*/
void dsa_response(UINT32 c)
{
BYTE low;
low = c & 0xff;
if(IsDSAReadTOC())
{
switch (c & 0xff00)
{
case CDKIT_TOC_MIN_TRK:
cd_trk_lo_now = cd_trk_lo = low;
break;
case CDKIT_TOC_MAX_TRK:
cd_trk_hi = low;
break;
case CDKIT_ERROR:
break;
}
//cd_trk_lo_now = cd_trk_lo = 1;
}
if(IsDSAReadLONGTOC())
{
switch (c & 0xff00)
{
case CDKIT_LONG_TOC_TRK:
#ifdef READ_MUTI_SESSION
if(low == 0xb0)
SessionNs = 1;
#endif
cd_trk_no = low;
cd_trk_cna = 0xff;
cd_trk_mm = 0xff;
cd_trk_ss = 0xff;
break;
case CDKIT_LONG_TOC_CnA:
cd_trk_cna = low;
break;
case CDKIT_LONG_TOC_MM:
cd_trk_mm = low;
break;
case CDKIT_LONG_TOC_SS:
cd_trk_ss = low;
break;
case CDKIT_LONG_TOC_FF:
if(cd_trk_no <= TRACK_INFO_MAX
&& cd_trk_cna != 0x00ff && cd_trk_mm != 0x00ff &&
cd_trk_ss != 0x00ff)
{
settrkmsf(cd_trk_no, MSFC(cd_trk_cna, cd_trk_mm, cd_trk_ss, low));
}
break;
case CDKIT_ERROR:
break;
}
}
switch (c & 0xff00)
{
UINT32 max, min, now;
/*
** CDKIT_ACT_TRK track number information
*/
case CDKIT_ACT_TRK:
#ifdef MONE_DSA_READ
psprintf(linebuf, "DSAR: %04x\n", c);
epp_write(linebuf);
#endif
//epp_write("trk change ....\n");
//Joseph 20030108 disable for CDDA FF out of RepAB range
/*if((cd_type_loaded == CDDA) && IsUIStateSearch())
{
rep_ab_mode = REPEAT_AB_IDLE;
break;
}*/
if(IsAVDMediaTimeout())
break;
RetryFlyingDisk = 0;
if(cd_trk_now >= cd_trk_hi)
max = gettrkmsf_leadout();
else
max = gettrkmsf(cd_trk_now + 1) & 0x00ffff00;
min = gettrkmsf(cd_trk_now) & 0x00ffff00;
now = s_msf & 0x00ffff00;
#ifdef SUPPORT_OKO_DISC
if(bDiscType==CD_OKO&&max<min) //For Mr.OKO DISC.
{
max = gettrkmsf_leadout();
}
#endif
switch (play_state)
{
case VCD_STATE_NORMAL:
case VCD_STATE_STEP:
case VCD_STATE_SLOW:
case VCD_STATE_FREEZE:
if(!IsNMNorm())
break;
#if 0
if(!goto_time)
{
BYTE period;
period =
(((max >> 16) & 0xff) * 60 + ((max >> 8) & 0xff)) -
(((now >> 16) & 0xff) * 60 + ((now >> 8) & 0xff));
if(cd_trk_now != low)
{
if((period >= 5))
now = addmsf_ss(now, 7); /*2001/10/17/ for goto last few sec for each track */
else
now = addmsf_ss(now, 4); //JJDing Modified .2002/11/06. To skip the Gap./
}
}
else
#endif
now = addmsf_ss(now, 3);
break;
}
#ifdef MONE_TIMEOUT_DSA
psprintf(linebuf, "%x %x %x %x TrkChg\n", v11_trk_now, cd_trk_now, low,
cd_trk_hi);
epp_write(linebuf);
#endif
#ifdef SUPPORT_ESP
if((shock_state & (SHOCK_ENABLE | SHOCK_ENABLE_VCD)))
{
if(low < 100) //kevinlu 2002/10/7 09:31PM
{
SetQcodeTRK(low);
break;
}
else
{
//epp_write_wait("Qcode Lead Out\n");
SetQcodeTRK(low);
}
break;
}
else
#endif
{
if(cd_trk_now && cd_trk_now != low)
{
cd_msf_changed |= MSF_TRK_CHANGED;
if(GetIntrMask() & INTR_TRACK_CHANGE)
{
if((now < min) || (now >= max))
{
//if(timeout_playback /*&& (psd_state & PSD_SEL_LIST)*/)
// return;
#ifdef MONE_TIMEOUT_DSA
psprintf(linebuf, "TrkChg Timeout max:%x min:%x now:%x\n", max,
min, now);
epp_write(linebuf);
#endif
cd_trk_now = low;
SetIntrFlag(GetIntrFlag() | INTR_TRACK_CHANGE);
#if SUPPORT_FF_ACROSS_TRACK
if(!adv_search_time || (IsUIStateBackward() && low == 1) ||
IsPBCOn() || CheckUIProgState(PLAY_PROGRAM))
{
//epp_write_wait("timeout 1\n");
AVD_SetMediaTimeout();
}
else
{
if(adv_search_time && !IsPBCOn() && (rep_ab_mode == REPEAT_FIND_A)) //charles 2002/9/13
rep_ab_mode = REPEAT_AB_IDLE;
v11_trk_now = low; //jhuang 2002/7/26 forе癶
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -