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