1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-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 * This is the implementation file for the HeaLth device profile (HL) 22 * subsystem call-out functions. 23 * 24 ******************************************************************************/ 25 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <errno.h> 29 #include <string.h> 30 #include <sys/types.h> 31 #include <sys/socket.h> 32 #include <sys/un.h> 33 #include <time.h> 34 #include <fcntl.h> 35 #include <ctype.h> 36 #include <cutils/sockets.h> 37 #include <cutils/log.h> 38 #include "bta_api.h" 39 #include "btm_api.h" 40 #include "bta_sys.h" 41 #include "bta_hl_api.h" 42 #include "bta_hl_co.h" 43 #include "bta_hl_ci.h" 44 #include "btif_hl.h" 45 46 47 48 /***************************************************************************** 49 ** Constants and Data Types 50 *****************************************************************************/ 51 /************************** 52 ** Common Definitions 53 ***************************/ 54 55 56 57 58 /******************************************************************************* 59 ** 60 ** Function bta_hl_co_get_num_of_mdep 61 ** 62 ** Description This function is called to get the number of MDEPs for this 63 ** application ID 64 ** 65 ** Parameters app_id - application ID 66 ** p_num_of_mdep (output) - number of MDEP configurations supported 67 ** by the application 68 ** 69 ** Returns Bloolean - TRUE success 70 ** 71 *******************************************************************************/ 72 BOOLEAN bta_hl_co_get_num_of_mdep(UINT8 app_id, UINT8 *p_num_of_mdep) 73 { 74 UINT8 app_idx; 75 BOOLEAN success = FALSE; 76 77 if (btif_hl_find_app_idx(app_id, &app_idx)) 78 { 79 *p_num_of_mdep = p_btif_hl_cb->acb[app_idx].sup_feature.num_of_mdeps; 80 success = TRUE; 81 } 82 83 84 BTIF_TRACE_DEBUG3("%s success=%d num_mdeps=%d", 85 __FUNCTION__, success, *p_num_of_mdep ); 86 return success; 87 } 88 89 /******************************************************************************* 90 ** 91 ** Function bta_hl_co_advrtise_source_sdp 92 ** 93 ** Description This function is called to find out whether the SOURCE MDEP 94 ** configuration information should be advertize in the SDP or nopt 95 ** 96 ** Parameters app_id - application ID 97 ** 98 ** Returns Bloolean - TRUE advertise the SOURCE MDEP configuration 99 ** information 100 ** 101 *******************************************************************************/ 102 BOOLEAN bta_hl_co_advrtise_source_sdp(UINT8 app_id) 103 { 104 BOOLEAN advertize_source_sdp=FALSE; 105 UINT8 app_idx; 106 107 if (btif_hl_find_app_idx(app_id, &app_idx)) 108 { 109 advertize_source_sdp = p_btif_hl_cb->acb[app_idx].sup_feature.advertize_source_sdp; 110 } 111 112 113 BTIF_TRACE_DEBUG2("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp ); 114 115 return advertize_source_sdp; 116 } 117 /******************************************************************************* 118 ** 119 ** Function bta_hl_co_get_mdep_config 120 ** 121 ** Description This function is called to get the supported feature 122 ** configuration for the specified mdep index and it also assigns 123 ** the MDEP ID for the specified mdep index 124 ** 125 ** Parameters app_id - HDP application ID 126 ** mdep_idx - the mdep index 127 ** mdep_counter - number of mdeps 128 ** mdep_id - the assigned MDEP ID for the specified medp_idx 129 ** p_mdl_cfg (output) - pointer to the MDEP configuration 130 ** 131 ** 132 ** Returns Bloolean - TRUE success 133 *******************************************************************************/ 134 BOOLEAN bta_hl_co_get_mdep_config(UINT8 app_id, 135 UINT8 mdep_idx, 136 UINT8 mdep_counter, 137 tBTA_HL_MDEP_ID mdep_id, 138 tBTA_HL_MDEP_CFG *p_mdep_cfg) 139 { 140 UINT8 idx ; 141 UINT8 app_idx; 142 BOOLEAN success = FALSE; 143 144 BTIF_TRACE_DEBUG5("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d", 145 __FUNCTION__, app_id,mdep_idx,mdep_id,mdep_counter); 146 147 if (btif_hl_find_app_idx(app_id, &app_idx)) 148 { 149 idx = mdep_idx -mdep_counter-1; 150 p_btif_hl_cb->acb[app_idx].sup_feature.mdep[idx].mdep_id = mdep_id; 151 memcpy(p_mdep_cfg, 152 &p_btif_hl_cb->acb[app_idx].sup_feature.mdep[idx].mdep_cfg, 153 sizeof(tBTA_HL_MDEP_CFG)); 154 155 success = TRUE; 156 } 157 158 BTIF_TRACE_DEBUG4("%s success=%d mdep_idx=%d mdep_id=%d", 159 __FUNCTION__, success, mdep_idx, mdep_id ); 160 161 return success; 162 } 163 164 165 /******************************************************************************* 166 ** 167 ** Function bta_hl_co_get_echo_config 168 ** 169 ** Description This function is called to get the echo test 170 ** maximum APDU size configurations 171 ** 172 ** Parameters app_id - HDP application ID 173 ** p_echo_cfg (output) - pointer to the Echo test maximum APDU size 174 ** configuration 175 ** 176 ** Returns Bloolean - TRUE success 177 *******************************************************************************/ 178 BOOLEAN bta_hl_co_get_echo_config(UINT8 app_id, 179 tBTA_HL_ECHO_CFG *p_echo_cfg) 180 { 181 UINT8 app_idx; 182 BOOLEAN success = FALSE; 183 btif_hl_app_cb_t *p_acb; 184 tBTA_HL_SUP_FEATURE *p_sup; 185 186 BTIF_TRACE_DEBUG2("%s app_id=%d",__FUNCTION__, app_id ); 187 188 if (btif_hl_find_app_idx(app_id, &app_idx)) 189 { 190 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx); 191 p_sup = &p_acb->sup_feature; 192 p_echo_cfg->max_rx_apdu_size = p_sup->echo_cfg.max_rx_apdu_size; 193 p_echo_cfg->max_tx_apdu_size = p_sup->echo_cfg.max_tx_apdu_size; 194 success = TRUE; 195 } 196 197 BTIF_TRACE_DEBUG4("%s success=%d max tx_size=%d rx_size=%d", 198 __FUNCTION__, success, p_echo_cfg->max_tx_apdu_size, 199 p_echo_cfg->max_rx_apdu_size ); 200 201 return success; 202 } 203 204 205 /******************************************************************************* 206 ** 207 ** Function bta_hl_co_save_mdl 208 ** 209 ** Description This function is called to save a MDL configuration item in persistent 210 ** storage 211 ** 212 ** Parameters app_id - HDP application ID 213 ** item_idx - the MDL configuration storage index 214 ** p_mdl_cfg - pointer to the MDL configuration data 215 ** 216 ** Returns void 217 ** 218 *******************************************************************************/ 219 void bta_hl_co_save_mdl(UINT8 mdep_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg ) 220 { 221 222 BTIF_TRACE_DEBUG6("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d", 223 __FUNCTION__, mdep_id, item_idx, 224 p_mdl_cfg->active, 225 p_mdl_cfg->mdl_id, 226 p_mdl_cfg->time); 227 228 btif_hl_save_mdl_cfg(mdep_id, item_idx, p_mdl_cfg); 229 230 } 231 232 /******************************************************************************* 233 ** 234 ** Function bta_hl_co_delete_mdl 235 ** 236 ** Description This function is called to delete a MDL configuration item in persistent 237 ** storage 238 ** 239 ** Parameters app_id - HDP application ID 240 ** item_idx - the MDL configuration storage index 241 ** 242 ** Returns void 243 ** 244 *******************************************************************************/ 245 void bta_hl_co_delete_mdl(UINT8 mdep_id, UINT8 item_idx) 246 { 247 248 249 BTIF_TRACE_DEBUG3("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx); 250 251 btif_hl_delete_mdl_cfg(mdep_id, item_idx); 252 253 254 } 255 256 /******************************************************************************* 257 ** 258 ** Function bta_hl_co_get_mdl_config 259 ** 260 ** Description This function is called to get the MDL configuration 261 ** from the persistent memory. This function shall only be called 262 *8 once after the device is powered up 263 ** 264 ** Parameters app_id - HDP application ID 265 ** buffer_size - the unit of the buffer size is sizeof(tBTA_HL_MDL_CFG) 266 ** p_mdl_buf - Point to the starting location of the buffer 267 ** 268 ** Returns BOOLEAN 269 ** 270 ** 271 *******************************************************************************/ 272 BOOLEAN bta_hl_co_load_mdl_config (UINT8 app_id, UINT8 buffer_size, 273 tBTA_HL_MDL_CFG *p_mdl_buf ) 274 { 275 BOOLEAN result = TRUE; 276 UINT8 i; 277 tBTA_HL_MDL_CFG *p; 278 279 BTIF_TRACE_DEBUG3("%s app_id=%d, num_items=%d", 280 __FUNCTION__, app_id, buffer_size); 281 282 if (buffer_size > BTA_HL_NUM_MDL_CFGS) 283 { 284 result = FALSE; 285 return result; 286 } 287 result = btif_hl_load_mdl_config(app_id, buffer_size, p_mdl_buf); 288 289 if (result) 290 { 291 for (i=0, p=p_mdl_buf; i<buffer_size; i++, p++ ) 292 { 293 if (p->active) 294 { 295 BTIF_TRACE_DEBUG6("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d", 296 i, p->mdl_id, p->dch_mode, p->local_mdep_role, p->local_mdep_role, p->mtu); 297 } 298 } 299 } 300 301 BTIF_TRACE_DEBUG3("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size); 302 303 return result; 304 } 305 306 /******************************************************************************* 307 ** 308 ** Function bta_hl_co_get_tx_data 309 ** 310 ** Description Get the data to be sent 311 ** 312 ** Parameters app_id - HDP application ID 313 ** mdl_handle - MDL handle 314 ** buf_size - the size of the buffer 315 ** p_buf - the buffer pointer 316 ** evt - the evt to be passed back to the HL in the 317 ** bta_hl_ci_get_tx_data call-in function 318 ** 319 ** Returns Void 320 ** 321 *******************************************************************************/ 322 void bta_hl_co_get_tx_data (UINT8 app_id, tBTA_HL_MDL_HANDLE mdl_handle, 323 UINT16 buf_size, UINT8 *p_buf, UINT16 evt) 324 { 325 UINT8 app_idx, mcl_idx, mdl_idx; 326 btif_hl_mdl_cb_t *p_dcb; 327 tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL; 328 329 BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x buf_size=%d", 330 __FUNCTION__, app_id, mdl_handle, buf_size); 331 332 if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx)) 333 { 334 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx); 335 336 if (p_dcb->tx_size <= buf_size ) 337 { 338 memcpy(p_buf, p_dcb->p_tx_pkt, p_dcb->tx_size); 339 btif_hl_free_buf((void **) &p_dcb->p_tx_pkt); 340 p_dcb->tx_size = 0; 341 status = BTA_HL_STATUS_OK; 342 } 343 } 344 345 346 bta_hl_ci_get_tx_data(mdl_handle, status, evt); 347 348 } 349 350 351 /******************************************************************************* 352 ** 353 ** Function bta_hl_co_put_rx_data 354 ** 355 ** Description Put the received data 356 ** 357 ** Parameters app_id - HDP application ID 358 ** mdl_handle - MDL handle 359 ** data_size - the size of the data 360 ** p_data - the data pointer 361 ** evt - the evt to be passed back to the HL in the 362 ** bta_hl_ci_put_rx_data call-in function 363 ** 364 ** Returns Void 365 ** 366 *******************************************************************************/ 367 void bta_hl_co_put_rx_data (UINT8 app_id, tBTA_HL_MDL_HANDLE mdl_handle, 368 UINT16 data_size, UINT8 *p_data, UINT16 evt) 369 { 370 UINT8 app_idx, mcl_idx, mdl_idx; 371 btif_hl_mdl_cb_t *p_dcb; 372 tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL; 373 int r; 374 BTIF_TRACE_DEBUG4("%s app_id=%d mdl_handle=0x%x data_size=%d", 375 __FUNCTION__,app_id, mdl_handle, data_size); 376 377 if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx)) 378 { 379 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx); 380 381 if ((p_dcb->p_rx_pkt = (UINT8 *)btif_hl_get_buf(data_size)) != NULL) 382 { 383 memcpy(p_dcb->p_rx_pkt, p_data, data_size); 384 if (p_dcb->p_scb) 385 { 386 BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d", 387 app_idx, mcl_idx, mdl_idx, data_size); 388 r = send(p_dcb->p_scb->socket_id[1], p_dcb->p_rx_pkt, data_size, 0); 389 390 if (r == data_size) 391 { 392 BTIF_TRACE_DEBUG1("socket send success data_size=%d", data_size); 393 status = BTA_HL_STATUS_OK; 394 } 395 else 396 { 397 BTIF_TRACE_ERROR2("socket send failed r=%d data_size=%d",r, data_size); 398 } 399 400 401 } 402 btif_hl_free_buf((void **) &p_dcb->p_rx_pkt); 403 } 404 } 405 406 bta_hl_ci_put_rx_data(mdl_handle, status, evt); 407 } 408 409 410 /******************************************************************************* 411 ** 412 ** Function bta_hl_co_get_tx_data 413 ** 414 ** Description Get the Echo data to be sent 415 ** 416 ** Parameters app_id - HDP application ID 417 ** mcl_handle - MCL handle 418 ** buf_size - the size of the buffer 419 ** p_buf - the buffer pointer 420 ** evt - the evt to be passed back to the HL in the 421 ** bta_hl_ci_get_tx_data call-in function 422 ** 423 ** Returns Void 424 ** 425 *******************************************************************************/ 426 void bta_hl_co_get_echo_data (UINT8 app_id, tBTA_HL_MCL_HANDLE mcl_handle, 427 UINT16 buf_size, UINT8 *p_buf, UINT16 evt) 428 { 429 tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL; 430 431 BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__); 432 bta_hl_ci_get_echo_data(mcl_handle, status, evt); 433 } 434 435 436 /******************************************************************************* 437 ** 438 ** Function bta_hl_co_put_echo_data 439 ** 440 ** Description Put the received loopback echo data 441 ** 442 ** Parameters app_id - HDP application ID 443 ** mcl_handle - MCL handle 444 ** data_size - the size of the data 445 ** p_data - the data pointer 446 ** evt - the evt to be passed back to the HL in the 447 ** bta_hl_ci_put_echo_data call-in function 448 ** 449 ** Returns Void 450 ** 451 *******************************************************************************/ 452 void bta_hl_co_put_echo_data (UINT8 app_id, tBTA_HL_MCL_HANDLE mcl_handle, 453 UINT16 data_size, UINT8 *p_data, UINT16 evt) 454 { 455 tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL; 456 457 BTIF_TRACE_ERROR1("%s not supported",__FUNCTION__); 458 bta_hl_ci_put_echo_data(mcl_handle, status, evt); 459 } 460 461