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

📄 ttp.c

📁 MTK平台绝密核心代码之 外设管理(红外线)
💻 C
📖 第 1 页 / 共 3 页
字号:
*
* DESCRIPTION
*	process_ttp_tx_queue
*
* PARAMETERS
*  lsap_sel -> the LSAP selector of the specified TTP queue
* RETURNS
*  None
*
* GLOBALS AFFECTED
*  check the tx queue of the specified TTP queue then send one 
 			   data frame to LMP if any frame exists in the TTP queue
*************************************************************************/
   kal_uint16  irda_buff_count=0;
void process_ttp_tx_queue(kal_uint8 lsap_sel)
{
	kal_uint8 *tmpptr;
	FBUF *tmpbuf;
	kal_uint8 tmp;
	kal_uint8 stauts;
	
   gprs_flc_pool_presence_enum is_pool_presence;

   gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count);
   ASSERT(is_pool_presence == GPRS_FLC_POOL_CREATED);                              

	#ifdef IRDA_KAL_TRACE  
     kal_trace(TRACE_FUNC, IRDA_MSG79); 
   #endif
   
	if (FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_txq))
	{				
		while((lm_con[lsap_sel].ttp_dat.sendcredit > 0)&&(FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_txq))) /*have data && can send */
		{ 	/* Data LM-PDU */		
		   gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count);
		
		
		   QUEUE_REMOVE(lm_con[lsap_sel].ttp_txq,tmpbuf,MAX_TTP_FRAMES);
		   tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;		
         lm_con[lsap_sel].ttp_dat.availcredit=
         irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
         tmp = lm_con[lsap_sel].ttp_dat.availcredit;
			lm_con[lsap_sel].ttp_dat.availcredit=0;
			lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;
									
			lm_con[lsap_sel].ttp_dat.sendcredit-=1;
			*(tmpptr+2)=tmp;//tmp /* add delta credit */

			stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf); 
	   }
	   /*check if ap asks disconnect*/
	   irda_ttp_disconnect_req_check();
	   if (lm_con[lsap_sel].ttp_dat.sendcredit == 0)/*lm_con[lsap_sel].ttp_dat.sendcredit <= 0*/
	   {    /*send dataless flow data */
            gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count);

         tmpbuf=Getbuf(); 
         tmpbuf->size=1;/*for credit field*/
         tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;		
         lm_con[lsap_sel].ttp_dat.availcredit=
         irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
         tmp = lm_con[lsap_sel].ttp_dat.availcredit;
			lm_con[lsap_sel].ttp_dat.availcredit=0;
			lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;

									
		   if(tmp!=0)/*not send credit=0 frame*/
         {
			   //lm_con[lsap_sel].ttp_dat.sendcredit-=1;
			   *(tmpptr+2)=tmp;//tmp; /* add delta credit */			   
			   stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf); 
			   // ASSERT(stauts==0);
			} 
			else 
			   Freebuf(tmpbuf);
      }
          
	}
	else/*send dataless TTP data*/
	{  
	      tmpbuf=Getbuf(); 
         tmpbuf->size=1;/*for credit field*/
      
         tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;		
         lm_con[lsap_sel].ttp_dat.availcredit=
         irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
         tmp = lm_con[lsap_sel].ttp_dat.availcredit;
			lm_con[lsap_sel].ttp_dat.availcredit=0;
			lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;

			if(tmp!=0)
         {
			   //lm_con[lsap_sel].ttp_dat.sendcredit=1;
			   *(tmpptr+2)=tmp;//tmp; /* add delta credit */			   
			   stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf); 			   
			} 
			else 
			   Freebuf(tmpbuf);			   
	}   
}	/* process_ttp_tx_queue() */

/*************************************************************************
* FUNCTION
*	ttp_send_msg_to_upper_layer
*
* DESCRIPTION
*	process_ttp_rx_queue
*
* PARAMETERS
*  
* RETURNS
*  None
*
* GLOBALS AFFECTED
*  check the rx queue of the specified TTP queue then send one 
 			   data frame to upper layer if any frame exists in the TTP queue
*************************************************************************/
kal_bool irda_temp = KAL_FALSE;
static peer_buff_struct* sar_peer_buff_ptr=NULL;
static kal_uint8* sar_pdu_ptr=NULL;
void ttp_send_msg_to_upper_layer(kal_uint16 msg, FBUF *frame, irda_error_code_enum code)
{
	ilm_struct *ttp_ilm;
	irda_local_para_struct *tmp_local_para;
   peer_buff_struct* tmp_peer_buf_ptr;	
	kal_uint8* pdu_ptr;
	kal_uint16 pdu_length;
	volatile kal_bool  send_data;
	gprs_flc_pool_presence_enum is_pool_presence;	
	kal_uint8 *tmpptr;
	
	#ifdef IRDA_KAL_TRACE  
     kal_trace(TRACE_FUNC, IRDA_MSG80); 
#endif
   tmpptr= (kal_uint8 *)(frame)+I_RX_PACKET_OFFSET;
	send_data=1;
		
	tmp_local_para=(irda_local_para_struct *)construct_local_para(sizeof(irda_local_para_struct),TD_UL);
	tmp_local_para->local_lsap_sel=local_lsap_sel;
	tmp_local_para->remote_lsap_sel=remote_lsap_sel;
	tmp_local_para->disconnect_reason=lm_con[local_lsap_sel].discon_code;
	tmp_local_para->return_code=code;	
	if(msg==MSG_ID_TTP_DATA_INDICATION)
	{	   
	   if(1)/*not necessary to do SAR*/
	   { 
	      
#ifndef IRDA_CTRL_BUF						
			tmp_peer_buf_ptr=construct_peer_buff( (frame->size-2), 0, 0, TD_CTRL);			
#else 


         tmp_peer_buf_ptr = gprs_flc_get_peer_buff
                            (IRDA_DATA,
                              0,
                              GPRS_FLC_DL,
                              0,                              
                              IRDA_STD_PACKET_SIZE, /* (frame->size-2),// 256 */
                              0,                              
                              0,
                              &is_pool_presence);
       ASSERT(is_pool_presence == GPRS_FLC_POOL_CREATED);                              
#endif          			
      
      if (tmp_peer_buf_ptr==NULL)      
      {
         send_data=0;      
         if (!(QUEUE_FULL(lm_con[local_lsap_sel].ttp_rxq,MAX_TTP_FRAMES)))         
         {
            QUEUE_ADD(lm_con[local_lsap_sel].ttp_rxq,frame,MAX_TTP_FRAMES);         
         }   
         else 
            ASSERT(0);     
         gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count);
      }  
      else/*0!=tmp_peer_buf_ptr*/ 
		{			  
               if( (frame->size-5) <=IRDA_STD_PACKET_SIZE)
               {
               pdu_ptr=(kal_uint8*)get_pdu_ptr(tmp_peer_buf_ptr, &pdu_length);
		   	   kal_mem_set( pdu_ptr, 0, pdu_length); 
		   	   xmemcpy((kal_uint8*)(pdu_ptr),(kal_uint8*)((kal_uint8*)frame+FBUF_HEAD+5),((frame->size)-5));   
		   	   tmp_peer_buf_ptr->pdu_len = (frame->size)-5;				   
               Freebuf(frame);                           
               }
               else
               {
                  kal_prompt_trace(MOD_TTP,"%d larger than Max frame size ",(frame->size-5));
                  gprs_flc_free_peer_buff(IRDA_DATA,0,GPRS_FLC_DL,0,tmp_peer_buf_ptr);	      
                  Freebuf(frame);
                  send_data=0;         
               }      
            }   
         }   
      }
	   ttp_ilm=allocate_ilm(MOD_TTP);/*MOD_TTP*/
	   ttp_ilm->src_mod_id=MOD_TTP; /*MOD_TTP*/
      if(local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL)
      {
	      ttp_ilm->dest_mod_id=MOD_OBEX;	/*@@@@MOD_OBEX*/	
	      ttp_ilm->sap_id=IRDA_OBEX_SAP;
	   }
	   else if (local_lsap_sel==COMMX_LSAP_SEL)
	   {
	      ttp_ilm->dest_mod_id=MOD_IRCOMM;	/*@@@@MOD_IRCOMM*/	
	      ttp_ilm->sap_id=IRDA_IRCOMM_SAP;	   
	   }
      	   
	   ttp_ilm->msg_id=msg;	   
	   ttp_ilm->local_para_ptr=(local_para_struct *)tmp_local_para; 
	   if(msg==MSG_ID_TTP_DATA_INDICATION)
	      ttp_ilm->peer_buff_ptr=(peer_buff_struct *) tmp_peer_buf_ptr;               
	if(send_data) 
	{	   
	   msg_send_ext_queue(ttp_ilm);
	}	
	else   
	{
	   free_ilm(ttp_ilm);
	   cancel_ilm(MOD_TTP);
	}
}	/* ttp_send_msg_to_upper_layer() */

/*************************************************************************
* FUNCTION
*	process_rx_ctrl_q
*
* DESCRIPTION
*	process_ttp_rx_queue
*
* PARAMETERS
*  
* RETURNS
*  None
*
* GLOBALS AFFECTED
*  check the rx queue of the specified TTP queue then send one 
 			   data frame to upper layer if any frame exists in the TTP queue
*************************************************************************/
kal_uint32 ui=0;
kal_uint16 irda_buff_count2=0;

void process_rx_ctrl_q(kal_uint8 lsap_sel)
{
   FBUF *frame;
   gprs_flc_pool_presence_enum is_pool_presence;
   
   
   #ifdef IRDA_KAL_TRACE  
     kal_trace(TRACE_FUNC, IRDA_MSG81); 
#endif
   gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count2);
      
   while(FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_rxq) && (0!=irda_buff_count2))
   {      
      ui++;
      QUEUE_REMOVE(lm_con[lsap_sel].ttp_rxq,frame,MAX_TTP_FRAMES);
      ttp_send_msg_to_upper_layer(MSG_ID_TTP_DATA_INDICATION,frame,IRDA_SUCCESS);			  
      gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
                                              0,
                                      GPRS_FLC_DL,
                                              0,
                                      &is_pool_presence,
                                      0,
                                      &irda_buff_count2);            
   }
   irda_ttp_disconnect_ind_check();
}   


⌨️ 快捷键说明

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