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

📄 lmp.c

📁 MTK平台绝密核心代码之 外设管理(红外线)
💻 C
📖 第 1 页 / 共 4 页
字号:
							{
								if (remote_lsap_sel==IAS_SERVER_LSAP_SEL)
								{
									lmp_send_msg_to_upper_layer(MSG_ID_IAS_GET_REMOTE_LSAP_SEL_CONFIRM,
																irda_data_buffer,IRDA_SUCCESS);
								}
								else
								{
									lmp_send_msg_to_upper_layer(MSG_ID_LMP_DATA_INDICATION,irda_data_buffer,IRDA_SUCCESS);
								}
							}
							else
							{
								if(irda_data_buffer!=0)													
                           Freebuf(irda_data_buffer);	
                        else  
                           ASSERT(0);   

							}
						   break;
						case CONNECT_REQUEST_INDICATION_LM_PDU:	
							/* Send a disconnect LM-PDU to remote side */
							tmpbuf=Getbuf();
							ASSERT(tmpbuf);
							tmpptr=(kal_uint8 *) tmpbuf + I_TX_PACKET_OFFSET;
							tmpptr[0] = 0x80 | remote_lsap_sel;/*MSB is control bit*/
							tmpptr[1] = local_lsap_sel;
							tmpptr[2] = DISCONNECT_LM_PDU;
							tmpptr[3] = DISCONNECT_REASON_CONENCTION_HALF_OPEN;
							tmpbuf->size=4;
							data_tx=IrLAP_DATA_request(tmpbuf);
							/* send disconnect indication to upper layer */						
							IrLMP_Disconnect_Reset(local_lsap_sel);
							lmp_send_msg_to_upper_layer(MSG_ID_LMP_LSAP_DISCONNECT_INDICATION,
														NULL,IRDA_SUCCESS);/*TY modified this */							
						  if(irda_data_buffer!=0)
						  {													
                       Freebuf(irda_data_buffer);	
                       irda_data_buffer=0;
                    }   
                    else  
                       ASSERT(0);  
						   break;		
						case CONNECT_RESPONSE_CONFIRM_LM_PDU:						
						   if(irda_data_buffer!=0)													
						   {
                        Freebuf(irda_data_buffer);	
                        irda_data_buffer=0;
                     }   
                     else  
                        ASSERT(0);  
						   break;
						case DISCONNECT_LM_PDU:                                  /*TY modified this*/							
							IrLMP_Disconnect_Reset(local_lsap_sel);
							lmp_send_msg_to_upper_layer(MSG_ID_LMP_LSAP_DISCONNECT_INDICATION,NULL,IRDA_SUCCESS);
						   if(irda_data_buffer!=0)													
						   {
                        Freebuf(irda_data_buffer);	
                        irda_data_buffer=0;
                     }   
                     else  
                        ASSERT(0);   
						   break;
						default:
						   if(irda_data_buffer!=0)													
						   {
                        Freebuf(irda_data_buffer);	
                        irda_data_buffer=0;
                     }
						   break;   
					}
				   break;
				case IRDA_LMP_CC_READY:
					/* p58, p59, DISCONNECTED state */
					if(return_lm_pdu==CONNECT_REQUEST_INDICATION_LM_PDU)
					{
					   if(remote_lsap_sel!=0)/*initial credit */
					   { 
					      tmpptr= (kal_uint8 *) (irda_data_buffer)+I_RX_PACKET_OFFSET;					   
					      if(local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL||local_lsap_sel==COMMX_LSAP_SEL)
					         lm_con[local_lsap_sel].ttp_dat.sendcredit=(tmpptr[4]&0x7f); 
					   }   
					 if(irda_data_buffer!=0) 
					 {
					    Freebuf(irda_data_buffer);/*free first because ias server may use this */
					    irda_data_buffer=0;
					  } 
					 else  
                  ASSERT(0);
                    
						lm_con[local_lsap_sel].sel=remote_lsap_sel;	
						/*TY modified this */
						lmp_send_msg_to_upper_layer(MSG_ID_LMP_CONNECT_INDICATION,NULL,IRDA_SUCCESS);												
						lm_con[local_lsap_sel].cc_state=IRDA_LMP_CC_INCOMING;
		
					}
					else if ((return_lm_pdu==DATA_LM_PDU)||
							 (return_lm_pdu==CONNECT_RESPONSE_CONFIRM_LM_PDU))
					{	/* drop the frame because the LSAP connection doesn't exit, Data LM-PDU should 
						   not be received */
						/* Send a disconnect LM-PDU to remote side */
						tmpbuf=Getbuf();
						ASSERT(tmpbuf);
						tmpptr=(kal_uint8 *) tmpbuf + I_TX_PACKET_OFFSET;
						tmpptr[0] = 0x80 | remote_lsap_sel;/*MSB is control bit*/
						tmpptr[1] = local_lsap_sel;
						tmpptr[2] = DISCONNECT_LM_PDU;
						tmpptr[3] = DISCONNECT_REASON_USER_REQUEST;
						tmpbuf->size=4;
						data_tx=IrLAP_DATA_request(tmpbuf);						
						if(irda_data_buffer!=0)		
						{											
                     Freebuf(irda_data_buffer);	
                     irda_data_buffer=0;
                   }  
                  else 
                     ASSERT(0);   
					}
					else 
				   {											
                  if(irda_data_buffer!=0)		
						{											
                     Freebuf(irda_data_buffer);	
                     irda_data_buffer=0;
                   }
               }
				   break;
				case IRDA_LMP_CC_NOT_READY:
					/* drop the frame because the LAP connection doesn't exist, 
					   LM-PDU should not be received */
					if(irda_data_buffer!=0)													
					{
                  Freebuf(irda_data_buffer);	
                  irda_data_buffer=0;
               }   
                else 
                  ASSERT(0); 
				   break;
				default:
				   Freebuf(irda_data_buffer);
				   irda_data_buffer=0;
				   break;
			}	
		}
	}
	else
	{	/* control primitive between LAP and LMP, irda_data_buffer will be NULL */
		switch (sc_state)
		{	
			case IRDA_LMP_SC_DISC:/*no LAP connection */
				/*p34, READY state */
				switch (irda_lmp_flag)
				{
					case MSG_ID_LAP_CONNECT_INDICATION:
						for (i=0;i<MAX_SEL;i++)
							lm_con[i].cc_state=IRDA_LMP_CC_READY;
						sc_state=IRDA_LMP_SC_ACTIVE;	
					   break;
					case MSG_ID_LAP_DISCOVERY_INDICATION:
						/* the response will be generated by LAP directly. ignored the 
						   indication here */
					   break;
					default:
					   break;
				}
			   break;	
			case IRDA_LMP_SC_DISCOVER:/*discovery state*/				
				switch (irda_lmp_flag)/* p35, p36, DISCOVER state */
				{
					case MSG_ID_LAP_DISCOVERY_CONFIRM:
						return_value = station_control_check();/**/
						if (return_value==IRDA_SUCCESS)
						{
							if (irda_lmp_flow==IRDA_LMP_LSAP_CONNECT_FLOW)
							{	 
								IrLAP_CONNECT_request(remote_device_address);
								sc_state=IRDA_LMP_SC_SETUP;
							}
						}
						else if (return_value==IRDA_DISCOVERY_NO_DEVICE)
						{
						   if (discovery_retry_counter)/*TY added discovery retry */
						   {	
						   	discovery_retry_counter--;
						   	IrLAP_DISCOVERY_request();
						   
						   }	
						   else/*no other device exists and discovery_retry_counter=0*/
						   {
						   	switch (irda_lmp_flow)
						   	{
						   		case IRDA_LMP_LSAP_CONNECT_FLOW:
						   			local_lsap_sel=current_lsap_sel;
						   			remote_lsap_sel=lm_con[local_lsap_sel].sel;
						   			lmp_send_msg_to_upper_layer(MSG_ID_LMP_CONNECT_CONFIRM,NULL,
						   										IRDA_NO_DEVICE_ERROR);
						   			irda_lmp_flow=IRDA_LMP_IDLE_FLOW;
						   			sc_state=IRDA_LMP_SC_DISC;
						   		   break;
						   		default:
                              sc_state=IRDA_LMP_SC_DISC;						   		
						   		   break;   
						   	}
						   }

						}
					   break;
					case MSG_ID_LAP_DISCOVERY_MEDIA_BUSY_ERROR:
						if (discovery_retry_counter)
						{	/* try again */
							discovery_retry_counter--;
							IrLAP_DISCOVERY_request();
							
						}	
						else
						{
							switch (irda_lmp_flow)
							{
								case IRDA_LMP_LSAP_CONNECT_FLOW:
									local_lsap_sel=current_lsap_sel;
									remote_lsap_sel=lm_con[local_lsap_sel].sel;
									lmp_send_msg_to_upper_layer(MSG_ID_LMP_CONNECT_CONFIRM,NULL,
																IRDA_NO_DEVICE_ERROR);
									irda_lmp_flow=IRDA_LMP_IDLE_FLOW;
								   break;
							}
						}
					   break;
					case MSG_ID_LAP_CONNECT_INDICATION:
						/* reject the connect request */
						/* p35, DISCOVER state */
						IrLAP_DISCONNECT_request();
					   break;
					//default:
					  // break;
				}
			break;
			case IRDA_LMP_SC_SETUP:
				switch (irda_lmp_flag)
				{
					case MSG_ID_LAP_CONNECT_CONFIRM:
						/* LAP connection is established */
						for (i=0;i<MAX_SEL;i++)
							lm_con[i].cc_state=IRDA_LMP_CC_READY;
						sc_state=IRDA_LMP_SC_ACTIVE;
						if (irda_lmp_flow==IRDA_LMP_LSAP_CONNECT_FLOW)
						{		
							local_lsap_sel=current_lsap_sel;
							remote_lsap_sel=lm_con[local_lsap_sel].sel;
							//irda_data_buffer=current_data_buffer;
							irda_lmp_flow=IRDA_LMP_IDLE_FLOW;
							lm_connect_request();
						}
					   break;
					case MSG_ID_LAP_DISCONNECT_INDICATION:	/* connect operation fail */
						sc_state=IRDA_LMP_SC_ACTIVE;
						local_lsap_sel=current_lsap_sel;
						lm_con[local_lsap_sel].discon_code=DISCONNECT_REASON_LAP_CONNECT_FAIL;
						lmp_send_msg_to_upper_layer(MSG_ID_LMP_LSAP_DISCONNECT_INDICATION,NULL,IRDA_SUCCESS);
						init_irda_lmp();
					
					   break;
					default:
					   break;   
				}	
			break;
			case IRDA_LMP_SC_ACTIVE:
				if (irda_lmp_flag==MSG_ID_LAP_DISCONNECT_INDICATION)
				{
					lm_link_disconnect_indication();
					init_irda_lmp();					 
				}			
			   break;
			default:   
			   break;
		}
	}
	if(old_lmp_flag==irda_lmp_flag)	/* to make sure there is not any new event occurs */
    	irda_lmp_flag = NULL_IRDA_LMP_MSG;	
}	/* irda_lap_to_lmp_msg() */
/*************************************************************************
* FUNCTION
*	irda_ttp_to_lmp_msg
*
* DESCRIPTION
*	Process irda_lmp_flag set by TTP according to CC_State
*
* PARAMETERS
*  None
* RETURNS
   None
* GLOBALS AFFECTED
*
*************************************************************************/
void irda_ttp_to_lmp_msg(void)
{	
	kal_uint8 error_state=0;
	kal_uint8 *tmpptr;
	kal_uint16 return_value;
	
	switch (lm_con[local_lsap_sel].cc_state)
	{
		case IRDA_LMP_CC_ACTIVE:/* Data/Disconnect request */
			switch (irda_lmp_flag)
			{	/* page 60, DTR state */
				case MSG_ID_LMP_DATA_REQUEST:
					if (!irda_data_buffer)
					{
						irda_data_buffer=Getbuf();
						ASSERT(irda_data_buffer);
						irda_data_buffer->size=2;
					}
					else
					{
						irda_data_buffer->size+=2;				
					}	
					tmpptr= (kal_uint8 *) (irda_data_buffer)+I_TX_PACKET_OFFSET;
					tmpptr[0] = remote_lsap_sel;
					tmpptr[1] = local_lsap_sel;
					IrLAP_DATA_request(irda_data_buffer);
					irda_data_buffer=0;
				   break;
				case MSG_ID_LMP_DISCONNECT_REQUEST:
					if (!irda_data_buffer)
					{
						irda_data_buffer=Getbuf();
						ASSERT(irda_data_buffer);
						irda_data_buffer->size=4;
					}
					else
					{
						irda_data_buffer->size+=4;
					}	
					tmpptr=(kal_uint8 *) irda_data_buffer + I_TX_PACKET_OFFSET;
					tmpptr[0] = 0x80 | remote_lsap_sel;/*MSB is control bit*/
					tmpptr[1] = local_lsap_sel;
					tmpptr[2] = DISCONNECT_LM_PDU;
					tmpptr[3] = DISCONNECT_REASON_USER_REQUEST;
					lm_con[local_lsap_sel].cc_state=IRDA_LMP_CC_READY;
					IrLAP_DATA_request(irda_data_buffer);
					irda_data_buffer=0;
				   break;
				default:
					error_state=1;
				   break;
			}
		break;
		case IRDA_LMP_CC_INCOMING:/* connect_responss or disconnect request*/
			switch (irda_lmp_flag)
			{	/* page 59, 60, CONNECT state */
				case MSG_ID_LMP_CONNECT_RESPONSE:
					if (!irda_data_buffer)
					{
						irda_data_buffer=Getbuf();
						ASSERT(irda_data_buffer);
						irda_data_buffer->size=4;
					}
					else
					{
						irda_data_buffer->size+=4;
					}	
					tmpptr= (kal_uint8 *) (irda_data_buffer)+I_TX_PACKET_OFFSET;
					tmpptr[0] = remote_lsap_sel | 0x80;/*MSB is control bit*/
					tmpptr[1] = local_lsap_sel;
					tmpptr[2] = CONNECT_RESPONSE_CONFIRM_LM_PDU;
					tmpptr[3] = 0;
					IrLAP_DATA_request(irda_data_buffer);
					irda_data_buffer=0;					
					lm_con[local_lsap_sel].cc_state=IRDA_LMP_CC_ACTIVE;
				   break;
				case MSG_ID_LMP_DISCONNECT_REQUEST:
					if (!irda_data_buffer)
					{
						irda_data_buffer=Getbuf();
						ASSERT(irda_data_buffer);
						irda_data_buffer->size=4;
					}
					else
					{
						irda_data_buffer->size+=4;				
               }
					tmpptr=(kal_uint8 *) irda_data_buffer + I_TX_PACKET_OFFSET;
					tmpptr[0] = 0x80 | remote_lsap_sel;/*MSB is control bit*/
					tmpptr[1] = local_lsap_sel;
					tmpptr[2] = DISCONNECT_LM_PDU;
					tmpptr[3] = DISCONNECT_REASON_USER_REQUEST;
					lm_con[local_lsap_sel].cc_state=IRDA_LMP_CC_READY;
					IrLAP_DATA_request(irda_data_buffer);
					irda_data_buffer=0;
				   break;
				default:
					error_state=1;
				   break;
			}
		break;
		case IRDA_LMP_CC_NOT_READY:
		case IRDA_LMP_CC_READY:
			switch (irda_lmp_flag)
			{
				case MSG_ID_LMP_CONNECT_REQUEST:
					return_value=lm_connect_request();
					if (return_value==IRDA_WRONG_SC_STATE)
					{
						irda_ttp_flag = MSG_ID_LMP_CONNECT_CONFIRM;
						irda_error_code=IRDA_WRONG_SC_STATE_ERROR;
						if (irda_data_buffer)
							Freebuf(irda_data_buffer);
					}
					else if (return_value==IRDA_LSAP_CONNECT_IN_PROGRESS)
					{
						irda_ttp_flag = MSG_ID_LMP_CONNECT_CONFIRM;
						irda_error_code=IRDA_LSAP_CONNECT_IN_PROGRESS_ERROR;
						if (irda_data_buffer)
							Freebuf(irda_data_buffer);
					}
					else if (return_value==IRDA_WRONG_CC_STATE)
						error_state=1;
				break;
				default:
					error_state=1;
				break;
			}
		break;
	}
	if (error_state)/*??????*/

⌨️ 快捷键说明

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