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

📄 lap_p.c

📁 MTK平台绝密核心代码之 外设管理(红外线)
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------    
 *    LAP.c
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   This file contains the Primary part of LAP
 *
 * Author:
 * -------
 * -------
 *
 *****************************************************************************/

#include "kal_release.h"      /* Basic data type */
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h"       /* Task message communiction */
#include "stack_timer.h"      /* Stack timer */
#include "intrCtrl.h"
#include "irda_enums.h"       /* irda enum */  
#include "gprs_flc_kal.h"  
#include "gprs_flc_common_data_types.h"
#include "flc_tunable_para.h"
#include "irconfig.h"	/* IrPro system configuration */
#include "lap.h"	      /* LAP source header file */
#include "lmp.h"	      /* LMP source header file */
#include "iap_s.h"
#include "support.h"	   /* system support functions */
#include "externs.h"	   /* system external definitions */
#include "irda.h"
#include "irframer_sw.h"
#include "stack_config.h"
#include "kal_trace.h"                     
#include "irda_trace.h"
/* define this if rate = 4Mbps */
#undef FOURMBIT 


kal_uint16   f_mstimeout;   /* f timer timeout */
kal_uint8    N1;  		      /* (F-timer (ms) duration)(N1)= disconnect warning threshhold */
kal_uint8    N2;  		      /* (F-timer (ms) duration)(N2)= link disconnect */
kal_uint8    retrycount;	   /* count value during link turnaround retries */
kal_uint8    discovery;	   /* discovery flag */
kal_uint8    slotcount;   	/* current slot count during discovery */
kal_uint16	 slot_time;	   /* relative time marker for the current slot */
kal_uint16	 f_time;		   /* used to timeout link */
kal_uint16	 p_time;		   /* relative time marker for the current slot */
kal_uint16	 p_timeout;	   /* p timer timeout set during negotiation */
LOG          discovery_log[TOTAL_SLOTS]; /* discovery log */
kal_uint16   media_timer_on=0;

static void Process_peer_SNRM_com ( kal_uint8 * frame );
static void Yield_Secondary( kal_uint8 * frame );
extern kal_uint16 dbg_ctrl_buff_count;


/*************************************************************************
* FUNCTION
*	IrLAP_DISCOVERY_request
*
* DESCRIPTION
*	Do a LAP discovery request
*
* PARAMETERS
*  
* RETURNS
*	0 for success, 
   1 if media_busy is true
*
* GLOBALS AFFECTED
*
*************************************************************************/

kal_uint8 IrLAP_DISCOVERY_request ( void )
{
kal_uint8 status=1;


#ifdef IRDA_KAL_TRACE  
    kal_trace(TRACE_FUNC, IRDA_MSG12);        			
#endif
      /*start media detect timer*/
		if(media_timer_on==0)
		{    
		     media_busy_mark=0;
		     START_MEDIA_BUSY_TIMER();
		     media_timer_on=1;
		     return(1);
	   }
	   /*media is not busy*/
		if(media_busy_mark==0)
		{			
			STOP_MEDIA_BUSY_TIMER(); 
			Clear_log();		
			slotcount=0;
         Com_write(Format_packet ((kal_uint8)(genaddrbit ? 3:1),XID_COMMAND));
		   START_SLOT_TIMER();
		   irlap_state=IRLAP_QUERY ;
		   status=0;
		   discovery=0;
		   media_timer_on=0;
		   return(status) ;
		}
		else/*media is busy*/
		{
		  if(media_timer_on)
		  {
		      STOP_MEDIA_BUSY_TIMER(); 
		      media_timer_on=0;
		        /*@@@@MSG_ID_LAP_DISCOVERY_MEDIA_BUSY_ERROR*/
		      irda_lmp_flag=MSG_ID_LAP_DISCOVERY_MEDIA_BUSY_ERROR; 
		      status=1;		      			      
		      return(status);   
		  }   		   
		}  		
	return(status);
}	

/*************************************************************************
* FUNCTION
*	Test_primary_query_status
*
* DESCRIPTION
*	Test primary query status during discovery
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Test_primary_query_status ( void )
{

#ifdef IRDA_KAL_TRACE  
    kal_trace(TRACE_FUNC, IRDA_MSG13);             			
#endif
    STOP_SLOT_TIMER();
    if( irlap_state==IRLAP_QUERY )
    {
        
		 if( slotcount< (MAX_SLOTS-1) )
		 {
			 slotcount++;
          Com_write(Format_packet ((kal_uint8)(genaddrbit ? 3:1),XID_COMMAND));
			 START_SLOT_TIMER();
		 }
		else 
		{
			slotcount=0xff;  /* this marks end of discovery */
			/* or in final bit (bit2) */
        	Com_write(Format_packet (0x04|1,XID_COMMAND));       
			discovery=1;    /* signal end of discovery */
			genaddrbit=0;   /* reset */
			irlap_state=IRLAP_NDM;
			/*@@@@MSG_ID_LAP_DISCOVERY_CONFIRM*/
			irda_lmp_flag=MSG_ID_LAP_DISCOVERY_CONFIRM;
		}		                               
    }
   
}
			
/*************************************************************************
* FUNCTION
*	IrLAP_DISCOVERY_confirm
*
* DESCRIPTION
*	Confirm the discovery
*
* PARAMETERS
*  
* RETURNS
*	success: (LOG*)discovery_log
	            failure: 0
*
* GLOBALS AFFECTED
*
*************************************************************************/
LOG* IrLAP_DISCOVERY_confirm( void )
{
kal_int16 i;

	if (discovery)/* signals end of discovery */
	{ 
		discovery=0;

		for (i=0;i<MAX_SLOTS;i++)
		{
			if (discovery_log[i].addr)
				discovery++;
		}				
		if(discovery)
		{

#ifdef IRDA_KAL_TRACE  
       kal_trace(TRACE_FUNC, IRDA_MSG14);   			
#endif
			return(discovery_log);
		}

#ifdef IRDA_KAL_TRACE
     kal_trace(TRACE_FUNC, IRDA_MSG15);  			
#endif            
	}

	return(0);
}



/*************************************************************************
* FUNCTION
*	Do_s_frame_p
*
* DESCRIPTION
*	Decode the S frame for primary
*
* PARAMETERS
*  kal_uint8 * frame
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void  Do_s_frame_p ( kal_uint8 * frame )
{
    Nr=(frame[1]&0xe0)>>5;

#ifdef IRDA_KAL_TRACE  
      kal_trace(TRACE_FUNC, IRDA_MSG16);  			
#endif
    //STOP_F_TIMER();
    switch(irlap_state)
    {
      case IRLAP_PCLOSE:
         Com_write(Format_packet (1,DISC_COMMAND));
         START_F_TIMER();
         break;
      case IRLAP_NRMP:
	      if ( INVALID_NR()&&((frame[0]&0x01)==0) )/* addr response test */
	      {

#ifdef IRDA_KAL_TRACE  
   kal_trace(TRACE_INFO, IRDA_MSG17);  
#endif

		      Com_write(Format_packet (1,DISC_COMMAND));
		      retrycount=0;
		      START_F_TIMER();
		      irlap_state=IRLAP_PCLOSE;
	      }
	      else if (frame[0]&0x01)/* addr command test */
	      {   

#ifdef IRDA_KAL_TRACE  
   kal_trace(TRACE_INFO, IRDA_MSG18); 
#endif      
            irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;
	         LAP_disconnect_reset(USER_REQUESTED);
	         Reset_Baudrate();/*for reset baudrete to 9600*/
	      }
	      else 
	      {
	         switch (frame[1]&0x1f)/*check what kind of S frame*/
	         {
	            case RNR_RESPONSE:
   			      remote_busy=1;
	   		      goto here1;
		         case RR_RESPONSE:
			         remote_busy=0;
here1:
			         STOP_F_TIMER();
			         Process_Nr();
			         irlap_state=IRLAP_XMIT;
			         START_P_TIMER();
			         break;
		         case REJ_RESPONSE:
			         goto here;
		         case SREJ_RESPONSE:
here:
			         STOP_F_TIMER();
			         Process_Nr();
			         irlap_state=IRLAP_XMIT;
			         START_P_TIMER();
			         break;
		         default:
			         break;
				
	            }
	      }

	    break;
	  default:	
	  	  break;
    }
}


/*************************************************************************
* FUNCTION
*	Do_i_frame_p
*
* DESCRIPTION
*	Decode the (I) information frame for primary
*
* PARAMETERS
*  FBUF * dframe
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void  Do_i_frame_p ( FBUF * dframe )
{
kal_uint8 * frame;
kal_uint8 tmp_free=0;
	

#ifdef IRDA_KAL_TRACE  
   kal_trace(TRACE_FUNC, IRDA_MSG19);       			
#endif
	frame=(kal_uint8*)dframe+FBUF_HEAD;
   Nr=(frame[1]&0xe0)>>5;
   Ns=(frame[1]&0x0e)>>1;
   //IrLAP_I_frame_timer_enable(KAL_FALSE);
   
	switch(irlap_state)
	{

	  case IRLAP_NRMP:
	    if (frame[0]&0x01)/* is command bit set */
	    {	

#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_INFO, IRDA_MSG20);  
#endif
          irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;
		    LAP_disconnect_reset(UNSPECIFIED_REASON);
		    Reset_Baudrate();
	    }
	    else if (frame[1]&0x10)/* is F bit set? */
	    {	
		    if (INVALID_NR())
		    {        
			    Com_write(Format_packet (1,DISC_COMMAND));
			    START_F_TIMER();
			    irlap_state=IRLAP_PCLOSE;
			    retrycount=0;             
			    break;  
      	 }
		    STOP_F_TIMER();
		    Process_Nr();
		if (local_busy==0)
		{
			if(Ns==Vr)
			{
				Vr=(Vr+1)%8;		
				tmp_free++;			   
				irda_lmp_flag=MSG_ID_LAP_DATA_INDICATION;
				irda_data_buffer=dframe;    
			}
		}
		irlap_state=IRLAP_XMIT;
		START_P_TIMER();
	    } /* End of if F bit is set */
	    break;
	  default:/*Process I frame only in NRMP state*/
	    break;
	}
/* free the buffer if we did not q it */
	if (tmp_free==0)  
	{
    		Freebuf((FBUF*)dframe);
	}
   IrLAP_I_frame_timer_enable(KAL_TRUE);
}
/*************************************************************************
* FUNCTION
*	Do_u_frame_p 
*
* DESCRIPTION
*	Decode the U frame for primary
*
* PARAMETERS
*  kal_uint8 * frame 
* RETURNS
*	None
*
* GLOBALS AFFECTED
*

⌨️ 快捷键说明

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