/*--------------------------------------------------------------------------- * HidStateClosed() *--------------------------------------------------------------------------- * * Synopsis: Closed state for the HID channel. * * Return: void */ void HidStateClosed(HidChannel *Channel, L2capChannelId Cid, L2capCallbackParms *Parms) { kal_trace(BT_TRACE_G2_PROFILES,HIDSTATECLOSEDx02X ,Parms->event); if ((Parms->event == L2EVENT_CONNECT_IND) || (Parms->event == L2EVENT_CONNECT_AUTORIZED)) { //Channel->cmgrHandler.callback = HidCmgrCallback; if (CMGR_CreateDataLink(&Channel->cmgrHandler, &Parms->aclLink->bdAddr) != BT_STATUS_SUCCESS) { /* Could not create a link to the ACL */ (void)L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); return; } Channel->state = HID_STATE_CONN_PENDING; HidAppCallback(Channel, HIDEVENT_OPEN_IND, BT_STATUS_SUCCESS, Channel->cmgrHandler.remDev, sizeof(BtRemoteDevice)); } else { /* Ignore any other events */ kal_trace(BT_TRACE_G2_PROFILES,HID_CHANNEL_CLOSED_STATE_RECEIVED_AN_UNEXPECTED_EVENT_x02X , Parms->event); } }
/*--------------------------------------------------------------------------- * HidStateConnPending() *--------------------------------------------------------------------------- * * Synopsis: Connection Pending state for the HID channel. * * Return: void */ void HidStateConnPending(HidChannel *Channel, L2capChannelId Cid, L2capCallbackParms *Parms) { //BtSniffInfo sniffInfo; BtStatus status; kal_trace(BT_TRACE_G2_PROFILES,HIDSTATECONNPENDINGx02X ,Parms->event); switch (Parms->event) { case L2EVENT_CONNECT_AUTORIZED: L2Cap_AuthorizeConnectRsp(Cid, TRUE); break; case L2EVENT_CONNECT_IND: /* A second connection was requested */ status = L2CAP_ConnectRsp(Cid, L2CONN_ACCEPTED, 0); kal_trace(BT_TRACE_G2_PROFILES,L2CAP_CONNECTRSPx02X ,status); break; case L2EVENT_CONNECTED: /* A connection is up */ //Assert(Channel->conCount < 2); if(Channel->conCount >= 2){ bt_prompt_trace(MOD_BT,"[HID]Channel->conCount >= 2"); return; } Channel->conCount++; CMGR_HidNoRoleSwitch(1); if (Channel->conCount == 2) { /* Notify the application */ Channel->state = HID_STATE_OPEN; HidAppCallback(Channel, HIDEVENT_OPEN, BT_STATUS_SUCCESS, Channel->cmgrHandler.remDev, sizeof(BtRemoteDevice)); /* Put it on the list of registered handlers */ CMGR_SetDeviceAsMaster(&Channel->cmgrHandler); // CMGR_ActivateSniffTimer(&Channel->cmgrHandler); } else if (Channel->flags & CHNL_FLAG_INITIATOR) { /* The channel initiated the connection, establish the * interrupt channel */ if (Channel->intrCid == Cid) { /* This means control channel has broken before interrupt channel established */ L2CAP_DisconnectReq(Cid); break; } if (L2CAP_ConnectReq(&HID(hidIntrPsm), BT_PSM_HID_INTR, Channel->cmgrHandler.remDev, 0, &(Channel->intrCid)) != BT_STATUS_PENDING) { /* Connect request failed, tear down the first connection */ status = L2CAP_DisconnectReq(Channel->ctrlCid); kal_trace(BT_TRACE_G2_PROFILES,HID_L2CAP_DISCONNECT_REQ_CID_CIDx02X_STATUSx02X ,Channel->ctrlCid, status); } } break; case L2EVENT_DISCONNECTED: /* Connection is going down */ CMGR_HidNoRoleSwitch(0); HidStateDiscPending(Channel, Cid, Parms); break; default: /* Ignore any other events */ kal_trace(BT_TRACE_G2_PROFILES,HID_CHANNEL_CONN_PENDING_STATE_RECEIVED_AN_UNEXPECTED_EVENT_x02X , Parms->event); } }
/*--------------------------------------------------------------------------- * HidL2Callback() *--------------------------------------------------------------------------- * * Synopsis: L2CAP callback function for the Channel. * * Return: void */ void HidL2Callback(L2capChannelId Cid, L2capCallbackParms *Parms) { HidChannel *channel; channel = HidFindChannelByCid(Cid, Parms->aclLink); kal_trace(BT_TRACE_G2_PROFILES,HIDPARMSEVENTx02X ,Parms->event); kal_trace(BT_TRACE_G2_PROFILES,HID_CID_x02X ,Cid); kal_trace(BT_TRACE_G2_PROFILES,HID_CHANNELx08X , channel); switch (Parms->event) { case L2EVENT_CONNECT_AUTORIZED: if (channel == NULL) { U8 searchType; if (Parms->owner.psm == &HID(hidCtrlPsm)) searchType = HID_FIND_CTRL_CID; else searchType = HID_FIND_INTR_CID; channel = HidFindUnusedChannel(searchType, Parms->aclLink); if (channel == NULL) { if (!HidCheckValidConnect(searchType, Cid, Parms->aclLink)) { Parms->aclLink->discFlag = TRUE; L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); break; } // Get a new channel channel = HidNewChannel(); if (channel == NULL) { kal_trace(BT_TRACE_G2_PROFILES,CHANNEL_IS_0_RETURN); /* No channel available, reject the request */ Parms->aclLink->discFlag = TRUE; L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); break; } channel->cmgrHandler.remDev = Parms->aclLink; } } if (channel->conCount == 0) { /* Only create ACL link for the first L2CAP connection */ if (CMGR_CreateDataLink(&channel->cmgrHandler, &Parms->aclLink->bdAddr) != BT_STATUS_SUCCESS) { /* Could not create a link to the ACL */ (void)L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); break; } } if (Parms->owner.psm == &HID(hidCtrlPsm)) channel->ctrlCid = Cid; else channel->intrCid = Cid; /* Call the state machine */ if (channel != 0) { kal_trace(BT_TRACE_G2_PROFILES,HID_A_SMAx02XBx02X ,channel->state,Cid); HID(hidState)[channel->state](channel, Cid, Parms); } else kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0); break; case L2EVENT_CONNECT_IND: #ifdef HID_AUTHORIZATION //Assert(channel !=0); if(channel ==0){ bt_prompt_trace(MOD_BT,"[HID]channel ==0"); return; } L2CAP_ConnectRsp(Cid, L2CONN_ACCEPTED, 0); #else if (channel == 0) { /* Get a new channel */ if (Parms->owner.psm == &HID(hidCtrlPsm)) channel = HidFindUnusedChannel(HID_FIND_CTRL_CID, Parms->aclLink); else channel = HidFindUnusedChannel(HID_FIND_INTR_CID, Parms->aclLink); } if (channel == 0) { /* No channel available, reject the request */ L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); break; } //Assert(channel !=0); if(channel ==0){ bt_prompt_trace(MOD_BT,"[HID]channel ==0"); return; } if (CMGR_CreateDataLink(&channel->cmgrHandler, &Parms->aclLink->bdAddr) != BT_STATUS_SUCCESS) { /* Could not create a link to the ACL */ (void)L2CAP_ConnectRsp(Cid, L2CONN_REJECT_NO_RESOURCES, 0); break; } /* Drop through */ //Assert(channel !=0); if(channel ==0){ bt_prompt_trace(MOD_BT,"[HID]channel ==0"); return; } if (Parms->owner.psm == &HID(hidCtrlPsm)) channel->ctrlCid = Cid; else channel->intrCid = Cid; /* Call the state machine */ if (channel != 0) { kal_trace(BT_TRACE_G2_PROFILES,HID_B_SMAx02XBx02X ,channel->state,Cid); HID(hidState)[channel->state](channel, Cid, Parms); } else kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0); #endif break; case L2EVENT_CONNECTED: /* Save the channel ID for the channel being requested */ if (channel == 0) { L2CAP_DisconnectReq(Cid); break; } if (Parms->owner.psm == &HID(hidCtrlPsm)) channel->ctrlCid = Cid; else channel->intrCid = Cid; /* Call the state machine */ if (channel != 0) { kal_trace(BT_TRACE_G2_PROFILES,HID_C_SMAx02XBx02X ,channel->state,Cid); HID(hidState)[channel->state](channel, Cid, Parms); } else kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0); break; case L2EVENT_DISCONNECTED: CMGR_HidNoRoleSwitch(0); if (channel != 0) { kal_trace(BT_TRACE_G2_PROFILES,HID_D_SMAx02XBx02X ,channel->state,Cid); HID(hidState)[channel->state](channel, Cid, Parms); } else { kal_trace(BT_TRACE_G2_PROFILES,UNUSED_CHANNEL_0_IGNORE_IT); } break; default: /* Call the state machine */ if (channel != 0) { kal_trace(BT_TRACE_G2_PROFILES,HID_E_SMAx02XBx02X ,channel->state,Cid); HID(hidState)[channel->state](channel, Cid, Parms); } else kal_trace(BT_TRACE_G2_PROFILES,HIDCHANNEL_0); break; } }
void l2capTesterL2Callback(L2capChannelId L2ChannelId, L2capCallbackParms *info) { //add by stanley:2006-0721 local_para_struct* msg; bt_test_cmd_rsp_struct *param_ptr; bt_trace(BT_TRACE_G1_PROTOCOL, BT_L2CAPTS_EVENT, info->event); switch (info->event) { case L2EVENT_CONNECT_IND: L2CAPTS(cid) = L2ChannelId; //add by stanley:2006-0721 param_ptr = (bt_test_cmd_rsp_struct *)construct_local_para( (U16)sizeof(bt_test_cmd_rsp_struct), TD_CTRL); memset(param_ptr->test_cmd_rsp_buf,0,256); param_ptr->test_cmd_rsp_buf[0]=0x03; //logs type param_ptr->test_cmd_rsp_buf[1]=0x02; //L2cap category kal_sprintf((kal_char*)(param_ptr->test_cmd_rsp_buf+4),"L2CA_ConnectReq,using cid=%d",L2ChannelId); Report(("str data send to L4C:%s",param_ptr->test_cmd_rsp_buf+4)); param_ptr->length= strlen((kal_char*)param_ptr->test_cmd_rsp_buf+4); bt_trace(TRACE_GROUP_1,STR_DATA_LENxD ,param_ptr->length); //fill the data length field of string data for rsp param_ptr->test_cmd_rsp_buf[2]= (U8)(param_ptr->length & 0x00ff); param_ptr->test_cmd_rsp_buf[3]= (U8)((param_ptr->length >> 8) & 0x00ff); //rsp_buf's total length = param_ptr->length + 4 bytes header param_ptr->length += 4; msg = (local_para_struct*)param_ptr; #if 0 bt_trace(TRACE_GROUP_1,CALL_BTTESTER_SENDMSG); btTester_sendMsg(MSG_ID_BT_L4C_TEST_CMD_CNF, #ifdef __GEMINI__ Get_DualSim_Uart_Default_Owner(), #else MOD_ATCI, #endif INVALID_SAP, msg, NULL); #endif L2CAP_ConnectRsp(L2ChannelId, L2CONN_ACCEPTED, 0); break; case L2EVENT_DISCONNECTED: case L2EVENT_CONNECTED: case L2EVENT_PACKET_HANDLED: break; case L2EVENT_DATA_IND: break; case L2EVENT_PING_COMPLETE: break; case L2EVENT_INFO_COMPLETE: break; } }