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

📄 dsa.c

📁 代码有点长,需细心阅读,仅供影音视听类产品的开发人员参考
💻 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 + -