bool SDP_create() { UINT i; L2CAP_API sL2CAP; SDP_API sAPI; /* Allocate the control block */ if (NULL == gpsSDPCB) { gpsSDPCB = BT_malloc(sizeof(SDP_CONTROL_BLOCK)); } /* Initialise the control block structure */ gpsSDPCB->bInitialised = true; for (i = 0; i < SDP_SERVICE_COUNT; ++i) { gpsSDPCB->pService[i] = NULL; } #ifdef SDP_SERVICE_RFCOMM_ENABLE gpsSDPCB->pService[0] = (SDP_SERVICE *)&sServiceRFCOMM; #else #error #endif /*SDP_SERVICE_RFCOMM_ENABLE*/ L2CAP_getAPI(&sL2CAP); gpsSDPCB->L2CAPsendData = sL2CAP.sendData; sAPI.putData = &SDP_API_putPetition; L2CAP_installSDP(&sAPI); DBG_INFO("SDP Initialised\n"); return true; }
BOOL L2CAP_create() { UINT i; HCI_API sHCI; L2CAP_API sAPI; /*Allocate the control block*/ if (NULL == gpsL2CAPCB) { gpsL2CAPCB = BT_malloc(sizeof(L2CAP_CONTROL_BLOCK)); } /*Initialise the structure*/ gpsL2CAPCB->isInitialised = TRUE; gpsL2CAPCB->bSigID = 0; for (i = 0; i < L2CAP_MAX_CHANNELS; ++i) { gpsL2CAPCB->pasChannel[i] = NULL; } /* Get the HCI API */ HCI_getAPI(&sHCI); gpsL2CAPCB->HCIsendData = sHCI.sendData; sAPI.sendData = &L2CAP_API_sendData; sAPI.putData = &L2CAP_API_putData; HCI_installL2CAP(&sAPI); DBG_INFO("L2CAP Initialised\n"); return TRUE; }
BOOL L2CAP_API_sendData(UINT16 uPSM, const BYTE *pData, UINT16 uLen) { BYTE *pL2CAPData = NULL; UINT16 i, uL2CAPLength; L2CAP_CHANNEL *pChannel = NULL; ASSERT(NULL != gpsL2CAPCB); ASSERT(gpsL2CAPCB->isInitialised); pChannel = _L2CAP_getChannelByPSM(uPSM); if (NULL == pChannel) { DBG_INFO("Non-existant channel\n"); return FALSE; } /*Generate an L2CAP data frame*/ /*Set the length*/ uL2CAPLength = uLen + L2CAP_HDR_LEN; /*Allocate the memory (mind the L2CAP HDR)*/ pL2CAPData = (BYTE *) BT_malloc(uL2CAPLength); if(NULL == pL2CAPData) { DBG_ERROR("Not enough memory!\n"); return FALSE; } /*Set the L2CAP frame header*/ /*Length*/ BT_storeLE16(uLen, pL2CAPData, 0); /*Channel*/ BT_storeLE16(pChannel->uRemoteCID, pL2CAPData, 2); /*Do a simple memcopy to get the payload*/ for (i=0; i<uLen; ++i) { pL2CAPData[i + L2CAP_HDR_LEN] = pData[i]; } /*Send the local frame*/ if (!gpsL2CAPCB->HCIsendData(pL2CAPData, uL2CAPLength)) { DBG_ERROR("Unexpected error\n"); return FALSE; } /*Free the memory*/ BT_free(pL2CAPData); DBG_INFO("L2CAP Data sent\n"); return TRUE; }
BOOL BTAPP_Initialise(BT_DEVICE **ppsBTDevice) { BT_DEVICE *psBTDev = NULL; ASSERT(NULL != ppsBTDevice); *ppsBTDevice = (BT_DEVICE *) BT_malloc(sizeof(BT_DEVICE)); psBTDev = *ppsBTDevice; ASSERT(NULL != psBTDev); /* Initialise all the BT stack layers */ HCIUSB_create(); HCI_create(); L2CAP_create(); SDP_create(); RFCOMM_create(); DBG_INFO("BTAPP: Bluetooth stack initialized\n\r"); return TRUE; }
BOOL L2CAP_API_disconnect(UINT16 uPSM) { UINT16 uReqLen; BYTE *pReqData = NULL; L2CAP_CHANNEL *pChannel = NULL; UINT uOffset = 0; BOOL bRetVal = FALSE; ASSERT(NULL != gpsL2CAPCB); ASSERT(gpsL2CAPCB->isInitialised); pChannel = _L2CAP_getChannelByPSM(uPSM); if (NULL == pChannel) { DBG_INFO("Non-existant channel\n"); return FALSE; } /*Generate a connection response frame*/ /*Set the length*/ uReqLen = L2CAP_DISCONN_REQ_SIZE + L2CAP_SIGHDR_LEN + L2CAP_HDR_LEN; /*Allocate the memory (mind the L2CAP HDR)*/ pReqData = BT_malloc(uReqLen); if(NULL == pReqData) { DBG_ERROR("Not enough memory!\n"); return FALSE; } /*Set the L2CAP frame header*/ /*Length*/ BT_storeLE16(uReqLen - L2CAP_HDR_LEN, pReqData, 0); /*Channel*/ BT_storeLE16(L2CAP_SIG_CID, pReqData, 2); /* Set the response command header values */ uOffset = L2CAP_HDR_LEN; /* Command code */ pReqData[uOffset + 0] = L2CAP_DISCONN_REQ; /* Command id (we can randomize it) */ pReqData[uOffset + 1] = 0x01; /* Command length */ BT_storeLE16(L2CAP_DISCONN_REQ_SIZE, pReqData, uOffset + 2); /* * Set the response command data values * RemoteCID (2 octet) * LocalCID (2 octet) */ uOffset = L2CAP_HDR_LEN + L2CAP_SIGHDR_LEN; /*Remote CID*/ BT_storeLE16(pChannel->uRemoteCID, pReqData, uOffset); /*Local CID*/ BT_storeLE16(pChannel->uLocalCID, pReqData, uOffset + 2); /*Send the frame to the remote device*/ bRetVal = gpsL2CAPCB->HCIsendData(pReqData, uReqLen); if(bRetVal) { DBG_INFO("L2CAP Disconn req sent\n") } else {