**
** Function bta_dm_ble_set_scan_params
**
+** Description This function sets BLE scan parameters.
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data)
+{
+ BTM_BleSetScanParams(p_data->ble_set_scan_params.client_if,
+ p_data->ble_set_scan_params.scan_int,
+ p_data->ble_set_scan_params.scan_window,
+ p_data->ble_set_scan_params.scan_mode,
+ p_data->ble_set_scan_params.scan_param_setup_cback);
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_ble_set_conn_scan_params
+**
** Description This function set the preferred connection scan parameters.
**
** Parameters:
**
*******************************************************************************/
-void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data)
+void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data)
{
BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
p_data->ble_set_scan_params.scan_window);
}
/*******************************************************************************
**
-** Function bta_dm_ble_set_scan_params
+** Function bta_dm_ble_set_adv_params
**
** Description This function set the adv parameters.
**
** Returns void
**
*******************************************************************************/
-void BTA_DmSetBleConnScanParams(UINT16 scan_interval, UINT16 scan_window )
+void BTA_DmSetBleConnScanParams(UINT32 scan_interval, UINT32 scan_window)
{
-#if BLE_INCLUDED == TRUE
- tBTA_DM_API_BLE_SCAN_PARAMS *p_msg;
-
- if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL)
+ tBTA_DM_API_BLE_SCAN_PARAMS *p_msg;
+ if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL)
{
memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS));
-
- p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT;
-
+ p_msg->hdr.event = BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT;
p_msg->scan_int = scan_interval;
p_msg->scan_window = scan_window;
+ bta_sys_sendmsg(p_msg);
+ }
+}
+
+/*******************************************************************************
+**
+** Function BTA_DmSetBleScanParams
+**
+** Description This function is called to set scan parameters
+**
+** Parameters: client_if - Client IF
+** scan_interval - scan interval
+** scan_window - scan window
+** scan_mode - scan mode
+** scan_param_setup_status_cback - Set scan param status callback
+**
+** Returns void
+**
+*******************************************************************************/
+void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval,
+ UINT32 scan_window, tBLE_SCAN_MODE scan_mode,
+ tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback)
+{
+ tBTA_DM_API_BLE_SCAN_PARAMS *p_msg;
+
+ if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *)GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL)
+ {
+ memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS));
+ p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT;
+ p_msg->client_if = client_if;
+ p_msg->scan_int = scan_interval;
+ p_msg->scan_window = scan_window;
+ p_msg->scan_mode = scan_mode;
+ p_msg->scan_param_setup_cback = scan_param_setup_cback;
bta_sys_sendmsg(p_msg);
}
-#endif
}
/*******************************************************************************
** Returns None
**
*******************************************************************************/
-extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
UINT32 scan_interval, UINT32 scan_window,
tBTA_BLE_DISCARD_RULE discard_rule,
tBLE_ADDR_TYPE addr_type,
** Returns None
**
*******************************************************************************/
-extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
tBTA_DM_BLE_REF_VALUE ref_value)
{
tBTA_DM_API_READ_SCAN_REPORTS *p_msg;
BTA_DM_API_BLE_SET_BG_CONN_TYPE,
BTA_DM_API_BLE_CONN_PARAM_EVT,
BTA_DM_API_BLE_SCAN_PARAM_EVT,
+ BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT,
BTA_DM_API_BLE_OBSERVE_EVT,
BTA_DM_API_UPDATE_CONN_PARAM_EVT,
#if BLE_PRIVACY_SPT == TRUE
/* set scan parameter for BLE connections */
typedef struct
{
- BT_HDR hdr;
- UINT16 scan_int;
- UINT16 scan_window;
+ BT_HDR hdr;
+ tBTA_GATTC_IF client_if;
+ UINT32 scan_int;
+ UINT32 scan_window;
+ tBLE_SCAN_MODE scan_mode;
+ tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback;
}tBTA_DM_API_BLE_SCAN_PARAMS;
/* Data type for start/stop observe */
typedef struct
{
BT_HDR hdr;
- tBTA_BLE_SCAN_MODE scan_mode;
+ tBTA_BLE_BATCH_SCAN_MODE scan_mode;
UINT32 scan_int;
UINT32 scan_window;
tBTA_BLE_DISCARD_RULE discard_rule;
typedef struct
{
BT_HDR hdr;
- tBTA_BLE_SCAN_MODE scan_type;
+ tBTA_BLE_BATCH_SCAN_MODE scan_type;
tBTA_DM_BLE_REF_VALUE ref_value;
} tBTA_DM_API_READ_SCAN_REPORTS;
extern void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data);
+extern void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data);
extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data);
extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data);
bta_dm_ble_confirm_reply, /* BTA_DM_API_BLE_CONFIRM_REPLY_EVT */
bta_dm_security_grant,
bta_dm_ble_set_bg_conn_type,
- bta_dm_ble_set_conn_params, /* BTA_DM_API_BLE_CONN_PARAM_EVT */
- bta_dm_ble_set_scan_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
+ bta_dm_ble_set_conn_params, /* BTA_DM_API_BLE_CONN_PARAM_EVT */
+ bta_dm_ble_set_scan_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
+ bta_dm_ble_set_conn_scan_params, /* BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT */
bta_dm_ble_observe,
bta_dm_ble_update_conn_params, /* BTA_DM_API_UPDATE_CONN_PARAM_EVT */
#if BLE_PRIVACY_SPT == TRUE
bta_dm_ble_config_local_privacy, /* BTA_DM_API_LOCAL_PRIVACY_EVT */
#endif
- bta_dm_ble_set_adv_params, /* BTA_DM_API_BLE_SCAN_PARAM_EVT */
+ bta_dm_ble_set_adv_params, /* BTA_DM_API_BLE_ADV_PARAM_EVT */
bta_dm_ble_set_adv_config, /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */
bta_dm_ble_set_scan_rsp, /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */
bta_dm_ble_broadcast, /* BTA_DM_API_BLE_BROADCAST_EVT */
enum
{
- BTA_BLE_SCAN_MODE_PASS=1,
- BTA_BLE_SCAN_MODE_ACTI=2,
- BTA_BLE_SCAN_MODE_PASS_ACTI=3
+ BTA_BLE_BATCH_SCAN_MODE_PASS = 1,
+ BTA_BLE_BATCH_SCAN_MODE_ACTI = 2,
+ BTA_BLE_BATCH_SCAN_MODE_PASS_ACTI = 3
};
-typedef UINT8 tBTA_BLE_SCAN_MODE;
+typedef UINT8 tBTA_BLE_BATCH_SCAN_MODE;
enum
{
** Returns void
**
*******************************************************************************/
-extern void BTA_DmSetBleConnScanParams(UINT16 scan_interval,
- UINT16 scan_window );
+extern void BTA_DmSetBleConnScanParams(UINT32 scan_interval,
+ UINT32 scan_window);
+
+/*******************************************************************************
+**
+** Function BTA_DmSetBleScanParams
+**
+** Description This function is called to set scan parameters
+**
+** Parameters: client_if - Client IF
+** scan_interval - scan interval
+** scan_window - scan window
+** scan_mode - scan mode
+** scan_param_setup_status_cback - Set scan param status callback
+**
+** Returns void
+**
+*******************************************************************************/
+extern void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval,
+ UINT32 scan_window, tBLE_SCAN_MODE scan_mode,
+ tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_status_cback);
/*******************************************************************************
**
** Returns None
**
*******************************************************************************/
-extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
+extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode,
UINT32 scan_interval, UINT32 scan_window,
tBTA_BLE_DISCARD_RULE discard_rule,
tBLE_ADDR_TYPE addr_type,
** Returns None
**
*******************************************************************************/
-extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
+extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
tBTA_DM_BLE_REF_VALUE ref_value);
/*******************************************************************************
#define LOG_TAG "bt_btif_bta_ag"
+#include <cutils/properties.h>
+
#include "bta/include/bta_ag_api.h"
#include "hci/include/hci_audio.h"
#include "osi/include/osi.h"
local_le_features.version_supported = cmn_vsc_cb.version_supported;
local_le_features.total_trackable_advertisers =
cmn_vsc_cb.total_trackable_advertisers;
+
+ local_le_features.extended_scan_support = cmn_vsc_cb.extended_scan_support > 0;
+ local_le_features.debug_logging_supported = cmn_vsc_cb.debug_logging_supported > 0;
+
memcpy(prop.val, &local_le_features, prop.len);
HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop);
break;
#define BTIF_GATT_OBSERVE_EVT 0x1000
#define BTIF_GATTC_RSSI_EVT 0x1001
-#define BTIF_GATTC_SCAN_FILTER_EVT 0x1003
+#define BTIF_GATTC_SCAN_FILTER_EVT 0x1003
+#define BTIF_GATTC_SCAN_PARAM_EVT 0x1004
#define ENABLE_BATCH_SCAN 1
#define DISABLE_BATCH_SCAN 0
uint8_t batch_scan_full_max;
uint8_t batch_scan_trunc_max;
uint8_t batch_scan_notify_threshold;
- tBTA_BLE_SCAN_MODE scan_mode;
+ tBTA_BLE_BATCH_SCAN_MODE scan_mode;
uint32_t scan_interval;
uint32_t scan_window;
tBTA_BLE_DISCARD_RULE discard_rule;
uint16_t conn_id;
uint16_t len;
uint16_t mask;
- uint16_t scan_interval;
- uint16_t scan_window;
+ uint32_t scan_interval;
+ uint32_t scan_window;
uint8_t client_if;
uint8_t action;
uint8_t is_direct;
btif_gattc_multi_adv_disable(client_if); // Does context switch
}
+static btgattc_error_t btif_gattc_translate_btm_status(tBTM_STATUS status)
+{
+ switch(status)
+ {
+ case BTM_SUCCESS:
+ case BTM_SUCCESS_NO_SECURITY:
+ return BT_GATTC_COMMAND_SUCCESS;
+
+ case BTM_CMD_STARTED:
+ return BT_GATTC_COMMAND_STARTED;
+
+ case BTM_BUSY:
+ return BT_GATTC_COMMAND_BUSY;
+
+ case BTM_CMD_STORED:
+ return BT_GATTC_COMMAND_STORED;
+
+ case BTM_NO_RESOURCES:
+ return BT_GATTC_NO_RESOURCES;
+
+ case BTM_MODE_UNSUPPORTED:
+ case BTM_WRONG_MODE:
+ case BTM_MODE4_LEVEL4_NOT_SUPPORTED:
+ return BT_GATTC_MODE_UNSUPPORTED;
+
+ case BTM_ILLEGAL_VALUE:
+ case BTM_SCO_BAD_LENGTH:
+ return BT_GATTC_ILLEGAL_VALUE;
+
+ case BTM_UNKNOWN_ADDR:
+ return BT_GATTC_UNKNOWN_ADDR;
+
+ case BTM_DEVICE_TIMEOUT:
+ return BT_GATTC_DEVICE_TIMEOUT;
+
+ case BTM_FAILED_ON_SECURITY:
+ case BTM_REPEATED_ATTEMPTS:
+ case BTM_NOT_AUTHORIZED:
+ return BT_GATTC_SECURITY_ERROR;
+
+ case BTM_DEV_RESET:
+ case BTM_ILLEGAL_ACTION:
+ return BT_GATTC_INCORRECT_STATE;
+
+ case BTM_BAD_VALUE_RET:
+ return BT_GATTC_INVALID_CONTROLLER_OUTPUT;
+
+ case BTM_DELAY_CHECK:
+ return BT_GATTC_DELAYED_ENCRYPTION_CHECK;
+
+ case BTM_ERR_PROCESSING:
+ default:
+ return BT_GATTC_ERR_PROCESSING;
+ }
+}
+
static void btapp_gattc_req_data(UINT16 event, char *p_dest, char *p_src)
{
tBTA_GATTC *p_dest_data = (tBTA_GATTC*) p_dest;
{
btif_gattc_add_remote_bdaddr(p_btif_cb->bd_addr.address, p_btif_cb->addr_type);
btif_gattc_update_properties(p_btif_cb);
-
}
-
}
dev_type = p_btif_cb->device_type;
break;
}
+ case BTIF_GATTC_SCAN_PARAM_EVT:
+ {
+ btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t *)p_param;
+ HAL_CBACK(bt_gatt_callbacks, client->scan_parameter_setup_completed_cb,
+ p_btif_cb->client_if, btif_gattc_translate_btm_status(p_btif_cb->status));
+ break;
+ }
+
default:
LOG_ERROR("%s: Unhandled event (%d)!", __FUNCTION__, event);
break;
(char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
}
+static void bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status)
+{
+ btif_gattc_cb_t btif_cb;
+
+ btif_cb.status = status;
+ btif_cb.client_if = client_if;
+ btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_SCAN_PARAM_EVT,
+ (char *)&btif_cb, sizeof(btif_gattc_cb_t), NULL);
+}
+
static void bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action, tBTA_DM_BLE_SCAN_COND_OP cfg_op,
tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
tBTA_DM_BLE_REF_VALUE ref_value)
}
case BTIF_GATTC_SET_SCAN_PARAMS:
- BTM_BleSetScanParams(p_cb->scan_interval, p_cb->scan_window, BTM_BLE_SCAN_MODE_ACTI);
+ {
+ BTA_DmSetBleScanParams(p_cb->client_if, p_cb->scan_interval, p_cb->scan_window,
+ BTM_BLE_SCAN_MODE_ACTI, bta_scan_param_setup_cb);
break;
+ }
case BTIF_GATTC_CONFIG_STORAGE_PARAMS:
{
(char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
}
-static bt_status_t btif_gattc_set_scan_parameters(int scan_interval, int scan_window)
+static bt_status_t btif_gattc_set_scan_parameters(int client_if, int scan_interval,
+ int scan_window)
{
CHECK_BTGATT_INIT();
btif_gattc_cb_t btif_cb;
+ btif_cb.client_if = client_if;
btif_cb.scan_interval = scan_interval;
btif_cb.scan_window = scan_window;
return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_SCAN_PARAMS,
** Returns void
**
*******************************************************************************/
-void BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window)
+void BTM_BleSetConnScanParams (UINT32 scan_interval, UINT32 scan_window)
{
#if SMP_INCLUDED == TRUE
tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
BOOLEAN new_param = FALSE;
- if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
- BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
+ if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
+ BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
{
if (p_ble_cb->scan_int != scan_interval)
{
tout: %u",
min_conn_int, max_conn_int, slave_latency, supervision_tout);
- if (BTM_BLE_VALID_PRAM(min_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
- BTM_BLE_VALID_PRAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
- BTM_BLE_VALID_PRAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) &&
+ if (BTM_BLE_ISVALID_PARAM(min_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
+ BTM_BLE_ISVALID_PARAM(max_conn_int, BTM_BLE_CONN_INT_MIN, BTM_BLE_CONN_INT_MAX) &&
+ BTM_BLE_ISVALID_PARAM(supervision_tout, BTM_BLE_CONN_SUP_TOUT_MIN, BTM_BLE_CONN_SUP_TOUT_MAX) &&
(slave_latency <= BTM_BLE_CONN_LATENCY_MAX || slave_latency == BTM_BLE_CONN_PARAM_UNDEF))
{
if (p_dev_rec)
UINT8_TO_STREAM(p, p_filt_params->rssi_low_thres);
/* set onlost timeout */
UINT16_TO_STREAM(p, p_filt_params->lost_timeout);
- /* set num_of_track_entries for firmware supporting v0.90 spec and greater */
- if (cmn_ble_vsc_cb.version_supported > 0)
+ /* set num_of_track_entries for firmware greater than L-release version */
+ if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION)
UINT16_TO_STREAM(p, p_filt_params->num_of_tracking_entries);
}
- if (0 == cmn_ble_vsc_cb.version_supported)
+ if (cmn_ble_vsc_cb.version_supported == BTM_VSC_CHIP_CAPABILITY_L_VERSION)
len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN;
else
len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN +
memset(&adv_data, 0 , sizeof(tBTM_BLE_TRACK_ADV_DATA));
BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
adv_data.client_if = (UINT8)ble_advtrack_cb.ref_value;
- if (cmn_ble_vsc_cb.version_supported > 0)
+ if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION)
{
- /* Based on spec v0.90 */
STREAM_TO_UINT8(adv_data.filt_index, p);
STREAM_TO_UINT8(adv_data.advertiser_state, p);
STREAM_TO_UINT8(adv_data.advertiser_info_present, p);
}
else
{
- /* Based on spec v0.52 */
+ /* Based on L-release version */
STREAM_TO_UINT8(adv_data.filt_index, p);
STREAM_TO_UINT8(adv_data.addr_type, p);
STREAM_TO_BDADDR(adv_data.bd_addr.address, p);
/* Only 16 bits will be used for scan interval and scan window as per agreement with Google */
/* So the standard LE range would suffice for scan interval and scan window */
- if ((BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) ||
- BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
+ if ((BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) ||
+ BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX))
&& (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode || BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode
|| BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI == scan_mode)
&& (BTM_BLE_DISCARD_OLD_ITEMS == discard_rule ||
**
** Function btm_update_scanner_filter_policy
**
-** Description This function update the filter policy of scnner or advertiser.
+** Description This function updates the filter policy of scanner
*******************************************************************************/
void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy)
{
tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
- BTM_TRACE_EVENT ("btm_update_scanner_filter_policy");
+
+ UINT32 scan_interval = !p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval;
+ UINT32 scan_window = !p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window;
+
+ BTM_TRACE_EVENT ("%s", __func__);
p_inq->sfp = scan_policy;
- p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
+ p_inq->scan_type = p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE ? BTM_BLE_SCAN_MODE_ACTI : p_inq->scan_type;
- btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
- (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
- (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
- btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
- scan_policy);
+ if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0)
+ {
+ btsnd_hcic_ble_set_scan_params(p_inq->scan_type, (UINT16)scan_interval,
+ (UINT16)scan_window,
+ btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
+ scan_policy);
+ }
+ else
+ {
+ btm_ble_send_extended_scan_params(p_inq->scan_type, scan_interval, scan_window,
+ btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
+ scan_policy);
+ }
}
/*******************************************************************************
**
** Returns BOOLEAN: selective connectino procedure is started.
**
*******************************************************************************/
-BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK *p_select_cback)
+BOOLEAN btm_ble_start_select_conn(BOOLEAN start, tBTM_BLE_SEL_CBACK *p_select_cback)
{
tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
UINT32 scan_int = p_cb->scan_int == BTM_BLE_SCAN_PARAM_UNDEF ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
UINT32 scan_win = p_cb->scan_win == BTM_BLE_SCAN_PARAM_UNDEF ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
- scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
- scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
+ BTM_TRACE_EVENT ("%s", __func__);
if (start)
{
btm_update_scanner_filter_policy(SP_ADV_WL);
btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_PASS;
- if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS, /* use passive scan by default */
- scan_int, /* scan interval */
- scan_win, /* scan window */
- p_cb->addr_mgnt_cb.own_addr_type,
- SP_ADV_WL) /* process advertising packets only from devices in the White List */
- )
- return FALSE;
+ /* Process advertising packets only from devices in the white list */
+ if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0)
+ {
+ /* use passive scan by default */
+ if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS,
+ scan_int,
+ scan_win,
+ p_cb->addr_mgnt_cb.own_addr_type,
+ SP_ADV_WL))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!btm_ble_send_extended_scan_params(BTM_BLE_SCAN_MODE_PASS,
+ scan_int,
+ scan_win,
+ p_cb->addr_mgnt_cb.own_addr_type,
+ SP_ADV_WL))
+ {
+ return FALSE;
+ }
+ }
if (!btm_ble_topology_check(BTM_BLE_STATE_PASSIVE_SCAN))
{
btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
#endif
if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */
- return FALSE;
+ return FALSE;
- /* mark up inquiry status flag */
- p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE;
- p_cb->wl_state |= BTM_BLE_WL_SCAN;
+ /* mark up inquiry status flag */
+ p_cb->scan_activity |= BTM_LE_SELECT_CONN_ACTIVE;
+ p_cb->wl_state |= BTM_BLE_WL_SCAN;
}
}
else
#define BTM_EXT_BLE_RMT_NAME_TIMEOUT 30
#define MIN_ADV_LENGTH 2
-#define BTM_NEW_VSC_CHIP_CAPBLTY_RSP_LEN 13
+#define BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE 9
+
+static tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
#if BLE_VND_INCLUDED == TRUE
static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL;
}
}
+
+/*******************************************************************************
+**
+** Function btm_ble_send_extended_scan_params
+**
+** Description This function sends out the extended scan parameters command to the controller
+**
+** Parameters scan_type - Scan type
+** scan_int - Scan interval
+** scan_win - Scan window
+** addr_type_own - Own address type
+** scan_filter_policy - Scan filter policy
+**
+** Returns TRUE or FALSE
+**
+*******************************************************************************/
+BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int,
+ UINT32 scan_win, UINT8 addr_type_own,
+ UINT8 scan_filter_policy)
+{
+ UINT8 scan_param[HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM];
+ UINT8 *pp_scan = scan_param;
+
+ memset(scan_param, 0, HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM);
+
+ UINT8_TO_STREAM(pp_scan, scan_type);
+ UINT32_TO_STREAM(pp_scan, scan_int);
+ UINT32_TO_STREAM(pp_scan, scan_win);
+ UINT8_TO_STREAM(pp_scan, addr_type_own);
+ UINT8_TO_STREAM(pp_scan, scan_filter_policy);
+
+ BTM_TRACE_DEBUG("%s, %d, %d", __func__, scan_int, scan_win);
+ if ((BTM_VendorSpecificCommand(HCI_BLE_EXTENDED_SCAN_PARAMS_OCF,
+ HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM, scan_param, NULL)) != BTM_SUCCESS)
+ {
+ BTM_TRACE_ERROR("%s error sending extended scan parameters", __func__);
+ return FALSE;
+ }
+ return TRUE;
+}
+
/*******************************************************************************
**
** Function BTM_BleObserve
return status;
}
-#if BLE_VND_INCLUDED == TRUE
/*******************************************************************************
**
** Function btm_vsc_brcm_features_complete
*******************************************************************************/
static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
{
- UINT8 status = 0xFF, *p;
+#if BLE_VND_INCLUDED == TRUE
+ UINT8 status = 0xFF;
+ UINT8 *p;
- BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
+ BTM_TRACE_DEBUG("%s", __func__);
/* Check status of command complete event */
- if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
+ if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&
+ (p_vcs_cplt_params->param_len > 0))
{
p = p_vcs_cplt_params->p_param_buf;
- STREAM_TO_UINT8 (status, p);
+ STREAM_TO_UINT8(status, p);
}
if (status == HCI_SUCCESS)
{
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
- STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.filter_support, p);
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_filter, p);
- STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.energy_support, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
+ STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.filter_support, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_filter, p);
+ STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.energy_support, p);
+
+ if (p_vcs_cplt_params->param_len > BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE)
+ {
+ STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.version_supported, p);
+ }
+ else
+ {
+ btm_cb.cmn_ble_vsc_cb.version_supported = BTM_VSC_CHIP_CAPABILITY_L_VERSION;
+ }
if (btm_cb.cmn_ble_vsc_cb.version_supported == BTM_VSC_CHIP_CAPABILITY_M_VERSION)
{
- STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.version_supported, p);
- STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers, p);
+ STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers, p);
+ STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.extended_scan_support, p);
+ STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.debug_logging_supported, p);
}
btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
}
btm_ble_multi_adv_init();
if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
- {
btm_ble_adv_filter_init();
- }
#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
/* VS capability included and non-4.2 device */
if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 &&
controller_get_interface()->get_ble_resolving_list_max_size() == 0)
- {
btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
- }
#endif
if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
p_ctrl_le_feature_rd_cmpl_cback(status);
-}
#endif
+}
/*******************************************************************************
**
if (!controller_get_interface()->supports_ble())
return BTM_ILLEGAL_VALUE;
- if (!BTM_BLE_VALID_PRAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
- !BTM_BLE_VALID_PRAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
+ if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
+ !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
{
return BTM_ILLEGAL_VALUE;
}
**
** Function BTM_BleSetScanParams
**
-** Description This function is called to set Scan parameters.
+** Description This function is called to set scan parameters.
**
-** Parameters adv_int_min: minimum advertising interval
-** adv_int_max: maximum advertising interval
-** p_dir_bda: connectable direct initiator's LE device address
-** chnl_map: advertising channel map.
-** scan_type: active scan or passive scan
+** Parameters client_if - Client IF
+** scan_interval - Scan interval
+** scan_window - Scan window
+** scan_mode - Scan mode
+** scan_setup_status_cback - Scan param setup status callback
**
** Returns void
**
*******************************************************************************/
-void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window, tBTM_BLE_SCAN_MODE scan_mode)
+void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window,
+ tBLE_SCAN_MODE scan_mode,
+ tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback)
{
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
+ UINT32 max_scan_interval;
+ UINT32 max_scan_window;
- BTM_TRACE_EVENT (" BTM_BleSetScanParams");
+ BTM_TRACE_EVENT ("%s", __func__);
if (!controller_get_interface()->supports_ble())
- return ;
+ return;
- if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
- BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) &&
- (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
+ /* If not supporting extended scan support, use the older range for checking */
+ if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0)
{
- p_cb->scan_type = scan_mode;
+ max_scan_interval = BTM_BLE_SCAN_INT_MAX;
+ max_scan_window = BTM_BLE_SCAN_WIN_MAX;
+ }
+ else
+ {
+ /* If supporting extended scan support, use the new extended range for checking */
+ max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
+ max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
+ }
- if (BTM_BLE_CONN_PARAM_UNDEF != scan_interval)
- p_cb->scan_interval = scan_interval;
+ if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) &&
+ BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) &&
+ (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
+ {
+ p_cb->scan_type = scan_mode;
+ p_cb->scan_interval = scan_interval;
+ p_cb->scan_window = scan_window;
- if (BTM_BLE_CONN_PARAM_UNDEF != scan_window)
- p_cb->scan_window = scan_window;
+ if (scan_setup_status_cback != NULL)
+ scan_setup_status_cback(client_if, BTM_SUCCESS);
}
else
{
+ if (scan_setup_status_cback != NULL)
+ scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE);
+
BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d",
scan_interval, scan_window);
}
/* BLE ADDR type ID bit */
#define BLE_ADDR_TYPE_ID_BIT 0x02
+#define BTM_VSC_CHIP_CAPABILITY_L_VERSION 55
+#define BTM_VSC_CHIP_CAPABILITY_M_VERSION 95
+
typedef struct
{
UINT16 data_mask;
#define BTM_BLE_ADV_DATA_LEN_MAX 31
#define BTM_BLE_CACHE_ADV_DATA_MAX 62
-#define BTM_BLE_VALID_PRAM(x, min, max) (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
+#define BTM_BLE_ISVALID_PARAM(x, min, max) (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
#define BTM_BLE_PRIVATE_ADDR_INT 900 /* 15 minutes minimum for random address refreshing */
extern void btm_clear_all_pending_le_entry(void);
extern void btm_ble_stop_scan();
+extern BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int,
+ UINT32 scan_win, UINT8 addr_type_own,
+ UINT8 scan_filter_policy);
extern void btm_ble_stop_inquiry(void);
extern void btm_ble_init (void);
extern void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role, tBLE_ADDR_TYPE addr_type, BOOLEAN addr_matched);
BTM_REPEATED_ATTEMPTS, /* 19 repeated attempts for LE security requests */
BTM_MODE4_LEVEL4_NOT_SUPPORTED /* 20 Secure Connections Only Mode can't be supported */
};
-typedef UINT8 tBTM_STATUS;
+
+typedef uint8_t tBTM_STATUS;
#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
typedef enum
#define BTM_BLE_SCAN_MODE_PASS 0
#define BTM_BLE_SCAN_MODE_ACTI 1
#define BTM_BLE_SCAN_MODE_NONE 0xff
-typedef UINT8 tBTM_BLE_SCAN_MODE;
+typedef UINT8 tBLE_SCAN_MODE;
#define BTM_BLE_BATCH_SCAN_MODE_DISABLE 0
#define BTM_BLE_BATCH_SCAN_MODE_PASS 1
UINT8 max_filter;
UINT8 energy_support;
BOOLEAN values_read;
- UINT16 version_supported;
- UINT16 total_trackable_advertisers;
+ UINT16 version_supported;
+ UINT16 total_trackable_advertisers;
+ UINT8 extended_scan_support;
+ UINT8 debug_logging_supported;
}tBTM_BLE_VSC_CB;
/* slave preferred connection interval range */
tBTM_BLE_MULTI_ADV_OPQ op_q;
}tBTM_BLE_MULTI_ADV_CB;
+typedef UINT8 tGATT_IF;
+
typedef void (tBTM_BLE_SCAN_THRESHOLD_CBACK)(tBTM_BLE_REF_VALUE ref_value);
typedef void (tBTM_BLE_SCAN_REP_CBACK)(tBTM_BLE_REF_VALUE ref_value, UINT8 report_format,
UINT8 num_records, UINT16 total_len,
typedef void (tBTM_BLE_RANDOM_SET_CBACK) (BD_ADDR random_bda);
typedef void (tBTM_BLE_SCAN_REQ_CBACK)(BD_ADDR remote_bda, tBLE_ADDR_TYPE addr_type, UINT8 adv_evt);
+typedef void (*tBLE_SCAN_PARAM_SETUP_CBACK)(tGATT_IF client_if, tBTM_STATUS status);
tBTM_BLE_SCAN_SETUP_CBACK bta_ble_scan_setup_cb;
**
** Description This function is called to set Scan parameters.
**
-** Parameters adv_int_min: minimum advertising interval
-** adv_int_max: maximum advertising interval
-** scan_type: scan mode.
+** Parameters client_if - Client IF value
+** scan_interval - Scan interval
+** scan_window - Scan window
+** scan_type - Scan type
+** scan_setup_status_cback - Scan setup status callback
**
** Returns void
**
*******************************************************************************/
-extern void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window,
- tBTM_BLE_SCAN_MODE scan_type);
+extern void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval,
+ UINT32 scan_window, tBLE_SCAN_MODE scan_type,
+ tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback);
+
/*******************************************************************************
**
** Function BTM_BleGetVendorCapabilities
**
** Description This function is called to read batch scan reports
**
-** Parameters tBTM_BLE_SCAN_MODE scan_mode - Scan mode report to be read out
+** Parameters tBLE_SCAN_MODE scan_mode - Scan mode report to be read out
tBTM_BLE_SCAN_REP_CBACK* p_cback - Reports callback
**
** Returns tBTM_STATUS
**
*******************************************************************************/
-extern tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_SCAN_MODE scan_mode,
+extern tBTM_STATUS BTM_BleReadScanReports(tBLE_SCAN_MODE scan_mode,
tBTM_BLE_REF_VALUE ref_value);
/*******************************************************************************
** Returns void
**
*******************************************************************************/
-extern void BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window);
+extern void BTM_BleSetConnScanParams (UINT32 scan_interval, UINT32 scan_window);
/******************************************************************************
**
#include "bt_target.h"
#include "gattdefs.h"
+#include "btm_ble_api.h"
/*****************************************************************************
** Constants
} tGATT_DISC_RES;
-typedef UINT8 tGATT_IF;
#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP 0 /* start a idle timer for this duration
when no application need to use the link */
/* Energy info OCF */
#define HCI_BLE_ENERGY_INFO_OCF (0x0159 | HCI_GRP_VENDOR_SPECIFIC)
+/* Extended BLE Scan parameters OCF */
+#define HCI_BLE_EXTENDED_SCAN_PARAMS_OCF (0x0160 | HCI_GRP_VENDOR_SPECIFIC)
+
/* subcode for multi adv feature */
#define BTM_BLE_MULTI_ADV_SET_PARAM 0x01
#define BTM_BLE_MULTI_ADV_WRITE_ADV_DATA 0x02
#define HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE 1
#define HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT 2
#define HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH 6
+#define HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM 11
/* ULP HCI command */
extern BOOLEAN btsnd_hcic_ble_set_evt_mask (BT_EVENT_MASK event_mask);