503 lines
16 KiB
C
503 lines
16 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2009-2012 Broadcom Corporation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* This is the implementation of the API for the HeaLth device profile (HL)
|
|
* subsystem of BTA, Broadcom Corp's Bluetooth application layer for mobile
|
|
* phones.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#include <string.h>
|
|
|
|
#include "bt_target.h"
|
|
#if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
|
|
|
|
#include "bt_common.h"
|
|
#include "bta_hl_api.h"
|
|
#include "bta_hl_int.h"
|
|
|
|
/*****************************************************************************
|
|
** Constants
|
|
*****************************************************************************/
|
|
|
|
static const tBTA_SYS_REG bta_hl_reg =
|
|
{
|
|
bta_hl_hdl_event,
|
|
BTA_HlDisable
|
|
};
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlEnable
|
|
**
|
|
** Description Enable the HL subsystems. This function must be
|
|
** called before any other functions in the HL API are called.
|
|
** When the enable operation is completed the callback function
|
|
** will be called with an BTA_HL_CTRL_ENABLE_CFM_EVT event.
|
|
**
|
|
** Parameters p_cback - HL event call back function
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlEnable(tBTA_HL_CTRL_CBACK *p_ctrl_cback)
|
|
{
|
|
tBTA_HL_API_ENABLE *p_buf =
|
|
(tBTA_HL_API_ENABLE *)osi_malloc(sizeof(tBTA_HL_API_ENABLE));
|
|
|
|
/* register with BTA system manager */
|
|
bta_sys_register(BTA_ID_HL, &bta_hl_reg);
|
|
|
|
p_buf->hdr.event = BTA_HL_API_ENABLE_EVT;
|
|
p_buf->p_cback = p_ctrl_cback;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDisable
|
|
**
|
|
** Description Disable the HL subsystem.
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDisable(void)
|
|
{
|
|
BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
|
|
|
|
bta_sys_deregister(BTA_ID_HL);
|
|
p_buf->event = BTA_HL_API_DISABLE_EVT;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlUpdate
|
|
**
|
|
** Description Register an HDP application
|
|
**
|
|
** Parameters app_id - Application ID
|
|
** p_reg_param - non-platform related parameters for the
|
|
** HDP application
|
|
** p_cback - HL event callback fucntion
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlUpdate(UINT8 app_id, tBTA_HL_REG_PARAM *p_reg_param,
|
|
BOOLEAN is_register, tBTA_HL_CBACK *p_cback)
|
|
{
|
|
tBTA_HL_API_UPDATE *p_buf =
|
|
(tBTA_HL_API_UPDATE *)osi_malloc(sizeof(tBTA_HL_API_UPDATE));
|
|
|
|
APPL_TRACE_DEBUG("%s", __func__);
|
|
|
|
p_buf->hdr.event = BTA_HL_API_UPDATE_EVT;
|
|
p_buf->app_id = app_id;
|
|
p_buf->is_register = is_register;
|
|
|
|
if (is_register) {
|
|
p_buf->sec_mask = (p_reg_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
|
|
p_buf->p_cback = p_cback;
|
|
if (p_reg_param->p_srv_name)
|
|
strlcpy(p_buf->srv_name, p_reg_param->p_srv_name, BTA_SERVICE_NAME_LEN);
|
|
else
|
|
p_buf->srv_name[0] = 0;
|
|
|
|
if (p_reg_param->p_srv_desp)
|
|
strlcpy(p_buf->srv_desp, p_reg_param->p_srv_desp, BTA_SERVICE_DESP_LEN);
|
|
else
|
|
p_buf->srv_desp[0] = 0;
|
|
|
|
if (p_reg_param->p_provider_name)
|
|
strlcpy(p_buf->provider_name, p_reg_param->p_provider_name, BTA_PROVIDER_NAME_LEN);
|
|
else
|
|
p_buf->provider_name[0] = 0;
|
|
}
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlRegister
|
|
**
|
|
** Description Register an HDP application
|
|
**
|
|
** Parameters app_id - Application ID
|
|
** p_reg_param - non-platform related parameters for the
|
|
** HDP application
|
|
** p_cback - HL event callback fucntion
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlRegister(UINT8 app_id,
|
|
tBTA_HL_REG_PARAM *p_reg_param,
|
|
tBTA_HL_CBACK *p_cback)
|
|
{
|
|
tBTA_HL_API_REGISTER *p_buf =
|
|
(tBTA_HL_API_REGISTER *)osi_malloc(sizeof(tBTA_HL_API_REGISTER));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_REGISTER_EVT;
|
|
p_buf->app_id = app_id;
|
|
p_buf->sec_mask = (p_reg_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
|
|
p_buf->p_cback = p_cback;
|
|
|
|
if (p_reg_param->p_srv_name)
|
|
strlcpy(p_buf->srv_name, p_reg_param->p_srv_name, BTA_SERVICE_NAME_LEN);
|
|
else
|
|
p_buf->srv_name[0] = 0;
|
|
|
|
if (p_reg_param->p_srv_desp)
|
|
strlcpy(p_buf->srv_desp, p_reg_param->p_srv_desp, BTA_SERVICE_DESP_LEN);
|
|
else
|
|
p_buf->srv_desp[0] = 0;
|
|
|
|
if (p_reg_param->p_provider_name)
|
|
strlcpy(p_buf->provider_name, p_reg_param->p_provider_name, BTA_PROVIDER_NAME_LEN);
|
|
else
|
|
p_buf->provider_name[0] = 0;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDeregister
|
|
**
|
|
** Description Deregister an HDP application
|
|
**
|
|
** Parameters app_handle - Application handle
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDeregister(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle)
|
|
{
|
|
tBTA_HL_API_DEREGISTER *p_buf =
|
|
(tBTA_HL_API_DEREGISTER *)osi_malloc(sizeof(tBTA_HL_API_DEREGISTER));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DEREGISTER_EVT;
|
|
p_buf->app_id = app_id;
|
|
p_buf->app_handle = app_handle;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlCchOpen
|
|
**
|
|
** Description Open a Control channel connection with the specified BD address
|
|
**
|
|
** Parameters app_handle - Application Handle
|
|
** p_open_param - parameters for opening a control channel
|
|
**
|
|
** Returns void
|
|
**
|
|
** Note: The control PSM value is used to select which
|
|
** HDP insatnce should be used in case the peer device support
|
|
** multiple HDP instances. Also, if the control PSM value is zero
|
|
** then the first HDP instance is used for the control channel setup
|
|
*******************************************************************************/
|
|
void BTA_HlCchOpen(UINT8 app_id, tBTA_HL_APP_HANDLE app_handle,
|
|
tBTA_HL_CCH_OPEN_PARAM *p_open_param)
|
|
{
|
|
tBTA_HL_API_CCH_OPEN *p_buf =
|
|
(tBTA_HL_API_CCH_OPEN *)osi_malloc(sizeof(tBTA_HL_API_CCH_OPEN));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_CCH_OPEN_EVT;
|
|
p_buf->app_id = app_id;
|
|
p_buf->app_handle = app_handle;
|
|
p_buf->sec_mask = (p_open_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
|
|
bdcpy(p_buf->bd_addr, p_open_param->bd_addr);
|
|
p_buf->ctrl_psm = p_open_param->ctrl_psm;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlCchClose
|
|
**
|
|
** Description Close a Control channel connection with the specified MCL
|
|
** handle
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlCchClose(tBTA_HL_MCL_HANDLE mcl_handle)
|
|
{
|
|
tBTA_HL_API_CCH_CLOSE *p_buf =
|
|
(tBTA_HL_API_CCH_CLOSE *)osi_malloc(sizeof(tBTA_HL_API_CCH_CLOSE));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_CCH_CLOSE_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchOpen
|
|
**
|
|
** Description Open a data channel connection with the specified DCH parameters
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
** p_open_param - parameters for opening a data channel
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchOpen(tBTA_HL_MCL_HANDLE mcl_handle,
|
|
tBTA_HL_DCH_OPEN_PARAM *p_open_param)
|
|
{
|
|
tBTA_HL_API_DCH_OPEN *p_buf =
|
|
(tBTA_HL_API_DCH_OPEN *)osi_malloc(sizeof(tBTA_HL_API_DCH_OPEN));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_OPEN_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
p_buf->ctrl_psm = p_open_param->ctrl_psm;
|
|
p_buf->local_mdep_id = p_open_param->local_mdep_id;
|
|
p_buf->peer_mdep_id = p_open_param->peer_mdep_id;
|
|
p_buf->local_cfg = p_open_param->local_cfg;
|
|
p_buf->sec_mask = (p_open_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchReconnect
|
|
**
|
|
** Description Reconnect a data channel with the specified MDL_ID
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
*8 p_recon_param - parameters for reconnecting a data channel
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchReconnect(tBTA_HL_MCL_HANDLE mcl_handle,
|
|
tBTA_HL_DCH_RECONNECT_PARAM *p_recon_param)
|
|
{
|
|
tBTA_HL_API_DCH_RECONNECT *p_buf =
|
|
(tBTA_HL_API_DCH_RECONNECT *)osi_malloc(sizeof(tBTA_HL_API_DCH_RECONNECT));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_RECONNECT_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
p_buf->ctrl_psm = p_recon_param->ctrl_psm;
|
|
p_buf->mdl_id = p_recon_param->mdl_id;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchClose
|
|
**
|
|
** Description Close a data channel with the specified MDL handle
|
|
**
|
|
** Parameters mdl_handle - MDL handle
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchClose(tBTA_HL_MDL_HANDLE mdl_handle)
|
|
{
|
|
tBTA_HL_API_DCH_CLOSE *p_buf =
|
|
(tBTA_HL_API_DCH_CLOSE *)osi_malloc(sizeof(tBTA_HL_API_DCH_CLOSE));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_CLOSE_EVT;
|
|
p_buf->mdl_handle = mdl_handle;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchAbort
|
|
**
|
|
** Description Abort the current data channel setup with the specified MCL
|
|
** handle
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
**
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchAbort(tBTA_HL_MCL_HANDLE mcl_handle)
|
|
{
|
|
tBTA_HL_API_DCH_ABORT *p_buf =
|
|
(tBTA_HL_API_DCH_ABORT *)osi_malloc(sizeof(tBTA_HL_API_DCH_ABORT));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_ABORT_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlSendData
|
|
**
|
|
** Description Send an APDU to the peer device
|
|
**
|
|
** Parameters mdl_handle - MDL handle
|
|
** pkt_size - size of the data packet to be sent
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlSendData(tBTA_HL_MDL_HANDLE mdl_handle,
|
|
UINT16 pkt_size)
|
|
{
|
|
tBTA_HL_API_SEND_DATA *p_buf =
|
|
(tBTA_HL_API_SEND_DATA *)osi_malloc(sizeof(tBTA_HL_API_SEND_DATA));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_SEND_DATA_EVT;
|
|
p_buf->mdl_handle = mdl_handle;
|
|
p_buf->pkt_size = pkt_size;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDeleteMdl
|
|
**
|
|
** Description Delete the specified MDL_ID within the specified MCL handle
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
** mdl_id - MDL ID
|
|
**
|
|
** Returns void
|
|
**
|
|
** note: If mdl_id = 0xFFFF then this means to delete all MDLs
|
|
** and this value can only be used with DeleteMdl request only
|
|
** not other requests
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDeleteMdl(tBTA_HL_MCL_HANDLE mcl_handle,
|
|
tBTA_HL_MDL_ID mdl_id )
|
|
{
|
|
tBTA_HL_API_DELETE_MDL *p_buf =
|
|
(tBTA_HL_API_DELETE_MDL *)osi_malloc(sizeof(tBTA_HL_API_DELETE_MDL));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DELETE_MDL_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
p_buf->mdl_id = mdl_id;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchEchoTest
|
|
**
|
|
** Description Initiate an echo test with the specified MCL handle
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
*8 p_echo_test_param - parameters for echo testing
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchEchoTest( tBTA_HL_MCL_HANDLE mcl_handle,
|
|
tBTA_HL_DCH_ECHO_TEST_PARAM *p_echo_test_param)
|
|
{
|
|
tBTA_HL_API_DCH_ECHO_TEST *p_buf =
|
|
(tBTA_HL_API_DCH_ECHO_TEST *)osi_malloc(sizeof(tBTA_HL_API_DCH_ECHO_TEST));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_ECHO_TEST_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
p_buf->ctrl_psm = p_echo_test_param->ctrl_psm;
|
|
p_buf->local_cfg = p_echo_test_param->local_cfg;
|
|
p_buf->pkt_size = p_echo_test_param->pkt_size;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlSdpQuery
|
|
**
|
|
** Description SDP query request for the specified BD address
|
|
**
|
|
** Parameters app_handle - application handle
|
|
** bd_addr - BD address
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlSdpQuery(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle,
|
|
BD_ADDR bd_addr)
|
|
{
|
|
tBTA_HL_API_SDP_QUERY *p_buf =
|
|
(tBTA_HL_API_SDP_QUERY *)osi_malloc(sizeof(tBTA_HL_API_SDP_QUERY));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_SDP_QUERY_EVT;
|
|
p_buf->app_id = app_id;
|
|
p_buf->app_handle = app_handle;
|
|
bdcpy(p_buf->bd_addr, bd_addr);
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
**
|
|
** Function BTA_HlDchCreateMdlRsp
|
|
**
|
|
** Description Set the Response and configuration values for the Create MDL
|
|
** request
|
|
**
|
|
** Parameters mcl_handle - MCL handle
|
|
** p_rsp_param - parameters specified whether the request should
|
|
** be accepted or not and if it should be accepted
|
|
** then it also specified the configuration response
|
|
** value
|
|
**
|
|
** Returns void
|
|
**
|
|
*******************************************************************************/
|
|
void BTA_HlDchCreateRsp(tBTA_HL_MCL_HANDLE mcl_handle,
|
|
tBTA_HL_DCH_CREATE_RSP_PARAM *p_rsp_param)
|
|
{
|
|
tBTA_HL_API_DCH_CREATE_RSP *p_buf =
|
|
(tBTA_HL_API_DCH_CREATE_RSP *)osi_malloc(sizeof(tBTA_HL_API_DCH_CREATE_RSP));
|
|
|
|
p_buf->hdr.event = BTA_HL_API_DCH_CREATE_RSP_EVT;
|
|
p_buf->mcl_handle = mcl_handle;
|
|
p_buf->mdl_id = p_rsp_param->mdl_id;
|
|
p_buf->local_mdep_id = p_rsp_param->local_mdep_id;
|
|
p_buf->rsp_code = p_rsp_param->rsp_code;
|
|
p_buf->cfg_rsp = p_rsp_param->cfg_rsp;
|
|
|
|
bta_sys_sendmsg(p_buf);
|
|
}
|
|
|
|
#endif /* HL_INCLUDED */
|