📄 lmp.c
字号:
{
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 + -