/******************************************************************************
*
* Copyright (C) 2009-2013 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#include <string.h>
#include "bt_target.h"
#include "gap_int.h"
#include "btm_int.h"
#include "gki.h"
#include "btu.h"
/*******************************************************************************
**
** Function GAP_SetDiscoverableMode
**
** Description This function is called to allow or disallow a service to
** discovered (Inquiry Scans).
**
** Parameters: mode - GAP_NON_DISCOVERABLE, GAP_LIMITED_DISCOVERABLE,
** or GAP_GENERAL_DISCOVERABLE
**
** duration - Amount of time for the duration of an inquiry scan.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
** If a value of '0' is entered the default of
** 0x0012 (11.25 msecs) will be used.
** Note: The duration must be less than or equal to
** the interval.
**
** interval - Amount of time between the start of two inquiry scans.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
** If a value of '0' is entered the default of
** 0x800 (1.28 secs) will be used.
**
**
** Returns BT_PASS (0) if successful,
** GAP_ERR_ILL_PARM if a bad parameter is detected,
** GAP_DEVICE_NOT_UP if the device is not active,
** GAP_ERR_PROCESSING if not enough resources to carry out request
**
*******************************************************************************/
UINT16 GAP_SetDiscoverableMode (UINT16 mode, UINT16 duration, UINT16 interval)
{
tBTM_STATUS status;
status = BTM_SetDiscoverability(mode, duration, interval);
return (gap_convert_btm_status (status));
}
/*******************************************************************************
**
** Function GAP_ReadDiscoverableMode
**
** Description This function is called to retrieve the current discoverable mode
** for the local device.
**
** Parameters: duration - pointer to the amount of time of an inquiry scan.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
** interval - pointer to the amount of time between the start of
** two inquiry scans.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
**
** Returns GAP_NON_DISCOVERABLE, GAP_LIMITED_DISCOVERABLE, or
** GAP_GENERAL_DISCOVERABLE
**
*******************************************************************************/
UINT16 GAP_ReadDiscoverableMode (UINT16 *duration, UINT16 *interval)
{
return (BTM_ReadDiscoverability(duration, interval));
}
/*******************************************************************************
**
** Function GAP_SetConnectableMode
**
** Description This function is called to allow or disallow a
** connections on the local device.
**
** Parameters: mode - GAP_NON_CONNECTABLE, GAP_CONNECTABLE,
**
** duration - Amount of time for the duration of a page scan.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
** If a value of '0' is entered the default of
** 0x0012 (11.25 msecs) will be used.
** Note: The duration must be less than or equal to
** the interval.
**
** interval - Amount of time between the start of two page scans.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
** If a value of '0' is entered the default of
** 0x800 (1.28 secs) will be used.
**
**
** Returns BT_PASS (0) if successful,
** GAP_ERR_ILL_PARM if a bad parameter is detected,
** GAP_DEVICE_NOT_UP if the device is not active,
** GAP_ERR_PROCESSING if not enough resources to carry out request
**
*******************************************************************************/
UINT16 GAP_SetConnectableMode (UINT16 mode, UINT16 duration, UINT16 interval)
{
tBTM_STATUS status;
status = BTM_SetConnectability(mode, duration, interval);
return (gap_convert_btm_status (status));
}
/*******************************************************************************
**
** Function GAP_FindAddrByName
**
** Description This function is called to retrieve a device address given
** a device name. It first looks in the current local inquiry
** database for the device with the specified name. If not found
** it initiates a general inquiry. Upon completion, it retrieves
** the name for each device until a match is found or all devices
** have been checked. Note: This process can take a while to
** complete.
**
** Parameters: devname -
**
** inqparms - pointer to the inquiry information
** mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
** duration - length in 1.28 sec intervals
** max_resps - maximum amount of devices to search for before ending the inquiry
** filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
** GAP_FILTER_COND_BD_ADDR
** filter_cond - value for the filter (based on filter_cond_type)
**
**
** Returns BT_PASS if the name was immediately available. (BD_ADDR is returned)
** GAP_CMD_INITIATED if an inquiry has been initiated
**
*******************************************************************************/
UINT16 GAP_FindAddrByName (BD_NAME devname, tGAP_INQ_PARMS *p_inq_parms, tGAP_CALLBACK *p_addr_cb,
BD_ADDR bd_addr)
{
UINT16 status;
tBTM_STATUS btm_status;
/* If the remote name is retrieved automatically during an inquiry search the local db first */
if ((status = gap_find_local_addr_by_name (devname, bd_addr)) != BT_PASS)
{
/* If this code is used, the name wasn't in the current inquiry database */
/* A general inquiry must now be initiated */
if (gap_cb.findaddr_cb.in_use == FALSE)
{
gap_cb.findaddr_cb.p_cback = p_addr_cb;
gap_cb.findaddr_cb.p_cur_inq = (tBTM_INQ_INFO *) NULL; /* Reset to the beginning of the database */
BCM_STRNCPY_S ((char *)gap_cb.findaddr_cb.results.devname, sizeof(gap_cb.findaddr_cb.results.devname), (char *)devname, BTM_MAX_REM_BD_NAME_LEN);
/* make sure we have an end of string char */
gap_cb.findaddr_cb.results.devname[BTM_MAX_REM_BD_NAME_LEN] = 0;
btm_status = BTM_StartInquiry (p_inq_parms, (tBTM_INQ_RESULTS_CB *) NULL,
(tBTM_CMPL_CB *) gap_find_addr_inq_cb);
gap_cb.findaddr_cb.in_use = TRUE;
/* convert the error code into a GAP code and check the results for any errors */
if ((status = gap_convert_btm_status (btm_status)) == GAP_CMD_INITIATED)
gap_cb.findaddr_cb.in_use = TRUE;
}
else
status = GAP_ERR_BUSY;
}
return (status);
}
/*******************************************************************************
**
** Function GAP_ReadConnectableMode
**
** Description This function is called to retrieve the current connectability
** mode for the local device.
**
** Parameters: duration - pointer to the amount of time of an page scan.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
** interval - pointer to the amount of time between the start of
** two page scans.
** The step size is in 0.625 msec intervals.
** Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
**
**
** Returns GAP_NON_CONNECTABLE, GAP_CONNECTABLE
**
*******************************************************************************/
UINT16 GAP_ReadConnectableMode (UINT16 *duration, UINT16 *interval)
{
return (BTM_ReadConnectability(duration, interval));
}
/*******************************************************************************
**
** Function GAP_SetSecurityMode
**
** Description Set security mode for the device
**
** Returns void
**
*******************************************************************************/
void GAP_SetSecurityMode (UINT8 sec_mode)
{
BTM_SetSecurityMode (sec_mode);
}
/*******************************************************************************
**
** Function GAP_Bond
**
** Description This function is called to perform bonding with peer device
**
** Parameters: bd_addr - Address of the device to bond
** pin_len - length in bytes of the PIN Code
** p_pin - pointer to array with the PIN Code
** trusted_mask - bitwise OR of trusted services (array of UINT32)
**
*******************************************************************************/
UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
{
return ((UINT8) BTM_SecBond (bd_addr, pin_len, p_pin, trusted_mask));
}
/*******************************************************************************
**
** Function GAP_SecRegister
**
** Description Application manager calls this function to register for
** security services. There can be one and only one application
** saving link keys. BTM allows only first registration.
**
** Returns TRUE if registered OK, else FALSE
**
*******************************************************************************/
BOOLEAN GAP_SecRegister (tBTM_APPL_INFO *p_cb_info)
{
return (BTM_SecRegister (p_cb_info));
}
/*******************************************************************************
**
** Function GAP_PinRsp
**
** Description This function is called from UI after Security Manager submitted
** PIN code request.
**
** Parameters: bd_addr - Address of the device for which PIN was requested
** res - result of the operation BTM_SUCCESS if success
** pin_len - length in bytes of the PIN Code
** p_pin - pointer to array with the PIN Code
** trusted_mask - bitwise OR of trusted services (array of UINT32)
**
*******************************************************************************/
void GAP_PinRsp (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
{
BTM_PINCodeReply (bd_addr, res, pin_len, p_pin, trusted_mask);
}
/*******************************************************************************
**
** Function GAP_AuthorizeRsp
**
** Description This function is called from UI after Security Manager submitted
** authorization request
**
** Parameters: bd_addr - Address of the device for which PIN was requested
** res - result of the operation BTM_SUCCESS if success
** trusted_mask - bitwise OR of trusted services (array of UINT32)
**
*******************************************************************************/
void GAP_AuthorizeRsp (BD_ADDR bd_addr, UINT8 res, UINT32 trusted_mask[])
{
BTM_DeviceAuthorized (bd_addr, res, trusted_mask);
}
/*******************************************************************************
**
** Function GAP_SetPairableMode
**
** Description This function is called to allow or disallow pairing
** on the local device.
**
** Parameters: mode - GAP_ALLOW_PAIRING, GAP_DISALLOW_PAIRING
** connect_only_pairable - TRUE or FALSE connect only to paired devices
**
** callback - The callback is called when a pin number is requested.
**
** Returns BT_PASS (0) if successful, or a non-zero error code
**
*******************************************************************************/
UINT16 GAP_SetPairableMode (UINT16 mode, BOOLEAN connect_only_paired)
{
tBTM_STATUS btm_status;
UINT16 status = BT_PASS;
if (mode == GAP_ALLOW_PAIRING)
{
btm_status = BTM_SetConnectability(BTM_CONNECTABLE, 0, 0);
if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
BTM_SetPairableMode (TRUE, connect_only_paired);
}
else if (mode == GAP_DISALLOW_PAIRING)
{
BTM_SetPairableMode (FALSE, connect_only_paired);
}
else
{
GAP_TRACE_ERROR1 ("GAP_SetPairableMode: illegal mode %d", mode);
status = GAP_ERR_ILL_MODE;
}
return (status);
}
/*******************************************************************************
**
** Function GAP_StartInquiry
**
** Description This function initiates a single inquiry.
**
** Parameters: p_inqparms - pointer to the inquiry information
** mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
** duration - length in 1.28 sec intervals
** max_resps - maximum amount of devices to search for before ending the inquiry
** filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
** GAP_FILTER_COND_BD_ADDR
** filter_cond - value for the filter (based on filter_cond_type)
**
** p_results_cb - Pointer to the callback routine which gets called
** upon receipt of an inquiry result. If this field is
** NULL, the application is not notified.
**
** p_cmpl_cb - Pointer to the callback routine which gets called
** upon completion. If this field is NULL, the
** application is not notified when completed.
**
**
** Returns BT_PASS (0) if successful,
** GAP_ERR_ILL_MODE if a bad mode parameter was passed
** GAP_ERR_ILL_INQ_TIME if a bad interval or duration was passed
** GAP_ERR_NO_CTRL_BLK if out of control blocks
** GAP_ERR_ILL_PARM if a bad parameter was detected in BTM
** GAP_ERR_BUSY if the device already has an iquiry active
** GAP_DEVICE_NOT_UP if the device is not initialized yet
** GAP_ERR_PROCESSING if any other BTM error was returned
**
*******************************************************************************/
UINT16 GAP_StartInquiry (tGAP_INQ_PARMS *p_inq_parms, tGAP_CALLBACK *p_results_cb, tGAP_CALLBACK *p_cmpl_cb)
{
tGAP_INFO *p_cb;
tBTM_STATUS btm_status;
UINT16 retval;
/*** Make sure the parameters are valid before continuing ***/
if (p_inq_parms->mode != GAP_GENERAL_INQUIRY && p_inq_parms->mode != GAP_LIMITED_INQUIRY)
return (GAP_ERR_ILL_MODE);
if (p_inq_parms->duration < GAP_MIN_INQUIRY_LEN ||
p_inq_parms->duration > GAP_MAX_INQUIRY_LENGTH)
return (GAP_ERR_ILL_INQ_TIME);
/*** get a control block for this operation ***/
if ((p_cb = gap_allocate_cb()) != NULL)
{
p_cb->gap_cback = p_cmpl_cb;
p_cb->gap_inq_rslt_cback = p_results_cb;
p_cb->event = GAP_EVT_INQUIRY_COMPLETE; /* Return event expected */
btm_status = BTM_StartInquiry(p_inq_parms, gap_inq_results_cb,
(tBTM_CMPL_CB *) gap_cb.btm_cback[p_cb->index]);
/* convert the error code into a GAP code and check the results for any errors */
if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
gap_free_cb(p_cb); /* Error starting the inquiry */
}
else
retval = GAP_ERR_NO_CTRL_BLK;
return (retval);
}
/*******************************************************************************
**
** Function GAP_StartPeriodicInquiry
**
** Description This function initiates a periodic inquiry.
**
** Parameters: p_inqparms - pointer to the inquiry information
** mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
** duration - length in 1.28 sec intervals
** max_resps - maximum amount of devices to search for before ending the inquiry
** filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
** GAP_FILTER_COND_BD_ADDR
** filter_cond - value for the filter (based on filter_cond_type)
**
** min_time - Minimum amount of time between consecutive inquiries.
** The value is in 1.28 second intervals.
** Range: 0x0002 - 0xFFFE (2.56 - 83883.52 seconds)
**
** max_time - Maximum amount of time between consecutive inquiries.
** The value is in 1.28 sec intervals.
** Range: 0x0003 - 0xFFFF (3.84 - 83884.8 seconds)
**
** p_results_cb - Pointer to the callback routine which gets called
** upon receipt of an inquiry result. If this field is
** NULL, the application is not notified.
**
**
** Returns BT_PASS (0) if successful,
** GAP_ERR_ILL_MODE if a bad mode parameter was passed
** GAP_ERR_ILL_INQ_TIME if a bad interval or duration was passed
** GAP_ERR_NO_CTRL_BLK if out of control blocks
** GAP_ERR_ILL_PARM if a bad parameter was detected in BTM
** GAP_ERR_BUSY if the device already has an iquiry active
** GAP_DEVICE_NOT_UP if the device is not initialized yet
** GAP_ERR_PROCESSING if any other BTM error was returned
**
*******************************************************************************/
UINT16 GAP_StartPeriodicInquiry (tGAP_INQ_PARMS *p_inq_parms, UINT16 min_time,
UINT16 max_time, tGAP_CALLBACK *p_results_cb)
{
tGAP_INFO *p_cb;
tBTM_STATUS btm_status;
UINT16 retval = BT_PASS;
/*** Make sure the parameters are valid before continuing ***/
if (p_inq_parms->mode != GAP_GENERAL_INQUIRY && p_inq_parms->mode != GAP_LIMITED_INQUIRY)
return (GAP_ERR_ILL_MODE);
if (p_inq_parms->duration < GAP_MIN_INQUIRY_LEN ||
p_inq_parms->duration > GAP_MAX_INQUIRY_LENGTH ||
min_time <= p_inq_parms->duration ||
min_time < GAP_PER_INQ_MIN_MIN_PERIOD ||
min_time > GAP_PER_INQ_MAX_MIN_PERIOD ||
max_time <= min_time ||
max_time < GAP_PER_INQ_MIN_MAX_PERIOD)
{
return (GAP_ERR_ILL_INQ_TIME);
}
/*** get a control block for this operation ***/
if ((p_cb = gap_allocate_cb()) != NULL)
{
p_cb->gap_inq_rslt_cback = p_results_cb;
p_cb->event = GAP_EVT_INQUIRY_COMPLETE; /* mark the inquiry event active */
btm_status = BTM_SetPeriodicInquiryMode(p_inq_parms, max_time, min_time,
gap_inq_results_cb);
/* convert the error code into a GAP code and check the results for any errors */
if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
gap_free_cb(p_cb); /* Error starting the inquiry */
}
else
retval = GAP_ERR_NO_CTRL_BLK;
return (retval);
}
/*******************************************************************************
**
** Function GAP_CancelInquiry
**
** Description This function cancels a single inquiry (if in progress)
**
** Parameters: None
**
** Returns BOOLEAN (TRUE if successful, otherwise FALSE)
**
*******************************************************************************/
UINT16 GAP_CancelInquiry(void)
{
tGAP_INFO *p_cb = &gap_cb.blk[0];
UINT8 x;
tBTM_STATUS btm_status;
UINT16 status;
btm_status = BTM_CancelInquiry();
if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
{
/* Free the control block that is waiting for the inquiry complete event */
for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++)
{
if (p_cb->in_use && p_cb->event == GAP_EVT_INQUIRY_COMPLETE)
{
gap_free_cb(p_cb);
return (BT_PASS);
}
}
/* If here the control block was not found */
status = GAP_ERR_NO_CTRL_BLK;
}
return (status);
}
/*******************************************************************************
**
** Function GAP_CancelPeriodicInquiry
**
** Description This function cancels a periodic inquiry (if in progress)
**
** Parameters: None
**
** Returns BOOLEAN: (TRUE if successful, otherwise FALSE)
**
*******************************************************************************/
UINT16 GAP_CancelPeriodicInquiry(void)
{
tGAP_INFO *p_cb = &gap_cb.blk[0];
UINT8 x;
tBTM_STATUS btm_status;
UINT16 status;
btm_status = BTM_CancelPeriodicInquiry();
if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
{
/* Free the control block that is waiting for the inquiry complete event */
for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++)
{
if (p_cb->in_use && p_cb->event == GAP_EVT_INQUIRY_COMPLETE)
{
gap_free_cb(p_cb);
return (BT_PASS);
}
}
/* If here the control block was not found */
status = GAP_ERR_NO_CTRL_BLK;
}
return (status);
}
/*******************************************************************************
**
** Function GAP_GetFirstInquiryResult
**
** Description This function retrieves the first valid inquiry result.
**
** Parameters: p_results - pointer to the inquiry results
**
** Returns BT_PASS (0) if successful, or a non-zero error code
** GAP_EOINQDB if no more entries in the database.
**
*******************************************************************************/
UINT16 GAP_GetFirstInquiryResult(tGAP_INQ_RESULTS *p_results)
{
UINT8 *ptr;
gap_cb.cur_inqptr = BTM_InqFirstResult();
if (gap_cb.cur_inqptr != NULL)
{
memcpy(p_results, &gap_cb.cur_inqptr->results, sizeof(tBTM_INQ_RESULTS));
ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
GAP_TRACE_EVENT6("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
return(BT_PASS);
}
else
{
GAP_TRACE_EVENT0("GAP_FirstInqResults: No BD_ADDRs Found");
memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
return(GAP_EOINQDB);
}
}
/*******************************************************************************
**
** Function GAP_GetNextInquiryResult
**
** Description This function retrieves the next valid inquiry result.
**
** Parameters: p_results - pointer to the inquiry results
**
** Returns BT_PASS (0) if successful, or a non-zero status code
** GAP_EOINQDB if no more entries in the database.
**
*******************************************************************************/
UINT16 GAP_GetNextInquiryResult(tGAP_INQ_RESULTS *p_results)
{
UINT8 *ptr;
/*** if the current inquiry db pointer is NULL then call the first entry ***/
if (gap_cb.cur_inqptr)
{
gap_cb.cur_inqptr = BTM_InqNextResult(gap_cb.cur_inqptr);
if (gap_cb.cur_inqptr != NULL)
{
memcpy(p_results, &gap_cb.cur_inqptr->results,
sizeof(tGAP_INQ_RESULTS));
ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
GAP_TRACE_EVENT6("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
return(BT_PASS);
}
else
{
GAP_TRACE_EVENT0("GAP_NextInqResults: No BD_ADDRs Found");
memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
return(GAP_EOINQDB);
}
}
else
return (GAP_GetFirstInquiryResult(p_results));
}
/*******************************************************************************
**
** Function GAP_ReadLocalDeviceInfo
**
** Description This function retrieves local device information to the caller.
**
** Parameters: name - (output) pointer to the UTF-8 encoded string representing
** the device name.
**
** addr - (output) pointer to the Bluetooth device address (BD_ADDR).
**
** verinfo - (output) pointer to the LMP version information.
**
** features - (output) pointer to the LMP features for the device.
**
** NOTE: Return parameters that are set to NULL are not retrieved.
**
** Returns BT_PASS (0) if successful, or a non-zero error code
**
*******************************************************************************/
UINT16 GAP_ReadLocalDeviceInfo(UINT8 *name, BD_ADDR *addr, tGAP_LMP_VERSION *verinfo,
tGAP_LMP_FEATURES *features)
{
return (GAP_UNSUPPORTED);
}
/*******************************************************************************
**
** Function GAP_GetRemoteDeviceName
**
** Description The remote name is retrieved from the specified remote device. If
** GAP_CMD_INITIATED is returned by the function, the command was
** successfully sent to the controller. The GAP_EVT_NAME_RESP event
** is passed in the callback when the remote device name has been retrieved.
**
** Parameters: addr - The Bluetooth device address (BD_ADDR) of the remote
** device.
**
** callback - pointer to the callback which is called after the
** remote device has been retrieved.
** p_data in the callback points to the structure containing the
** status, device name length, and the UTF-8 encoded
** device name. (type tBTM_REMOTE_DEV_NAME)
** The event field in the callback is set to GAP_EVT_REM_NAME_COMPLETE.
** The callback is not called unless (GAP_CMD_INITIATED) is returned.
**
**
** Returns
** GAP_CMD_INITIATED if remote search successfully initiated
** GAP_ERR_BUSY if a remote name request is already in progress,
** GAP_ERR_NO_CTRL_BLK if out of control blocks (too many commands pending)
** GAP_BAD_BD_ADDR if the device address is bad,
** GAP_DEVICE_NOT_UP if the device has not been initialized yet
** GAP_ERR_PROCESSING if any other BTM error has been returned
**
*******************************************************************************/
UINT16 GAP_GetRemoteDeviceName (BD_ADDR addr, tGAP_CALLBACK *callback)
{
tGAP_INFO *p_cb;
UINT16 retval;
tBTM_STATUS btm_status;
if ((p_cb = gap_allocate_cb()) != NULL)
{
p_cb->gap_cback = callback;
p_cb->event = GAP_EVT_REM_NAME_COMPLETE; /* Return event expected */
btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index]);
/* If the name was not returned immediately, or if an error occurred, release the control block */
if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
gap_free_cb (p_cb);
}
else
retval = GAP_ERR_NO_CTRL_BLK;
return (retval);
}
/*******************************************************************************
**
** Function GAP_SetDeviceClass
**
** Description This function updates the local Device Class.
**
** Parameters:
** p_cod - Pointer to the device class to set to
**
** cmd - the fields of the device class to update.
** GAP_SET_COD_MAJOR_MINOR, - overwrite major, minor class
** GAP_SET_COD_SERVICE_CLASS - set the bits in the input
** GAP_CLR_COD_SERVICE_CLASS - clear the bits in the input
** GAP_SET_COD_ALL - overwrite major, minor, set the bits in service class
** GAP_INIT_COD - overwrite major, minor, and service class
**
** Returns BT_PASS (0) if successful,
** GAP_ERR_BUSY if a discovery is already in progress
** GAP_ERR_ILL_PARM if an illegal parameter was detected
** GAP_ERR_PROCESSING if any other BTM error has been returned
**
*******************************************************************************/
UINT16 GAP_SetDeviceClass(tGAP_COD *p_cod, UINT8 cmd)
{
tBTM_STATUS btm_status;
UINT8 *dev;
UINT16 service;
UINT8 minor, major;
DEV_CLASS dev_class;
dev = BTM_ReadDeviceClass();
BTM_COD_SERVICE_CLASS( service, dev );
BTM_COD_MINOR_CLASS(minor, dev );
BTM_COD_MAJOR_CLASS(major, dev );
switch(cmd)
{
case GAP_SET_COD_MAJOR_MINOR:
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
break;
case GAP_SET_COD_SERVICE_CLASS:
/* clear out the bits that is not SERVICE_CLASS bits */
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
service = service | p_cod->service;
break;
case GAP_CLR_COD_SERVICE_CLASS:
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
service = service & (~p_cod->service);
break;
case GAP_SET_COD_ALL:
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
service = service | p_cod->service;
break;
case GAP_INIT_COD:
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
service = p_cod->service & BTM_COD_SERVICE_CLASS_MASK;
break;
default:
return GAP_ERR_ILL_PARM;
}
/* convert the fields into the device class type */
FIELDS_TO_COD(dev_class, minor, major, service);
btm_status = BTM_SetDeviceClass(dev_class);
return (gap_convert_btm_status (btm_status));
}
/*******************************************************************************
**
** Function GAP_ReadDeviceClass
**
** Description This function reads the local Device Class.
**
** Parameters:
**
** Returns PASS
**
*******************************************************************************/
UINT16 GAP_ReadDeviceClass(tGAP_COD *p_cod)
{
UINT8 *dev;
dev = BTM_ReadDeviceClass();
BTM_COD_SERVICE_CLASS( p_cod->service, dev );
BTM_COD_MINOR_CLASS( p_cod->minor, dev );
BTM_COD_MAJOR_CLASS( p_cod->major, dev );
return (BT_PASS);
}
/*******************************************************************************
**
** Function GAP_SetTraceLevel
**
** Description This function sets the trace level for GAP. If called with
** a value of 0xFF, it simply returns the current trace level.
**
** Returns The new or current trace level
**
*******************************************************************************/
UINT8 GAP_SetTraceLevel (UINT8 new_level)
{
if (new_level != 0xFF)
gap_cb.trace_level = new_level;
return (gap_cb.trace_level);
}
/*******************************************************************************
**
** Function GAP_Init
**
** Description Initializes the control blocks used by GAP.
**
** This routine should not be called except once per
** stack invocation.
**
** Returns Nothing
**
*******************************************************************************/
void GAP_Init(void)
{
memset (&gap_cb, 0, sizeof (tGAP_CB));
/*** Initialize the callbacks for BTM; Needs to be one per GAP_MAX_BLOCKS ***/
gap_cb.btm_cback[0] = gap_btm_cback0;
#if GAP_MAX_BLOCKS > 1
gap_cb.btm_cback[1] = gap_btm_cback1;
#endif
#if GAP_MAX_BLOCKS > 2
gap_cb.btm_cback[2] = gap_btm_cback2;
#endif
#if defined(GAP_INITIAL_TRACE_LEVEL)
gap_cb.trace_level = GAP_INITIAL_TRACE_LEVEL;
#else
gap_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */
#endif
/* Initialize the connection control block if included in build */
#if GAP_CONN_INCLUDED == TRUE
gap_conn_init();
#endif /* GAP_CONN_INCLUDED */
#if BLE_INCLUDED == TRUE
gap_attr_db_init();
#endif
}