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 *******************************************************************************/ 42 void 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 *******************************************************************************/ 58 void 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 *******************************************************************************/ 73 void 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) 88 void 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 *******************************************************************************/ 103 void 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 *******************************************************************************/ 121 void 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 *******************************************************************************/ 147 void 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 *******************************************************************************/ 171 void 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 *******************************************************************************/ 186 void 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 *******************************************************************************/ 202 void 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 *******************************************************************************/ 232 void 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 *******************************************************************************/ 261 void 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 *******************************************************************************/ 281 void 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 *******************************************************************************/ 300 void 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 *******************************************************************************/ 325 void 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 *******************************************************************************/ 351 void 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 *******************************************************************************/ 373 void 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) 395 void 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 *******************************************************************************/ 413 void 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 *******************************************************************************/ 431 void 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 *******************************************************************************/ 449 void 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 *******************************************************************************/ 467 void 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 *******************************************************************************/ 485 void 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 *******************************************************************************/ 512 void 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 *******************************************************************************/ 540 void 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 *******************************************************************************/ 555 void 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 *******************************************************************************/ 573 void 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