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

📄 dsa.c

📁 这是一个VCD解码的学习资料,主要是CD SERVO 的一些源代码!以供大家参考!
💻 C
📖 第 1 页 / 共 3 页
字号:
      	AVD_SetMediaInterrupt();
		PostCommand(CMD_FUNC | CMD_FUNC_TIMEOUT);		
#ifdef MONE_DSA_TIMEOUT
		printf("ChkTrkTmByMSF Timeout\n");
		printf("cd_trk_now:%d max:%d min:%d now:%d\n",now,max,min,msf);
#endif				
		return 0;
	  }
      return 1;
}


#ifdef SUPPORT_SFT_DSA
void Sft_dsa_isr(void)
{
  if( bDSATimer>1)
     bDSATimer--;
}

void Sft_DSA_reset(void)
{
    regs0->gpio_pinsel |=(1<<3);
    regs0->gpio_pinsel |=(1<<8);
    bDSATimer=0;
    SetDSA_DAT(1);
    SetDSA_STB(1);
    SetDSA_ACK(1);
    SetDAT_READ();
    SetACK_READ();
    SetSTB_READ();
    dsa_state_sel = 0;
    dsa_status_sel = DSA_IDLE;
}

/****************************************************************************/
/*  Function    : Sft_DsaSendCmmd(BYTE bCmd,BYTE bParameter)                */
/*  Description : 1. Transfer DSA command and parameter to external host by */
/*                2. Use 3 GPIO lines to simulate DSA_ACK, DSA_DATA, DSA_STB*/
/*                   Not using hardware DSA_ACK, DSA_DAT, DSA_STB pins      */
/*  Arguments   : bCmd ==> DSA command to external host(Opcode)             */
/*                bParameter==> for DSA command parameter                   */
/*  Return      : SUCCESS:1 , FAIL:0                                        */
/*                Kenny 2000/11/22                                           */
/****************************************************************************/
BYTE Sft_DSA_SendCmd(void)
{
     switch(dsa_state_sel)
       {
           case 0:                     //set data low for sync start
                SetACK_READ();
                SetDAT_READ();
                SetSTB_READ();
                if(!GetDSA_DAT())
                  {
                     dsa_status_sel = DSA_RECEIVE;
                     return DSA_IDLE;
                  }
  SetDSA_DAT(0);
                dsa_state_sel = 1;
                dsa_status_sel = DSA_SEND;
                bDSATimer = DSA_250MS;
                break;
           case 1:                    //wait ack low for sync start
                if(!GetDSA_ACK())
                  {
                     dsa_state_sel = 2;
  SetDSA_DAT(1); 
                  }
                break;
           case 2:                    //wait ack high for sync end
                if(GetDSA_ACK())
                  {
                     dsa_state_sel = 3;
                     #ifdef SUPPORT_COMBO
                     dsa_send_data = dsa_cmd[dsa_cmd_tail];
                     #else
                     dsa_send_data = sft_dsa_cmd[sft_dsa_cmd_tail];
                     #endif
                     dsa_loop_count=0;
                     SetDSA_DAT(1);
                  }
                break;
           case 3:                   //data send start
                SetDSA_DAT(MSB(dsa_send_data)); // send msb
                dsa_send_data<<=1;
                dsa_loop_count++;
                dsa_state_sel = 4;
                SetDSA_STB(0);
                break;
           case 4:                  //data send start
                if(!GetDSA_ACK())
                  {
                      dsa_state_sel = 5;
                SetDSA_STB(1);
                  }
                        break;
           case 5:                 //data send end
                if(GetDSA_ACK())
                  {
                      if(dsa_loop_count==16)
                        {
                          dsa_state_sel = 6;
                          SetDAT_READ();
                          SetSTB_READ();
                          SetDSA_ACK(0);
                        }
                      else
                          dsa_state_sel = 3;
                  }
                        break;
           case 6:                //check ack  start
	SetSTB_READ();
                if(!GetDSA_STB())
                  {
                     dsa_state_sel = 7;
        SetDSA_ACK(1);
                  }
                break;
           case 7:               //check ack  end
                if(GetDSA_STB())
                  {
                     Sft_DSA_reset();
                     return DSA_SUCCESS;
                  }
                break;
           default:
                dsa_state_sel = 0;
                break;
       }
    if(bDSATimer==1)
      {
        Sft_DSA_reset();
        return DSA_FAIL;
	}                
        else
        return DSA_IDLE;
}	

/****************************************************************************/
/*  Function    : Sft_DSA_ReceiveCmd(BYTE bResponse)                        */
/*  Description : 1. Receive DSA command and parameter from external host   */
/*                2. Use 3 GPIO lines to simulate DSA_ACK, DSA_DATA,DSA_STB */
/*                   Not using hardware DSA_ACK, DSA_DAT, DSA_STB pins      */
/*  Arguments   : bResponse: Wanted DSA command from host                   */
/*                                                                          */
/*  Return      : Parameter for received dsa command                        */
/*                                                                          */
/*               Kenny 2000/11/22                                           */
/****************************************************************************/
BYTE Sft_DSA_ReceiveCmd(void)
{
     switch(dsa_state_sel)
       {
           case 0:                    //wait data low for sync start
        SetDAT_READ();
                SetACK_READ();
                SetSTB_READ();
                if(!GetDSA_DAT())
                  {
                    dsa_state_sel = 1;
                    bDSATimer = DSA_250MS;
                    dsa_status_sel = DSA_RECEIVE;
                    SetDSA_ACK(0);
                  }
                else
                    dsa_status_sel = DSA_IDLE;
                return DSA_IDLE;
                break;
           case 1:                   //wait data high for sync end
        if(GetDSA_DAT())
                  {
                    dsa_state_sel = 2;
                    dsa_loop_count =0;
                    dsa_receive_data =0;
                    SetDSA_ACK(1);
                  }
                break;
           case 2:                     //receive data start
                if(!GetDSA_STB())
                  {
                     dsa_receive_data <<= 1;
        SetDAT_READ();
                     if(GetDSA_DAT())
                        dsa_receive_data |= 0x0001;
                     dsa_loop_count++;
                     dsa_state_sel = 3;
                     SetDSA_ACK(0);
                  }
                break;
           case 3:                    //receive data end
                if(GetDSA_STB())
                  {
        SetDSA_ACK(1);
                      if(dsa_loop_count==16)
                        {
                          dsa_state_sel = 4;
                          SetACK_READ();
                        }
                      else
                        dsa_state_sel = 2;
                  }
                        break;
           case 4:                   //check ack phase
                if(!GetDSA_ACK())
                  {
                    SetDSA_DAT(1);
                    SetDSA_STB(0);
                    dsa_state_sel = 5;
                  }
                        break;
           case 5:                   //check ack high phase
                if(GetDSA_ACK())
                  {
                    Sft_DSA_reset();
                    return DSA_SUCCESS;
                  }
                break;
           default:
                dsa_state_sel = 0;
                break;
       }
    if(bDSATimer==1)
      {
        Sft_DSA_reset();
        return DSA_FAIL;
      }
       
    return DSA_IDLE;
}

void polling_sft_dsa(void)
{
    if(dsa_status_sel!=DSA_SEND)
      {
            if(Sft_DSA_ReceiveCmd()==DSA_SUCCESS)
                {
                  if((dsa_receive_data & 0xff00) == 0xfc00)
                    {
                     irc_func_table[ir_mapcode[dsa_receive_data & 0xff]]();
                    }
                }
      }
    if(dsa_status_sel!=DSA_RECEIVE)
      {
              #ifdef SUPPORT_COMBO
              if(dsa_cmd_head != dsa_cmd_tail)
              #else
              if(sft_dsa_cmd_head != sft_dsa_cmd_tail)
              #endif
               {
                  if(Sft_DSA_SendCmd()==DSA_SUCCESS)
                    {
                        #ifdef SUPPORT_COMBO
                        dsa_cmd_tail = WRAPr(dsa_cmd_tail+1, DSA_CMD_BUF_SIZE);
                        #else
                        sft_dsa_cmd_tail = WRAPr(sft_dsa_cmd_tail+1, DSA_CMD_BUF_SIZE);
                        #endif
                        SetDAT_READ();
                    }
               }
              else
                dsa_status_sel = DSA_IDLE;
      }
}	

void  Sft_DsaSendCmmd(BYTE cmd,BYTE datas)
{
#ifdef SUPPORT_COMBO
   dsa_cmd[dsa_cmd_head] = (cmd<<8)|datas;
   dsa_cmd_head  = WRAPr(dsa_cmd_head+1, DSA_CMD_BUF_SIZE);
#else
   sft_dsa_cmd[sft_dsa_cmd_head] = (cmd<<8)|datas;
   sft_dsa_cmd_head  = WRAPr(sft_dsa_cmd_head+1, DSA_CMD_BUF_SIZE);
#endif
}
#endif
// #ifdef SUPPORT_SFT_DSA


#ifdef SUPPORT_EXT_HW_DSA  //kenny 891122
/*********************************************************
*Function: dsa_hardware_response()
*Description:This function is for responsing dsa command    
*            which is from external host. 
*           
* Input: rx: High byte means dsa command, 
*            Low  byte means command parameter  
*
*
*        Kenny 2000/11/22    
********************************************************/
 void extern_dsa_response(UINT32 rx)
 {
    BYTE low;
    
    low=(BYTE)(rx&0xff);
   
    // psprintf(linebuf,":%x\n",rx);
    // osd_print2(linebuf);
   
    
    switch(rx&0xff00)
    {
     //case 0xFC00:
     case 0xF700: //kenny 891128
      
     	irc_func_table[low]();
     break;
     
     case 0xF500://kenny 891128
     get_disc_type(low);
          
     
     break;
         	
     case 0xF600://kenny 891128
     get_sys_state();
     
     break;
     
     default:
     break;
         	
    	
    }		
   
 	
 }	


/********************************************
*Function: polling_hardware_dsar(void)
*Description:This function is for polling dsa command    
*            which is from external host
*           
* 
*         
*            Kenny 2000/11/21
********************************************************/

void     polling_hardware_dsar(void)
{
  if (IsDsaRxFull)
    {
      UINT32    rx = dsaReadRx();
      
        //psprintf(linebuf,"RX:%x\n",rx);
      //osd_print2(linebuf);
      
      extern_dsa_response(rx);

    }
 
 
}


/***********************************************************
*Function: HW_DsaSendCmmd(BYTE bCmd,BYTE bParameter)
*Description:This function is for send dsa command    
*            and parameter to external host by hardware method
*           
*Input:       bCmd: DSA command 
*       bParameter: parameter of DSA command  
*            Kenny 2000/11/21
*************************************************************/

void HW_DsaSendCmmd(BYTE bCmd,BYTE bParameter)
{
   #if 0
   WORD i;	
	
   if (IsDsaTxEmpty)
  {
    UINT32 x = (bCmd<<8)|bParameter;
    
   // psprintf(linebuf,"X:%x\n",x);
   // osd_print2(linebuf);
    for(i=0;i<2600;i++);
    
    dsaWriteTx(x);
    
    for(i=0;i<2600;i++);
   
  }	
  #endif

 #if 1	
 int	head = dsa_cmd_head;
  int   tail = dsa_cmd_tail;
  UINT32 cmd = (bCmd<<8)|bParameter;
  WORD i;

  dsa_cmd[head]	= cmd;
  dsa_cmd_head	= WRAPr(head+1, DSA_CMD_BUF_SIZE);

  if (IsDsaTxEmpty)
  {
    UINT32 x = dsa_cmd[tail];
    
    for(i=0;i<2600;i++);
    dsaWriteTx(x);
    for(i=0;i<2600;i++);
    dsa_cmd_tail = WRAPr(tail+1, DSA_CMD_BUF_SIZE);
#ifdef	MONE_DSA_WRITE
    psprintf(linebuf, "DSAW: %04x\n", x);
    epp_write(linebuf);
#endif
 	
  }
  else
  {
   // osd_print2("ERROR\n");
  	
  }		
	
  #endif	
	
	
}	





#endif //SUPPORT_EXT_HW_DSA

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -