📄 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"
#include "sio.h"
#include "vfdfunc.h"
#include "epp.h"
#include "cd.h"
#include "ringbuf.h"
#include "func.h"
#include "util.h"
#include "cderr.h"
int cd_func_stop(void); /*jhuang 2000/11/27 reduce warning*/
void ServoRecoverFail(void); /*jhuang 2000/11/27 reduce warning*/
static inline void dsa_response(UINT32 c);
#ifdef SUPPORT_SFT_DSA
#include "ircode.h" //kenny 891117
#endif
#ifdef SUPPORT_EXT_HW_DSA
#include "ircode.h" //kenny 891122
#endif
#include "ircmd.h"
#include "dsa.h"
//#include "servo.h"
//#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_DSA_TIMEOUT
//#define MONE_INTR
#ifdef SUPPORT_SFT_DSA
/****************************************************************************/
/* kevinlu 2001.5.30 */
/****************************************************************************/
#ifndef SUPPORT_COMBO
BYTE sft_dsa_cmd_head, sft_dsa_cmd_tail;
UINT16 sft_dsa_cmd[DSA_CMD_BUF_SIZE];
#endif
void Sft_dsa_isr(void);
BYTE Sft_DSA_ReceiveCmd(void);
BYTE Sft_DSA_SendCmd(void);
void Sft_DSA_reset(void);
#define DSA_IDLE 0
#define DSA_SUCCESS 1
#define DSA_FAIL 2
#define DSA_RECEIVE 1
#define DSA_SEND 2
#define DSA_ERR_RESPONSE 0xfe
#define NO_DSA_COMMAND_REQ 0xff
#define DSA_DUMMY 0x00
#define MSB(x) (((x)>>15)&0x0001)
#define DSA_250MS 150
#define DAT_PIN 0 //PIO0
#define ACK_PIN 1 //PIO1
#define STB_PIN 8 //PIO8
#define SetDAT_READ() {regs0->gpio_cfg &= ~(1<<DAT_PIN); }
#define SetACK_READ() {regs0->gpio_cfg &= ~(1<<ACK_PIN); }
#define SetSTB_READ() {regs0->gpio_cfg &= ~(1<<STB_PIN); }
#define GetDSA_DAT() ((regs0->gpio_sts &(1<<DAT_PIN))>>DAT_PIN)
#define GetDSA_ACK() ((regs0->gpio_sts &(1<<ACK_PIN))>>ACK_PIN)
#define GetDSA_STB() ((regs0->gpio_sts &(1<<STB_PIN))>>STB_PIN)
#define SetDSA_DAT(x) {regs0->gpio_cfg |= (1<<DAT_PIN); if(x) regs0->gpio_sts |=(1<<DAT_PIN); else regs0->gpio_sts &=(~(1<<DAT_PIN));/*regs0->gpio_cfg &= (~(1<<DAT_PIN));*/}
#define SetDSA_ACK(x) {regs0->gpio_cfg |= (1<<ACK_PIN); if(x) regs0->gpio_sts |=(1<<ACK_PIN); else regs0->gpio_sts &=(~(1<<ACK_PIN));/*regs0->gpio_cfg &= (~(1<<ACK_PIN));*/}
#define SetDSA_STB(x) {regs0->gpio_cfg |= (1<<STB_PIN); if(x) regs0->gpio_sts |=(1<<STB_PIN); else regs0->gpio_sts &=(~(1<<STB_PIN));/*regs0->gpio_cfg &= (~(1<<STB_PIN));*/}
BYTE bDSATimer=DSA_250MS;
static BYTE dsa_state_sel=0;
static BYTE dsa_status_sel=0;
BYTE dsa_loop_count=0;
UINT16 dsa_send_data;
UINT16 dsa_receive_data;
#endif
#define IsCdSeeking() (regs0->cddsp_control & RF_CDDSP_SEEK)
#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)
#define dsaReadRx() (regs0->dsa_rx_reg)
#define dsaWriteTx(a) (regs0->dsa_tx_reg = (a))
#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)
{
#ifdef UNIX
regs0->dsa_ctrl = 0x8000;
while (regs0->dsa_ctrl & 0x8000)
;
#endif
#if SUPPORT_DSA
/* clear receive registers. */
do {
(void)regs0->dsa_rx_reg;
} while (IsDsaRxFull);
#endif
//dsa_state = 0;
dsaResetCommandQueue();
SetQcodeMM(0);
SetQcodeSS(0);
SetQcodeFF(0);
#ifdef SUPPORT_SFT_DSA
Sft_DSA_reset();
#endif
return 0;
}
/*
** FUNCTION
** dsaSendCommand(cmd)
**
** DESCRIPTION
** write a DSA command into DSA command queue
*/
#ifdef dsaSendCommand
#undef dsaSendCommand
#endif
/*kevinlu 2000.9.15*/
#ifdef SUPPORT_COMBO
void dsaSendCommand(UINT32 cmd)
{
static BYTE mm=0,ss=2,ff=0;
UINT32 rx=0;
switch(cmd&0xff00)
{
#ifdef CAR_VCD //kenny 891220
case DSA_NEXT_DISK://kenny 891213
rx= Servo_command(SERVO_NEXT_DISK_CMD,0,0,0);//kenny 2001/2/20
break;
case DSA_PRE_DISK://kenny 891213
rx=Servo_command(SERVO_PRE_DISK_CMD,0,0,0);//kenny 2001/2/20
break;
case DSA_EJECT_MEGA://kenny 891213
rx=Servo_command(SERVO_EJECT_MEGA_CMD,0,0,0);//kenny 2001/2/20
break;
case DSA_INSERT_MEGA://kenny 891213
rx=Servo_command(SERVO_INSERT_MEGA_CMD,0,0,0);//kenny 2001/2/20
break;
case DSA_TO_ONE_DISK://kenny 891214
rx=Servo_command(SERVO_TO_ONE_DISK_CMD,0,0,0);//kenny 2001/2/20
break;
#endif
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;
//printf("===m:%d,s:%d,f:%d==\n",mm,ss,ff);
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//terry,2000/11/24 09:58AM
rx=Servo_command(SERVO_SETVOL_CMD,cmd&0xff,0,0);
#endif
break;
case DSA_SLEDGE_OFF_CMD:
#ifdef SUPPORT_COMBO//terry,2000/11/24 09:58AM
rx=Servo_command(SERVO_SLEDGE_OFF_CMD,cmd&0xff,0,0);
#endif
default:
break;
}
if(rx) /*jhuang 2000/11/27 reduce warning*/
{
//printf("\nreceive\n");
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 (IsDsaTxEmpty)
{
UINT32 x = dsa_cmd[tail];
dsaWriteTx(x);
dsa_cmd_tail = WRAPr(tail+1, DSA_CMD_BUF_SIZE);
#ifdef MONE_DSA_WRITE
psprintf(linebuf, "DSAW: %04x\n", x);
epp_write(linebuf);
#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;
}
}
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_cna!=0x00ff && cd_trk_mm!=0x00ff && cd_trk_ss!=0x00ff)
{
if (cd_trk_no<=TRACK_INFO_MAX)
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 FWD_ACCR_TRK //terry 00/12/06
if((cd_type_loaded==CDDA)&&(adv_search_time))
break;
//#endif
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;
switch(play_state)
{
case VCD_STATE_NORMAL:
case VCD_STATE_STEP:
case VCD_STATE_SLOW:
case VCD_STATE_FREEZE:
now = addmsf_ss(now,5);
break;
}
#ifdef MONE_DSA_TIMEOUT
psprintf(linebuf, "%x %x %x TrkChg\n", cd_trk_now, low,cd_trk_hi);
epp_write(linebuf);
#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( ((!IsCdSeeking())&&(goto_active!=1))||(play_state==VCD_STATE_FASTFORWARD)||(play_state==VCD_STATE_FASTBACKWARD) )
{//terry 11/04
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -