Loading system/bta/dm/bta_dm_pm.cc +68 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,8 @@ static void bta_dm_pm_btm_cback(const RawAddress& bd_addr, tHCI_STATUS hci_status); static bool bta_dm_pm_park(const RawAddress& peer_addr); void bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE* p_peer_dev, uint8_t index); static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); static int bta_dm_get_sco_index(); static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer, uint8_t timer_idx); Loading Loading @@ -95,6 +97,7 @@ void bta_dm_init_pm(void) { /* if there are no power manger entries, so not register */ if (p_bta_dm_pm_cfg[0].app_id != 0) { bta_sys_pm_register(bta_dm_pm_cback); bta_sys_sniff_register(bta_dm_sniff_cback); get_btm_client_interface().lifecycle.BTM_PmRegister( (BTM_PM_REG_SET), &bta_dm_cb.pm_id, bta_dm_pm_btm_cback); Loading Loading @@ -334,6 +337,71 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer, alarm_cancel(p_timer->timer[timer_idx]); } /******************************************************************************* * * Function bta_dm_sniff_cback * * Description Restart sniff timer for a peer * * * Returns void * ******************************************************************************/ static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { int i = 0, j = 0; uint64_t timeout_ms = 0; tBTA_DM_PEER_DEVICE* p_peer_device = bta_dm_find_peer_device(peer_addr); if (p_peer_device == NULL) { LOG_INFO("No peer device found: %s", ADDRESS_TO_LOGGABLE_CSTR(peer_addr)); return; } /* Search for sniff table for timeout value p_bta_dm_pm_cfg[0].app_id is the number of entries */ for (j = 1; j <= p_bta_dm_pm_cfg[0].app_id; j++) { if ((p_bta_dm_pm_cfg[j].id == id) && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID) || (p_bta_dm_pm_cfg[j].app_id == app_id))) break; } // Handle overflow access if (j > p_bta_dm_pm_cfg[0].app_id) { LOG_INFO("No configuration found for %s", ADDRESS_TO_LOGGABLE_CSTR(peer_addr)); return; } const tBTA_DM_PM_CFG* p_pm_cfg = &p_bta_dm_pm_cfg[j]; const tBTA_DM_PM_SPEC* p_pm_spec = &get_bta_dm_pm_spec()[p_pm_cfg->spec_idx]; const tBTA_DM_PM_ACTN* p_act0 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][0]; const tBTA_DM_PM_ACTN* p_act1 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][1]; tBTA_DM_PM_ACTION failed_pm = p_peer_device->pm_mode_failed; /* first check if the first preference is ok */ if (!(failed_pm & p_act0->power_mode)) { timeout_ms = p_act0->timeout; } /* if first preference has already failed, try second preference */ else if (!(failed_pm & p_act1->power_mode)) { timeout_ms = p_act1->timeout; } /* Refresh the sniff timer */ for (i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { if (bta_dm_cb.pm_timer[i].in_use && bta_dm_cb.pm_timer[i].peer_bdaddr == peer_addr) { int timer_idx = bta_pm_action_to_timer_idx(BTA_DM_PM_SNIFF); if (timer_idx != BTA_DM_PM_MODE_TIMER_MAX) { /* Cancel and restart the timer */ bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], timer_idx); bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[i], timer_idx, timeout_ms, id, BTA_DM_PM_SNIFF); } } } } /******************************************************************************* * * Function bta_dm_pm_cback Loading system/bta/jv/bta_jv_act.cc +21 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ static void bta_jv_pm_conn_busy(tBTA_JV_PM_CB* p_cb); static void bta_jv_pm_conn_idle(tBTA_JV_PM_CB* p_cb); static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb, const tBTA_JV_CONN_STATE state); static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb); #ifndef BTA_JV_SDP_DB_SIZE #define BTA_JV_SDP_DB_SIZE 4500 Loading Loading @@ -1258,10 +1259,10 @@ static int bta_jv_port_data_co_cback(uint16_t port_handle, uint8_t* buf, if (p_pcb != NULL) { switch (type) { case DATA_CO_CALLBACK_TYPE_INCOMING: // Exit sniff mode when receiving data by sysproxy // Reset sniff timer when receiving data by sysproxy if (osi_property_get_bool("bluetooth.rfcomm.sysproxy.rx.exit_sniff", false)) { bta_jv_pm_conn_busy(p_pcb->p_pm_cb); bta_jv_reset_sniff_timer(p_pcb->p_pm_cb); } return bta_co_rfc_data_incoming(p_pcb->rfcomm_slot_id, (BT_HDR*)buf); case DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE: Loading Loading @@ -1900,4 +1901,22 @@ static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb, break; } } /******************************************************************************* * * Function bta_jv_reset_sniff_timer * * Description reset pm sniff timer state (input param safe) * * Params p_cb: pm control block of jv connection * * Returns void * ******************************************************************************/ static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb) { if (NULL != p_cb) { p_cb->state = BTA_JV_PM_IDLE_ST; bta_sys_reset_sniff(BTA_ID_JV, p_cb->app_id, p_cb->peer_bd_addr); } } /******************************************************************************/ system/bta/sys/bta_sys.h +6 −2 Original line number Diff line number Diff line Loading @@ -200,6 +200,9 @@ typedef void(tBTA_SYS_ROLE_SWITCH_CBACK)(tBTA_SYS_CONN_STATUS status, typedef void(tBTA_SYS_SSR_CFG_CBACK)(uint8_t id, uint8_t app_id, uint16_t latency, uint16_t tout); typedef void(tBTA_SYS_SNIFF_CBACK)(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); typedef struct { bluetooth::Uuid custom_uuid; uint32_t handle; Loading Loading @@ -241,7 +244,7 @@ void bta_sys_disable(); void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback); void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback); void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback); void bta_sys_sco_register(tBTA_SYS_CONN_SCO_CBACK* p_cback); void bta_sys_conn_open(tBTA_SYS_ID id, uint8_t app_id, Loading @@ -262,7 +265,8 @@ void bta_sys_sco_unuse(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_idle(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_busy(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_reset_sniff(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback); void bta_sys_chg_ssr_config(tBTA_SYS_ID id, uint8_t app_id, uint16_t max_latency, uint16_t min_tout); Loading system/bta/sys/bta_sys_conn.cc +31 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,37 @@ void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.ppm_cb = p_cback; } /******************************************************************************* * * Function bta_sys_sniff_register * * Description Called by BTA DM to register sniff callbacks * * * Returns void * ******************************************************************************/ void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback) { bta_sys_cb.sniff_cb = p_cback; } /******************************************************************************* * * Function bta_sys_reset_sniff * * Description Called by BTA subsystems to reset sniff timer * * * Returns void * ******************************************************************************/ void bta_sys_reset_sniff(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.sniff_cb) { bta_sys_cb.sniff_cb(id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_conn_open Loading system/bta/sys/bta_sys_int.h +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ typedef struct { tBTA_SYS_CONN_CBACK* prm_cb; /* role management callback registered by DM */ tBTA_SYS_CONN_CBACK* ppm_cb; /* low power management callback registered by DM */ tBTA_SYS_SNIFF_CBACK* sniff_cb; /* low power management sniff callback registered by DM */ tBTA_SYS_CONN_SCO_CBACK* p_sco_cb; /* SCO connection change callback registered by AV */ tBTA_SYS_ROLE_SWITCH_CBACK* Loading Loading
system/bta/dm/bta_dm_pm.cc +68 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,8 @@ static void bta_dm_pm_btm_cback(const RawAddress& bd_addr, tHCI_STATUS hci_status); static bool bta_dm_pm_park(const RawAddress& peer_addr); void bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE* p_peer_dev, uint8_t index); static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); static int bta_dm_get_sco_index(); static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer, uint8_t timer_idx); Loading Loading @@ -95,6 +97,7 @@ void bta_dm_init_pm(void) { /* if there are no power manger entries, so not register */ if (p_bta_dm_pm_cfg[0].app_id != 0) { bta_sys_pm_register(bta_dm_pm_cback); bta_sys_sniff_register(bta_dm_sniff_cback); get_btm_client_interface().lifecycle.BTM_PmRegister( (BTM_PM_REG_SET), &bta_dm_cb.pm_id, bta_dm_pm_btm_cback); Loading Loading @@ -334,6 +337,71 @@ static void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER* p_timer, alarm_cancel(p_timer->timer[timer_idx]); } /******************************************************************************* * * Function bta_dm_sniff_cback * * Description Restart sniff timer for a peer * * * Returns void * ******************************************************************************/ static void bta_dm_sniff_cback(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { int i = 0, j = 0; uint64_t timeout_ms = 0; tBTA_DM_PEER_DEVICE* p_peer_device = bta_dm_find_peer_device(peer_addr); if (p_peer_device == NULL) { LOG_INFO("No peer device found: %s", ADDRESS_TO_LOGGABLE_CSTR(peer_addr)); return; } /* Search for sniff table for timeout value p_bta_dm_pm_cfg[0].app_id is the number of entries */ for (j = 1; j <= p_bta_dm_pm_cfg[0].app_id; j++) { if ((p_bta_dm_pm_cfg[j].id == id) && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID) || (p_bta_dm_pm_cfg[j].app_id == app_id))) break; } // Handle overflow access if (j > p_bta_dm_pm_cfg[0].app_id) { LOG_INFO("No configuration found for %s", ADDRESS_TO_LOGGABLE_CSTR(peer_addr)); return; } const tBTA_DM_PM_CFG* p_pm_cfg = &p_bta_dm_pm_cfg[j]; const tBTA_DM_PM_SPEC* p_pm_spec = &get_bta_dm_pm_spec()[p_pm_cfg->spec_idx]; const tBTA_DM_PM_ACTN* p_act0 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][0]; const tBTA_DM_PM_ACTN* p_act1 = &p_pm_spec->actn_tbl[BTA_SYS_CONN_IDLE][1]; tBTA_DM_PM_ACTION failed_pm = p_peer_device->pm_mode_failed; /* first check if the first preference is ok */ if (!(failed_pm & p_act0->power_mode)) { timeout_ms = p_act0->timeout; } /* if first preference has already failed, try second preference */ else if (!(failed_pm & p_act1->power_mode)) { timeout_ms = p_act1->timeout; } /* Refresh the sniff timer */ for (i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { if (bta_dm_cb.pm_timer[i].in_use && bta_dm_cb.pm_timer[i].peer_bdaddr == peer_addr) { int timer_idx = bta_pm_action_to_timer_idx(BTA_DM_PM_SNIFF); if (timer_idx != BTA_DM_PM_MODE_TIMER_MAX) { /* Cancel and restart the timer */ bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], timer_idx); bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[i], timer_idx, timeout_ms, id, BTA_DM_PM_SNIFF); } } } } /******************************************************************************* * * Function bta_dm_pm_cback Loading
system/bta/jv/bta_jv_act.cc +21 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ static void bta_jv_pm_conn_busy(tBTA_JV_PM_CB* p_cb); static void bta_jv_pm_conn_idle(tBTA_JV_PM_CB* p_cb); static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb, const tBTA_JV_CONN_STATE state); static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb); #ifndef BTA_JV_SDP_DB_SIZE #define BTA_JV_SDP_DB_SIZE 4500 Loading Loading @@ -1258,10 +1259,10 @@ static int bta_jv_port_data_co_cback(uint16_t port_handle, uint8_t* buf, if (p_pcb != NULL) { switch (type) { case DATA_CO_CALLBACK_TYPE_INCOMING: // Exit sniff mode when receiving data by sysproxy // Reset sniff timer when receiving data by sysproxy if (osi_property_get_bool("bluetooth.rfcomm.sysproxy.rx.exit_sniff", false)) { bta_jv_pm_conn_busy(p_pcb->p_pm_cb); bta_jv_reset_sniff_timer(p_pcb->p_pm_cb); } return bta_co_rfc_data_incoming(p_pcb->rfcomm_slot_id, (BT_HDR*)buf); case DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE: Loading Loading @@ -1900,4 +1901,22 @@ static void bta_jv_pm_state_change(tBTA_JV_PM_CB* p_cb, break; } } /******************************************************************************* * * Function bta_jv_reset_sniff_timer * * Description reset pm sniff timer state (input param safe) * * Params p_cb: pm control block of jv connection * * Returns void * ******************************************************************************/ static void bta_jv_reset_sniff_timer(tBTA_JV_PM_CB* p_cb) { if (NULL != p_cb) { p_cb->state = BTA_JV_PM_IDLE_ST; bta_sys_reset_sniff(BTA_ID_JV, p_cb->app_id, p_cb->peer_bd_addr); } } /******************************************************************************/
system/bta/sys/bta_sys.h +6 −2 Original line number Diff line number Diff line Loading @@ -200,6 +200,9 @@ typedef void(tBTA_SYS_ROLE_SWITCH_CBACK)(tBTA_SYS_CONN_STATUS status, typedef void(tBTA_SYS_SSR_CFG_CBACK)(uint8_t id, uint8_t app_id, uint16_t latency, uint16_t tout); typedef void(tBTA_SYS_SNIFF_CBACK)(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); typedef struct { bluetooth::Uuid custom_uuid; uint32_t handle; Loading Loading @@ -241,7 +244,7 @@ void bta_sys_disable(); void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback); void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback); void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback); void bta_sys_sco_register(tBTA_SYS_CONN_SCO_CBACK* p_cback); void bta_sys_conn_open(tBTA_SYS_ID id, uint8_t app_id, Loading @@ -262,7 +265,8 @@ void bta_sys_sco_unuse(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_idle(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_busy(tBTA_SYS_ID id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_reset_sniff(uint8_t id, uint8_t app_id, const RawAddress& peer_addr); void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback); void bta_sys_chg_ssr_config(tBTA_SYS_ID id, uint8_t app_id, uint16_t max_latency, uint16_t min_tout); Loading
system/bta/sys/bta_sys_conn.cc +31 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,37 @@ void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.ppm_cb = p_cback; } /******************************************************************************* * * Function bta_sys_sniff_register * * Description Called by BTA DM to register sniff callbacks * * * Returns void * ******************************************************************************/ void bta_sys_sniff_register(tBTA_SYS_SNIFF_CBACK* p_cback) { bta_sys_cb.sniff_cb = p_cback; } /******************************************************************************* * * Function bta_sys_reset_sniff * * Description Called by BTA subsystems to reset sniff timer * * * Returns void * ******************************************************************************/ void bta_sys_reset_sniff(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.sniff_cb) { bta_sys_cb.sniff_cb(id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_conn_open Loading
system/bta/sys/bta_sys_int.h +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ typedef struct { tBTA_SYS_CONN_CBACK* prm_cb; /* role management callback registered by DM */ tBTA_SYS_CONN_CBACK* ppm_cb; /* low power management callback registered by DM */ tBTA_SYS_SNIFF_CBACK* sniff_cb; /* low power management sniff callback registered by DM */ tBTA_SYS_CONN_SCO_CBACK* p_sco_cb; /* SCO connection change callback registered by AV */ tBTA_SYS_ROLE_SWITCH_CBACK* Loading