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

📄 dsa.c

📁 这是一个VCD解码的学习资料,主要是CD SERVO 的一些源代码!以供大家参考!
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
** 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 + -