Beispiel #1
0
/*---------------------------------------------------------------------------
 *            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);
    }
}
Beispiel #2
0
/*---------------------------------------------------------------------------
 *            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);
    }
}
Beispiel #3
0
/*---------------------------------------------------------------------------
 *            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;
    }
}
Beispiel #4
0
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;
    }
}