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

📄 lap_p.c

📁 MTK平台绝密核心代码之 外设管理(红外线)
💻 C
📖 第 1 页 / 共 3 页
字号:
			}
		}
		mask=1<<(i1+1);

	}

	/* apply new connection parameters */ 
   
   /*Max turn around time*/
	p_timeout=new_ttt-10;   /* subtract out response ms delay */
	tmp_ms_timeout=p_timeout;
	MS_TO_TICKS(p_timeout); /* convert p_timeout to OS tick equivalent */

	/*Min turn around time and addional bof*/
	bofs=new_minttt+new_xbofs; /* add the min TTT to bofs */
	IRDA_SetBof(bofs);

   /*Baudrate*/
   savedMask = SaveAndSetIRQMask();
	Com_ioctl( IOCTL_BAUD, new_baud );
   Reset_Baudrate();
   RestoreIRQMask(savedMask); 
	//Com_ioctl( IOCTL_BAUD, new_baud );

	/* the windows size is currently set to one */ 

   /*Data size*/
	if (new_size==0)
		max_frame_size=IRLAP_FRAME_SIZE;
	else
		max_frame_size=new_size+4;
	/*Link disconnect.threshold time*/	
	if(new_ld==3) 
	{
		N1=0;
		N2 = 6;//about 3s 
	}	
	else
	{
	/* calculate these values based on ms time not OS ticks*/
	   N1=3000/tmp_ms_timeout;/**/
	   N2 = 6;//about 3s 
   }

  
#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_INFO, IRDA_MSG26, new_baud);
   kal_trace(TRACE_INFO, IRDA_MSG27, new_size);
   kal_trace(TRACE_INFO, IRDA_MSG28, new_ttt);
   kal_trace(TRACE_INFO, IRDA_MSG29, bofs);
   kal_trace(TRACE_INFO, IRDA_MSG30, new_minttt);
   kal_trace(TRACE_INFO, IRDA_MSG31, new_ld);
   kal_trace(TRACE_INFO, IRDA_MSG32, N1);
   kal_trace(TRACE_INFO, IRDA_MSG33, N2);
      	
#endif
	
}	



/*************************************************************************
* FUNCTION
*	IrLAP_DISCONNECT_request_p
*
* DESCRIPTION
*	Perform a LAP disconnect request for a primary
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void  IrLAP_DISCONNECT_request_p (void )
{
 
#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_FUNC, IRDA_MSG34); 	
#endif
   STOP_P_TIMER();
	Com_write(Format_packet (1,DISC_COMMAND));
	START_F_TIMER();
	irlap_state=IRLAP_PCLOSE;
}




/*************************************************************************
* FUNCTION
*	Send_NRM_Command
*
* DESCRIPTION
*	Send a LAP data frame or S command
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Send_NRM_Command ( void )
{
FBUF *tmpptr;
//kal_uint8 tx_lap;

if(lap_disconnect_flag==1)/*Send DISC */
{
 
#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_INFO, IRDA_MSG35);  
#endif
   IrLAP_DISCONNECT_request_p();
   lap_disconnect_flag=0;
   return;
 }  


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

/* if local_busy toggles, ensure that one S frame is transmitted to
   inform the remote about our receive status
*/
   kal_prompt_trace(MOD_LAP,"Nr %d AS %d VS %d",Nr, As, Vs);
	if (!remote_busy&&!(((local_busy&1)^(local_busy>>1))&1))
	{
		if ((Nr==As)&&(unacked_frame!=0)) 
		{
		/* adjust Vs before retransmit */
			if (Vs==0)	
				Vs=7;
			else
				Vs--;
	        	unacked_frame->size-=2;  /*2 for A and C field */
        		Com_write(Format_I_Packet (1,0x10,unacked_frame,unacked_frame->size));
			As=Vs;
			Vs=(Vs+1)%8;
		}
		else if ( unacked_frame )
		{
			SEND_S_COMMAND();
		}
		else if (FRAME_IN_QUEUE(lap_request_q))
		{				

         QUEUE_REMOVE(lap_request_q,tmpptr,MAX_REQUEST);
        	Com_write(Format_I_Packet (1,0x10,tmpptr,tmpptr->size));
			unacked_frame = tmpptr;
			As=Vs;
			Vs=(Vs+1)%8;
		}
		else
		{
			SEND_S_COMMAND();
		}
	}
	else 
	{
		 if (local_busy&1)
			local_busy=3;
		 else 
			local_busy=0;

		SEND_S_COMMAND();
	}

	retrycount=0;
/* ??? */
	START_F_TIMER();
}



/*************************************************************************
* FUNCTION
*	Do_quick_p_timer
*
* DESCRIPTION
*	This does reply to Secondary as soon as possible
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Do_quick_p_timer ( void ) 
{
		if ( irlap_state==IRLAP_XMIT )
		{
			irlap_state=IRLAP_NRMP;
			Send_NRM_Command();
		}
}

/*************************************************************************
* FUNCTION
*	Check_F_Timer
*
* DESCRIPTION
*	Handle f timer timeout
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Check_F_Timer ( void ) 
{


#ifdef IRDA_KAL_TRACE
     kal_trace(TRACE_FUNC, IRDA_MSG37);  	
#endif
		switch (irlap_state)
		{
			case IRLAP_SETUP:
				irp_connect=DISCONNECT_INDICATION;						
				LAP_disconnect_reset(LOST_LAP_CON);
				Reset_Baudrate();
				irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;		
				break;
			case IRLAP_NRMP:
				if ( retrycount < N2 ) 
				{
					SEND_S_COMMAND();
					retrycount+=1;
					START_F_TIMER();
				}
				else 
				{
					LAP_disconnect_reset(LOST_LAP_CON);
					Reset_Baudrate();
				   irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;	
				}
				break;
			case IRLAP_PCLOSE:
				if ( retrycount < N2 ) 
				{
					Com_write(Format_packet (1,DISC_COMMAND));
					retrycount+=1;
					START_F_TIMER();
				}
				else 
				{
					LAP_disconnect_reset(LOST_LAP_CON);
					Reset_Baudrate();				
				   irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;						
				}
				break;
			default:
				STOP_F_TIMER();
				break;
		 }

}


/*************************************************************************
* FUNCTION
*	Check_P_Timer
*
* DESCRIPTION
*	handle poll timeout
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Check_P_Timer ( void ) 
{
	
	if ( irlap_state==IRLAP_XMIT )
	{
		irlap_state=IRLAP_NRMP;
		Send_NRM_Command();
	}	
}

/*************************************************************************
* FUNCTION
*	Process_Nr
*
* DESCRIPTION
*	Process NR. 
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Process_Nr ( void )
{
   peer_buff_struct* tmp_peer_buf_ptr;

 
#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_FUNC, IRDA_MSG38);  	
#endif
	if ((Nr==Vs)&&(unacked_frame!=0)) 
	{
	   if((ctrl_buff_cnt)&&(unacked_frame->type==CONTROL_BUF_TYPE)
	      &&(FRAME_IN_QUEUE(ctrl_buff_q)))
	   {
	      QUEUE_PEAK(ctrl_buff_q, tmp_peer_buf_ptr);   
	      kal_prompt_trace(MOD_TTP,"ctrl buf %d unack %d",tmp_peer_buf_ptr->pdu_len, (unacked_frame->size-5));
	      if(tmp_peer_buf_ptr->pdu_len>=(tmp_peer_buf_ptr->pdu_len-(unacked_frame->size-5)))
	         tmp_peer_buf_ptr->pdu_len=tmp_peer_buf_ptr->pdu_len-(unacked_frame->size-5);/*2LAP+2LMP+1TTP*/
	      else
	         tmp_peer_buf_ptr->pdu_len=0;   
	            
	      if(tmp_peer_buf_ptr->pdu_len==0)
	      {
	         
	      QUEUE_REMOVE(ctrl_buff_q,tmp_peer_buf_ptr,MAX_TTP_FRAMES);
	      gprs_flc_free_peer_buff ( 
                                     IRDA_DATA,
                                     0,
                                     GPRS_FLC_UL,
                                     0,
                                     tmp_peer_buf_ptr);	 
            ctrl_buff_cnt--;
         dbg_ctrl_buff_count--;
	      
         }   
	      if(local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL)
	      {
	         /*Attar 20060227: remove it because of race condition */
	         /*extern void obex_flc_release_callback(void);
	         kal_prompt_trace(MOD_OBEX, "local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL");
	         obex_flc_release_callback();*/
	      }
	      {
	         kal_uint16 u_available_half_blocks;  kal_uint16 u_available_full_blocks; 
	         kal_uint16 d_available_half_blocks;  kal_uint16 d_available_full_blocks; 
	         gprs_flc_pool_presence_enum is_pool_created;
         
	      gprs_flc_query_fix_size_pool_occupy( IRDA_DATA, GPRS_INVALID_SAPI, GPRS_FLC_UL, 0, \
	      										&is_pool_created, &u_available_half_blocks, &u_available_full_blocks );
         
	      gprs_flc_query_fix_size_pool_occupy( IRDA_DATA, GPRS_INVALID_SAPI, GPRS_FLC_DL, 0, \
	      										&is_pool_created, &d_available_half_blocks, &d_available_full_blocks );
         
	      kal_prompt_trace(MOD_TTP, "[LAP] [UL: (%d) (%d)][DL: (%d) (%d)]", u_available_half_blocks, u_available_full_blocks, d_available_half_blocks, d_available_full_blocks );
	      kal_prompt_trace(MOD_LAP, "[LAP] [UL: (%d) (%d)][DL: (%d) (%d)]", u_available_half_blocks, u_available_full_blocks, d_available_half_blocks, d_available_full_blocks );
         }   
	      
	   }   
		Freebuf((FBUF*)unacked_frame);
		unacked_frame=0;
	}
}



/*************************************************************************
* FUNCTION
*	Process_peer_SNRM_com
*
* DESCRIPTION
*	 Process the PEER SNRM command
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static void Process_peer_SNRM_com ( kal_uint8 * frame )
{

kal_uint32 tmplong;
kal_uint32 tmpdest;
 
#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_FUNC, IRDA_MSG39);  	
#endif


/* determine (tentatively) if we are a primary or secondary */
/* dest 32bit address */
	xmemcpy ((kal_uint8 *)&tmplong, (kal_uint8  *)&frame[DEST_ADDRESS_OFFSET],4); 
	tmpdest=Swap_long_order(tmplong);
   Yield_Secondary(frame);
}

/*************************************************************************
* FUNCTION
*	Yield_Secondary
*
* DESCRIPTION
*	Yield link control as a secondary
*
* PARAMETERS
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*  only used in PEER mode
*************************************************************************/
static void Yield_Secondary( kal_uint8 * frame )
{

#ifdef IRDA_KAL_TRACE
   kal_trace(TRACE_FUNC, IRDA_MSG40);  	
#endif
	ENABLE_SECONDARY_STACK();/*stack=0*/

	Do_u_frame_s( frame );
}

⌨️ 快捷键说明

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