1/****************************************************************************** 2 * 3 * Copyright (C) 2003-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19/****************************************************************************** 20 * 21 * Routes connection status callbacks from various sub systems to DM 22 * 23 ******************************************************************************/ 24 25#include <stddef.h> 26#include "bta_api.h" 27#include "bta_sys.h" 28#include "bta_sys_int.h" 29#include "bt_common.h" 30#include "utl.h" 31 32/******************************************************************************* 33** 34** Function bta_sys_rm_register 35** 36** Description Called by BTA DM to register role management callbacks 37** 38** 39** Returns void 40** 41*******************************************************************************/ 42void bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback) 43{ 44 bta_sys_cb.prm_cb = p_cback; 45} 46 47 48/******************************************************************************* 49** 50** Function bta_sys_policy_register 51** 52** Description Called by BTA DM to register link policy change callbacks 53** 54** 55** Returns void 56** 57*******************************************************************************/ 58void bta_sys_policy_register(tBTA_SYS_CONN_CBACK * p_cback) 59{ 60 bta_sys_cb.p_policy_cb = p_cback; 61} 62 63/******************************************************************************* 64** 65** Function bta_sys_role_chg_register 66** 67** Description Called by BTA AV to register role change callbacks 68** 69** 70** Returns void 71** 72*******************************************************************************/ 73void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback) 74{ 75 bta_sys_cb.p_role_cb = p_cback; 76} 77/******************************************************************************* 78** 79** Function bta_sys_ssr_cfg_register 80** 81** Description Called by BTA DM to register SSR configuration callback 82** 83** 84** Returns void 85** 86*******************************************************************************/ 87#if (BTM_SSR_INCLUDED == TRUE) 88void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback) 89{ 90 bta_sys_cb.p_ssr_cb = p_cback; 91} 92#endif 93/******************************************************************************* 94** 95** Function bta_sys_role_chg_register 96** 97** Description Called by BTA AV to register role change callbacks 98** 99** 100** Returns void 101** 102*******************************************************************************/ 103void bta_sys_notify_role_chg(BD_ADDR_PTR p_bda, UINT8 new_role, UINT8 hci_status) 104{ 105 if (bta_sys_cb.p_role_cb) 106 { 107 bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda); 108 } 109} 110 111/******************************************************************************* 112** 113** Function bta_sys_collision_register 114** 115** Description Called by any BTA module to register for collision event. 116** 117** 118** Returns void 119** 120*******************************************************************************/ 121void bta_sys_collision_register(UINT8 bta_id, tBTA_SYS_CONN_CBACK *p_cback) 122{ 123 UINT8 index; 124 125 for (index = 0; index < MAX_COLLISION_REG; index++) 126 { 127 if ((bta_sys_cb.colli_reg.id[index] == bta_id) || 128 (bta_sys_cb.colli_reg.id[index] == 0)) 129 { 130 bta_sys_cb.colli_reg.id[index] = bta_id; 131 bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback; 132 return; 133 } 134 } 135} 136 137/******************************************************************************* 138** 139** Function bta_sys_notify_collision 140** 141** Description Called by BTA DM to notify collision event. 142** 143** 144** Returns void 145** 146*******************************************************************************/ 147void bta_sys_notify_collision (BD_ADDR_PTR p_bda) 148{ 149 UINT8 index; 150 151 for (index = 0; index < MAX_COLLISION_REG; index++) 152 { 153 if ((bta_sys_cb.colli_reg.id[index] != 0) && 154 (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) 155 { 156 bta_sys_cb.colli_reg.p_coll_cback[index] (0, BTA_ID_SYS, 0, p_bda); 157 } 158 } 159} 160 161/******************************************************************************* 162** 163** Function bta_sys_sco_register 164** 165** Description Called by BTA AV to register sco connection change callbacks 166** 167** 168** Returns void 169** 170*******************************************************************************/ 171void bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback) 172{ 173 bta_sys_cb.p_sco_cb = p_cback; 174} 175 176/******************************************************************************* 177** 178** Function bta_sys_pm_register 179** 180** Description Called by BTA DM to register power management callbacks 181** 182** 183** Returns void 184** 185*******************************************************************************/ 186void bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback) 187{ 188 bta_sys_cb.ppm_cb = p_cback; 189} 190 191/******************************************************************************* 192** 193** Function bta_sys_conn_open 194** 195** Description Called by BTA subsystems when a connection is made to 196** the service 197** 198** 199** Returns void 200** 201*******************************************************************************/ 202void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 203{ 204 if(bta_sys_cb.prm_cb) 205 { 206 207 bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); 208 209 } 210 211 if(bta_sys_cb.ppm_cb) 212 { 213 214 bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); 215 216 } 217} 218 219 220 221/******************************************************************************* 222** 223** Function bta_sys_conn_close 224** 225** Description Called by BTA subsystems when a connection to the service 226** is closed 227** 228** 229** Returns void 230** 231*******************************************************************************/ 232void bta_sys_conn_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 233{ 234 if(bta_sys_cb.prm_cb) 235 { 236 237 bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); 238 239 } 240 241 if(bta_sys_cb.ppm_cb) 242 { 243 244 bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); 245 246 } 247} 248 249 250/******************************************************************************* 251** 252** Function bta_sys_app_open 253** 254** Description Called by BTA subsystems when application initiates connection 255** to a peer device 256** 257** 258** Returns void 259** 260*******************************************************************************/ 261void bta_sys_app_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 262{ 263 if(bta_sys_cb.ppm_cb) 264 { 265 bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr); 266 } 267} 268 269 270 271/******************************************************************************* 272** 273** Function bta_sys_app_close 274** 275** Description Called by BTA subsystems when application initiates close 276** of connection to peer device 277** 278** Returns void 279** 280*******************************************************************************/ 281void bta_sys_app_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 282{ 283 if(bta_sys_cb.ppm_cb) 284 { 285 bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr); 286 } 287} 288 289 290/******************************************************************************* 291** 292** Function bta_sys_sco_open 293** 294** Description Called by BTA subsystems when sco connection for that service 295** is open 296** 297** Returns void 298** 299*******************************************************************************/ 300void bta_sys_sco_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 301{ 302 /* AG triggers p_sco_cb by bta_sys_sco_use. */ 303 if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) 304 { 305 /* without querying BTM_GetNumScoLinks() */ 306 bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); 307 } 308 309 if(bta_sys_cb.ppm_cb) 310 { 311 bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr); 312 } 313} 314 315/******************************************************************************* 316** 317** Function bta_sys_sco_close 318** 319** Description Called by BTA subsystems when sco connection for that service 320** is closed 321** 322** Returns void 323** 324*******************************************************************************/ 325void bta_sys_sco_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 326{ 327 UINT8 num_sco_links; 328 329 if((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) 330 { 331 num_sco_links = BTM_GetNumScoLinks(); 332 bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); 333 } 334 335 if(bta_sys_cb.ppm_cb) 336 { 337 bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr); 338 } 339} 340 341/******************************************************************************* 342** 343** Function bta_sys_sco_use 344** 345** Description Called by BTA subsystems when that service needs to use sco. 346** 347** 348** Returns void 349** 350*******************************************************************************/ 351void bta_sys_sco_use(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 352{ 353 UNUSED(id); 354 355 /* AV streaming need to be suspended before SCO is connected. */ 356 if(bta_sys_cb.p_sco_cb) 357 { 358 /* without querying BTM_GetNumScoLinks() */ 359 bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); 360 } 361} 362 363/******************************************************************************* 364** 365** Function bta_sys_sco_unuse 366** 367** Description Called by BTA subsystems when sco connection for that service 368** is no longer needed. 369** 370** Returns void 371** 372*******************************************************************************/ 373void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 374{ 375 UINT8 num_sco_links; 376 UNUSED(id); 377 378 if((bta_sys_cb.p_sco_cb)) 379 { 380 num_sco_links = BTM_GetNumScoLinks(); 381 bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); 382 } 383} 384/******************************************************************************* 385** 386** Function bta_sys_chg_ssr_config 387** 388** Description Called by BTA subsystems to indicate that the given app SSR setting 389** need to be changed. 390** 391** Returns void 392** 393*******************************************************************************/ 394#if (BTM_SSR_INCLUDED == TRUE) 395void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout) 396{ 397 if(bta_sys_cb.p_ssr_cb) 398 { 399 bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout); 400 } 401} 402#endif 403/******************************************************************************* 404** 405** Function bta_sys_set_policy 406** 407** Description Called by BTA subsystems to indicate that the given link 408** policy to peer device should be set 409** 410** Returns void 411** 412*******************************************************************************/ 413void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) 414{ 415 if(bta_sys_cb.p_policy_cb) 416 { 417 bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr); 418 } 419} 420 421/******************************************************************************* 422** 423** Function bta_sys_clear_policy 424** 425** Description Called by BTA subsystems to indicate that the given link 426** policy to peer device should be clear 427** 428** Returns void 429** 430*******************************************************************************/ 431void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr) 432{ 433 if(bta_sys_cb.p_policy_cb) 434 { 435 bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr); 436 } 437} 438 439/******************************************************************************* 440** 441** Function bta_sys_set_default_policy 442** 443** Description Called by BTA subsystems to indicate that the given default 444** link policy should be set 445** 446** Returns void 447** 448*******************************************************************************/ 449void bta_sys_set_default_policy (UINT8 id, UINT8 policy) 450{ 451 if(bta_sys_cb.p_policy_cb) 452 { 453 bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy, NULL); 454 } 455} 456 457/******************************************************************************* 458** 459** Function bta_sys_clear_default_policy 460** 461** Description Called by BTA subsystems to indicate that the given default 462** link policy should be clear 463** 464** Returns void 465** 466*******************************************************************************/ 467void bta_sys_clear_default_policy (UINT8 id, UINT8 policy) 468{ 469 if(bta_sys_cb.p_policy_cb) 470 { 471 bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy, NULL); 472 } 473} 474 475/******************************************************************************* 476** 477** Function bta_sys_idle 478** 479** Description Called by BTA subsystems to indicate that the connection to 480** peer device is idle 481** 482** Returns void 483** 484*******************************************************************************/ 485void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 486{ 487 488 if(bta_sys_cb.prm_cb) 489 { 490 491 bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); 492 493 } 494 495 if(bta_sys_cb.ppm_cb) 496 { 497 498 bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); 499 } 500} 501 502/******************************************************************************* 503** 504** Function bta_sys_busy 505** 506** Description Called by BTA subsystems to indicate that the connection to 507** peer device is busy 508** 509** Returns void 510** 511*******************************************************************************/ 512void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 513{ 514 if(bta_sys_cb.prm_cb) 515 { 516 517 bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); 518 519 } 520 521 if(bta_sys_cb.ppm_cb) 522 { 523 524 bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); 525 526 } 527} 528 529#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 530/******************************************************************************* 531** 532** Function bta_sys_eir_register 533** 534** Description Called by BTA DM to register EIR utility function that can be 535** used by the other BTA modules to add/remove UUID. 536** 537** Returns void 538** 539*******************************************************************************/ 540void bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback) 541{ 542 bta_sys_cb.eir_cb = p_cback; 543} 544 545/******************************************************************************* 546** 547** Function bta_sys_add_uuid 548** 549** Description Called by BTA subsystems to indicate to DM that new service 550** class UUID is added. 551** 552** Returns void 553** 554*******************************************************************************/ 555void bta_sys_add_uuid(UINT16 uuid16) 556{ 557 if(bta_sys_cb.eir_cb) 558 { 559 bta_sys_cb.eir_cb(uuid16, TRUE ); 560 } 561} 562 563/******************************************************************************* 564** 565** Function bta_sys_remove_uuid 566** 567** Description Called by BTA subsystems to indicate to DM that the service 568** class UUID is removed. 569** 570** Returns void 571** 572*******************************************************************************/ 573void bta_sys_remove_uuid(UINT16 uuid16) 574{ 575 if(bta_sys_cb.eir_cb) 576 { 577 bta_sys_cb.eir_cb(uuid16, FALSE); 578 } 579} 580#endif 581