Fork ESP-IDF's bluetooth component
i want better sbc encoding, and no cla will stop me
This commit is contained in:
@@ -0,0 +1,663 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2003-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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Routes connection status callbacks from various sub systems to DM
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "bta/bta_api.h"
|
||||
#include "bta/bta_sys.h"
|
||||
#include "bta_sys_int.h"
|
||||
#include "bta/utl.h"
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_rm_register
|
||||
**
|
||||
** Description Called by BTA DM to register role management callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_rm_register(tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.prm_cb = p_cback;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_policy_register
|
||||
**
|
||||
** Description Called by BTA DM to register link policy change callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_policy_register(tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.p_policy_cb = p_cback;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_role_chg_register
|
||||
**
|
||||
** Description Called by BTA AV to register role change callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.p_role_cb = p_cback;
|
||||
}
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_ssr_cfg_register
|
||||
**
|
||||
** Description Called by BTA DM to register SSR configuration callback
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
#if (BTM_SSR_INCLUDED == TRUE)
|
||||
void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.p_ssr_cb = p_cback;
|
||||
}
|
||||
#endif
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_role_chg_register
|
||||
**
|
||||
** Description Called by BTA AV to register role change callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_notify_role_chg(BD_ADDR_PTR p_bda, UINT8 new_role, UINT8 hci_status)
|
||||
{
|
||||
if (bta_sys_cb.p_role_cb) {
|
||||
bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, p_bda);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_collision_register
|
||||
**
|
||||
** Description Called by any BTA module to register for collision event.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_collision_register(UINT8 bta_id, tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
UINT8 index;
|
||||
|
||||
for (index = 0; index < MAX_COLLISION_REG; index++) {
|
||||
if ((bta_sys_cb.colli_reg.id[index] == bta_id) ||
|
||||
(bta_sys_cb.colli_reg.id[index] == 0)) {
|
||||
bta_sys_cb.colli_reg.id[index] = bta_id;
|
||||
bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_notify_collision
|
||||
**
|
||||
** Description Called by BTA DM to notify collision event.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_notify_collision (BD_ADDR_PTR p_bda)
|
||||
{
|
||||
UINT8 index;
|
||||
|
||||
for (index = 0; index < MAX_COLLISION_REG; index++) {
|
||||
if ((bta_sys_cb.colli_reg.id[index] != 0) &&
|
||||
(bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) {
|
||||
bta_sys_cb.colli_reg.p_coll_cback[index] (0, BTA_ID_SYS, 0, p_bda);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sco_register
|
||||
**
|
||||
** Description Called by BTA AV to register sco connection change callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sco_register(tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.p_sco_cb = p_cback;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_pm_register
|
||||
**
|
||||
** Description Called by BTA DM to register power management callbacks
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_pm_register(tBTA_SYS_CONN_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.ppm_cb = p_cback;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_conn_open
|
||||
**
|
||||
** Description Called by BTA subsystems when a connection is made to
|
||||
** the service
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_conn_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.prm_cb) {
|
||||
|
||||
bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_conn_close
|
||||
**
|
||||
** Description Called by BTA subsystems when a connection to the service
|
||||
** is closed
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_conn_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.prm_cb) {
|
||||
|
||||
bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_app_open
|
||||
**
|
||||
** Description Called by BTA subsystems when application initiates connection
|
||||
** to a peer device
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_app_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_app_close
|
||||
**
|
||||
** Description Called by BTA subsystems when application initiates close
|
||||
** of connection to peer device
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_app_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sco_open
|
||||
**
|
||||
** Description Called by BTA subsystems when sco connection for that service
|
||||
** is open
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sco_open(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
/* AG triggers p_sco_cb by bta_sys_sco_use. */
|
||||
if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
|
||||
/* without querying BTM_GetNumScoLinks() */
|
||||
bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sco_close
|
||||
**
|
||||
** Description Called by BTA subsystems when sco connection for that service
|
||||
** is closed
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sco_close(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
UINT8 num_sco_links;
|
||||
|
||||
if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
|
||||
num_sco_links = BTM_GetNumScoLinks();
|
||||
bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sco_use
|
||||
**
|
||||
** Description Called by BTA subsystems when that service needs to use sco.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sco_use(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
UNUSED(id);
|
||||
|
||||
/* AV streaming need to be suspended before SCO is connected. */
|
||||
if (bta_sys_cb.p_sco_cb) {
|
||||
/* without querying BTM_GetNumScoLinks() */
|
||||
bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sco_unuse
|
||||
**
|
||||
** Description Called by BTA subsystems when sco connection for that service
|
||||
** is no longer needed.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sco_unuse(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
UINT8 num_sco_links;
|
||||
UNUSED(id);
|
||||
|
||||
if ((bta_sys_cb.p_sco_cb)) {
|
||||
num_sco_links = BTM_GetNumScoLinks();
|
||||
bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_chg_ssr_config
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the given app SSR setting
|
||||
** need to be changed.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
#if (BTM_SSR_INCLUDED == TRUE)
|
||||
void bta_sys_chg_ssr_config (UINT8 id, UINT8 app_id, UINT16 max_latency, UINT16 min_tout)
|
||||
{
|
||||
if (bta_sys_cb.p_ssr_cb) {
|
||||
bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_set_policy
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the given link
|
||||
** policy to peer device should be set
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_set_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.p_policy_cb) {
|
||||
bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_SET, id, policy, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_clear_policy
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the given link
|
||||
** policy to peer device should be clear
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_clear_policy (UINT8 id, UINT8 policy, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.p_policy_cb) {
|
||||
bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_CLR, id, policy, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_set_default_policy
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the given default
|
||||
** link policy should be set
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_set_default_policy (UINT8 id, UINT8 policy)
|
||||
{
|
||||
if (bta_sys_cb.p_policy_cb) {
|
||||
bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_SET, id, policy, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_clear_default_policy
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the given default
|
||||
** link policy should be clear
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_clear_default_policy (UINT8 id, UINT8 policy)
|
||||
{
|
||||
if (bta_sys_cb.p_policy_cb) {
|
||||
bta_sys_cb.p_policy_cb(BTA_SYS_PLCY_DEF_CLR, id, policy, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_idle
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the connection to
|
||||
** peer device is idle
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_idle(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
|
||||
if (bta_sys_cb.prm_cb) {
|
||||
|
||||
bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_busy
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate that the connection to
|
||||
** peer device is busy
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_busy(UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
|
||||
{
|
||||
if (bta_sys_cb.prm_cb) {
|
||||
|
||||
bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
|
||||
if (bta_sys_cb.ppm_cb) {
|
||||
|
||||
bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_eir_register
|
||||
**
|
||||
** Description Called by BTA DM to register EIR utility function that can be
|
||||
** used by the other BTA modules to add/remove UUID.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_eir_register(tBTA_SYS_EIR_CBACK *p_cback)
|
||||
{
|
||||
bta_sys_cb.eir_cb = p_cback;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_add_uuid
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that new service
|
||||
** class UUID is added.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_add_uuid(UINT16 uuid16)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_16;
|
||||
uuid.uu.uuid16 = uuid16;
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_add_uuid_32
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that new service
|
||||
** class UUID is added.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_add_uuid_32(UINT32 uuid32)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_32;
|
||||
uuid.uu.uuid32 = uuid32;
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_add_uuid_128
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that new service
|
||||
** class UUID is added.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_add_uuid_128(UINT8 *uuid128)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_128;
|
||||
memcpy(&uuid.uu.uuid128, uuid128, LEN_UUID_128);
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_remove_uuid
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that the service
|
||||
** class UUID is removed.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_remove_uuid(UINT16 uuid16)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_16;
|
||||
uuid.uu.uuid16 = uuid16;
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_remove_uuid_32
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that the service
|
||||
** class UUID is removed.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_remove_uuid_32(UINT32 uuid32)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_32;
|
||||
uuid.uu.uuid32 = uuid32;
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_remove_uuid_128
|
||||
**
|
||||
** Description Called by BTA subsystems to indicate to DM that the service
|
||||
** class UUID is removed.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_remove_uuid_128(UINT8 *uuid128)
|
||||
{
|
||||
tBT_UUID uuid;
|
||||
uuid.len = LEN_UUID_128;
|
||||
memcpy(&uuid.uu.uuid128, uuid128, LEN_UUID_128);
|
||||
|
||||
if (bta_sys_cb.eir_cb) {
|
||||
bta_sys_cb.eir_cb(uuid, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_vs_hdl
|
||||
**
|
||||
** Description Called by BTA subsystems to execute a VS event handler function
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN bta_sys_vs_hdl(UINT16 evt, void *p)
|
||||
{
|
||||
if (bta_sys_cb.p_vs_evt_hdlr) {
|
||||
return (*bta_sys_cb.p_vs_evt_hdlr)(evt, p);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -0,0 +1,766 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2003-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 main implementation file for the BTA system manager.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define LOG_TAG "bt_bta_sys_main"
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "osi/alarm.h"
|
||||
#include "osi/thread.h"
|
||||
#include "stack/btm_api.h"
|
||||
#include "stack/btu.h"
|
||||
#include "bta/bta_api.h"
|
||||
#include "bta/bta_sys.h"
|
||||
#include "bta_sys_int.h"
|
||||
|
||||
#include "osi/fixed_queue.h"
|
||||
#include "osi/hash_map.h"
|
||||
#include "osi/osi.h"
|
||||
#include "osi/hash_functions.h"
|
||||
#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
|
||||
#include "bta/bta_ar_api.h"
|
||||
#endif
|
||||
#include "bta/utl.h"
|
||||
#include "osi/allocator.h"
|
||||
#include "osi/mutex.h"
|
||||
|
||||
|
||||
/* system manager control block definition */
|
||||
#if BTA_DYNAMIC_MEMORY == FALSE
|
||||
tBTA_SYS_CB bta_sys_cb;
|
||||
#else
|
||||
tBTA_SYS_CB *bta_sys_cb_ptr;
|
||||
#endif
|
||||
|
||||
static hash_map_t *bta_alarm_hash_map;
|
||||
static const size_t BTA_ALARM_HASH_MAP_SIZE = 17;
|
||||
static osi_mutex_t bta_alarm_lock;
|
||||
// extern thread_t *bt_workqueue_thread;
|
||||
|
||||
/* trace level */
|
||||
/* TODO Bluedroid - Hard-coded trace levels - Needs to be configurable */
|
||||
UINT8 appl_trace_level = APPL_INITIAL_TRACE_LEVEL;
|
||||
UINT8 btif_trace_level = BTIF_INITIAL_TRACE_LEVEL;
|
||||
|
||||
void btu_bta_alarm_ready(fixed_queue_t *queue);
|
||||
|
||||
static const tBTA_SYS_REG bta_sys_hw_reg = {
|
||||
bta_sys_sm_execute,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
/* type for action functions */
|
||||
typedef void (*tBTA_SYS_ACTION)(tBTA_SYS_HW_MSG *p_data);
|
||||
|
||||
/* action function list */
|
||||
const tBTA_SYS_ACTION bta_sys_action[] = {
|
||||
/* device manager local device API events - cf bta/bta_sys.h for events */
|
||||
bta_sys_hw_api_enable, /* 0 BTA_SYS_HW_API_ENABLE_EVT */
|
||||
bta_sys_hw_evt_enabled, /* 1 BTA_SYS_HW_EVT_ENABLED_EVT */
|
||||
bta_sys_hw_evt_stack_enabled, /* 2 BTA_SYS_HW_EVT_STACK_ENABLED_EVT */
|
||||
bta_sys_hw_api_disable, /* 3 BTA_SYS_HW_API_DISABLE_EVT */
|
||||
bta_sys_hw_evt_disabled, /* 4 BTA_SYS_HW_EVT_DISABLED_EVT */
|
||||
bta_sys_hw_error /* 5 BTA_SYS_HW_ERROR_EVT */
|
||||
};
|
||||
|
||||
/* state machine action enumeration list */
|
||||
enum {
|
||||
/* device manager local device API events */
|
||||
BTA_SYS_HW_API_ENABLE,
|
||||
BTA_SYS_HW_EVT_ENABLED,
|
||||
BTA_SYS_HW_EVT_STACK_ENABLED,
|
||||
BTA_SYS_HW_API_DISABLE,
|
||||
BTA_SYS_HW_EVT_DISABLED,
|
||||
BTA_SYS_HW_ERROR
|
||||
};
|
||||
|
||||
#define BTA_SYS_NUM_ACTIONS (BTA_SYS_MAX_EVT & 0x00ff)
|
||||
#define BTA_SYS_IGNORE BTA_SYS_NUM_ACTIONS
|
||||
|
||||
/* state table information */
|
||||
#define BTA_SYS_ACTIONS 2 /* number of actions */
|
||||
#define BTA_SYS_NEXT_STATE 2 /* position of next state */
|
||||
#define BTA_SYS_NUM_COLS 3 /* number of columns in state tables */
|
||||
|
||||
|
||||
/* state table for OFF state */
|
||||
const UINT8 bta_sys_hw_off[][BTA_SYS_NUM_COLS] = {
|
||||
/* Event Action 1 Action 2 Next State */
|
||||
/* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING},
|
||||
/* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING},
|
||||
/* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* API_DISABLE */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF},
|
||||
/* EVT_DISABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF},
|
||||
/* EVT_ERROR */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_OFF}
|
||||
};
|
||||
|
||||
const UINT8 bta_sys_hw_starting[][BTA_SYS_NUM_COLS] = {
|
||||
/* Event Action 1 Action 2 Next State */
|
||||
/* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* wait for completion event */
|
||||
/* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING},
|
||||
/* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive disable/enable: change state wait for completion to disable */
|
||||
/* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_HW_API_ENABLE, BTA_SYS_HW_STARTING}, /* successive enable/disable: notify, then restart HW */
|
||||
/* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON}
|
||||
};
|
||||
|
||||
const UINT8 bta_sys_hw_on[][BTA_SYS_NUM_COLS] = {
|
||||
/* Event Action 1 Action 2 Next State */
|
||||
/* API_ENABLE */ {BTA_SYS_HW_API_ENABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* EVT_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* STACK_ENABLED */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* API_DISABLE */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_ON}, /* don't change the state here, as some other modules might be active */
|
||||
/* EVT_DISABLED */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON},
|
||||
/* EVT_ERROR */ {BTA_SYS_HW_ERROR, BTA_SYS_IGNORE, BTA_SYS_HW_ON}
|
||||
};
|
||||
|
||||
const UINT8 bta_sys_hw_stopping[][BTA_SYS_NUM_COLS] = {
|
||||
/* Event Action 1 Action 2 Next State */
|
||||
/* API_ENABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STARTING}, /* change state, and wait for completion event to enable */
|
||||
/* EVT_ENABLED */ {BTA_SYS_HW_EVT_ENABLED, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: finish the enable before disabling */
|
||||
/* STACK_ENABLED */ {BTA_SYS_HW_EVT_STACK_ENABLED, BTA_SYS_HW_API_DISABLE, BTA_SYS_HW_STOPPING}, /* successive enable/disable: notify, then stop */
|
||||
/* API_DISABLE */ {BTA_SYS_IGNORE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}, /* wait for completion event */
|
||||
/* EVT_DISABLED */ {BTA_SYS_HW_EVT_DISABLED, BTA_SYS_IGNORE, BTA_SYS_HW_OFF},
|
||||
/* EVT_ERROR */ {BTA_SYS_HW_API_DISABLE, BTA_SYS_IGNORE, BTA_SYS_HW_STOPPING}
|
||||
};
|
||||
|
||||
typedef const UINT8 (*tBTA_SYS_ST_TBL)[BTA_SYS_NUM_COLS];
|
||||
|
||||
/* state table */
|
||||
const tBTA_SYS_ST_TBL bta_sys_st_tbl[] = {
|
||||
bta_sys_hw_off,
|
||||
bta_sys_hw_starting,
|
||||
bta_sys_hw_on,
|
||||
bta_sys_hw_stopping
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_init
|
||||
**
|
||||
** Description BTA initialization; called from task initialization.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_init(void)
|
||||
{
|
||||
memset(&bta_sys_cb, 0, sizeof(tBTA_SYS_CB));
|
||||
|
||||
osi_mutex_new(&bta_alarm_lock);
|
||||
|
||||
bta_alarm_hash_map = hash_map_new(BTA_ALARM_HASH_MAP_SIZE,
|
||||
hash_function_pointer, NULL, (data_free_fn)osi_alarm_free, NULL);
|
||||
|
||||
appl_trace_level = APPL_INITIAL_TRACE_LEVEL;
|
||||
|
||||
/* register BTA SYS message handler */
|
||||
bta_sys_register( BTA_ID_SYS, &bta_sys_hw_reg);
|
||||
|
||||
/* register for BTM notifications */
|
||||
BTM_RegisterForDeviceStatusNotif ((tBTM_DEV_STATUS_CB *)&bta_sys_hw_btm_cback );
|
||||
|
||||
#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE)
|
||||
bta_ar_init();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void bta_sys_free(void)
|
||||
{
|
||||
hash_map_free(bta_alarm_hash_map);
|
||||
osi_mutex_free(&bta_alarm_lock);
|
||||
#if BTA_DYNAMIC_MEMORY
|
||||
FREE_AND_RESET(bta_sys_cb_ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sm_execute
|
||||
**
|
||||
** Description State machine event handling function for DM
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN bta_sys_sm_execute(BT_HDR *p_msg)
|
||||
{
|
||||
BOOLEAN freebuf = TRUE;
|
||||
tBTA_SYS_ST_TBL state_table;
|
||||
UINT8 action;
|
||||
int i;
|
||||
|
||||
APPL_TRACE_EVENT("bta_sys_sm_execute state:%d, event:0x%x\n", bta_sys_cb.state, p_msg->event);
|
||||
|
||||
/* look up the state table for the current state */
|
||||
state_table = bta_sys_st_tbl[bta_sys_cb.state];
|
||||
/* update state */
|
||||
bta_sys_cb.state = state_table[p_msg->event & 0x00ff][BTA_SYS_NEXT_STATE];
|
||||
|
||||
/* execute action functions */
|
||||
for (i = 0; i < BTA_SYS_ACTIONS; i++) {
|
||||
if ((action = state_table[p_msg->event & 0x00ff][i]) != BTA_SYS_IGNORE) {
|
||||
(*bta_sys_action[action])( (tBTA_SYS_HW_MSG *) p_msg);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return freebuf;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void bta_sys_hw_register( tBTA_SYS_HW_MODULE module, tBTA_SYS_HW_CBACK *cback)
|
||||
{
|
||||
bta_sys_cb.sys_hw_cback[module] = cback;
|
||||
}
|
||||
|
||||
|
||||
void bta_sys_hw_unregister( tBTA_SYS_HW_MODULE module )
|
||||
{
|
||||
bta_sys_cb.sys_hw_cback[module] = NULL;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_btm_cback
|
||||
**
|
||||
** Description This function is registered by BTA SYS to BTM in order to get status notifications
|
||||
**
|
||||
**
|
||||
** Returns
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_btm_cback( tBTM_DEV_STATUS status )
|
||||
{
|
||||
|
||||
tBTA_SYS_HW_MSG *sys_event;
|
||||
|
||||
APPL_TRACE_DEBUG(" bta_sys_hw_btm_cback was called with parameter: %i" , status );
|
||||
|
||||
/* send a message to BTA SYS */
|
||||
if ((sys_event = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
|
||||
if (status == BTM_DEV_STATUS_UP) {
|
||||
sys_event->hdr.event = BTA_SYS_EVT_STACK_ENABLED_EVT;
|
||||
} else if (status == BTM_DEV_STATUS_DOWN) {
|
||||
sys_event->hdr.event = BTA_SYS_ERROR_EVT;
|
||||
} else {
|
||||
/* BTM_DEV_STATUS_CMD_TOUT is ignored for now. */
|
||||
osi_free (sys_event);
|
||||
sys_event = NULL;
|
||||
}
|
||||
|
||||
if (sys_event) {
|
||||
bta_sys_sendmsg(sys_event);
|
||||
}
|
||||
} else {
|
||||
APPL_TRACE_DEBUG("ERROR bta_sys_hw_btm_cback couldn't send msg" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_error
|
||||
**
|
||||
** Description In case the HW device stops answering... Try to turn it off, then re-enable all
|
||||
** previously active SW modules.
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_error(tBTA_SYS_HW_MSG *p_sys_hw_msg)
|
||||
{
|
||||
UINT8 module_index;
|
||||
UNUSED(p_sys_hw_msg);
|
||||
|
||||
APPL_TRACE_DEBUG("%s\n", __FUNCTION__);
|
||||
|
||||
for (module_index = 0; module_index < BTA_SYS_MAX_HW_MODULES; module_index++) {
|
||||
if ( bta_sys_cb.sys_hw_module_active & ((UINT32)1 << module_index )) {
|
||||
switch ( module_index) {
|
||||
case BTA_SYS_HW_BLUETOOTH:
|
||||
/* Send BTA_SYS_HW_ERROR_EVT to DM */
|
||||
if (bta_sys_cb.sys_hw_cback[module_index] != NULL) {
|
||||
bta_sys_cb.sys_hw_cback[module_index] (BTA_SYS_HW_ERROR_EVT);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* not yet supported */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_enable
|
||||
**
|
||||
** Description this function is called after API enable and HW has been turned on
|
||||
**
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
|
||||
void bta_sys_hw_api_enable( tBTA_SYS_HW_MSG *p_sys_hw_msg )
|
||||
{
|
||||
if ((!bta_sys_cb.sys_hw_module_active) && (bta_sys_cb.state != BTA_SYS_HW_ON)) {
|
||||
/* register which HW module was turned on */
|
||||
bta_sys_cb.sys_hw_module_active |= ((UINT32)1 << p_sys_hw_msg->hw_module );
|
||||
|
||||
tBTA_SYS_HW_MSG *p_msg;
|
||||
if ((p_msg = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
|
||||
p_msg->hdr.event = BTA_SYS_EVT_ENABLED_EVT;
|
||||
p_msg->hw_module = p_sys_hw_msg->hw_module;
|
||||
|
||||
bta_sys_sendmsg(p_msg);
|
||||
}
|
||||
} else {
|
||||
/* register which HW module was turned on */
|
||||
bta_sys_cb.sys_hw_module_active |= ((UINT32)1 << p_sys_hw_msg->hw_module );
|
||||
|
||||
/* HW already in use, so directly notify the caller */
|
||||
if (bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ] != NULL ) {
|
||||
bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]( BTA_SYS_HW_ON_EVT );
|
||||
}
|
||||
}
|
||||
|
||||
APPL_TRACE_EVENT ("bta_sys_hw_api_enable for %d, active modules 0x%04X\n",
|
||||
p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active);
|
||||
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_disable
|
||||
**
|
||||
** Description if no other module is using the HW, this function will call ( if defined ) a user-macro to turn off the HW
|
||||
**
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg)
|
||||
{
|
||||
APPL_TRACE_DEBUG("bta_sys_hw_api_disable for %d, active modules: 0x%04X\n",
|
||||
p_sys_hw_msg->hw_module, bta_sys_cb.sys_hw_module_active );
|
||||
|
||||
/* make sure the related SW blocks were stopped */
|
||||
bta_sys_disable( p_sys_hw_msg->hw_module );
|
||||
|
||||
|
||||
/* register which module we turn off */
|
||||
bta_sys_cb.sys_hw_module_active &= ~((UINT32)1 << p_sys_hw_msg->hw_module );
|
||||
|
||||
|
||||
/* if there are still some SW modules using the HW, just provide an answer to the calling */
|
||||
if ( bta_sys_cb.sys_hw_module_active != 0 ) {
|
||||
/* if there are still some SW modules using the HW, directly notify the caller */
|
||||
if ( bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ] != NULL ) {
|
||||
bta_sys_cb.sys_hw_cback[p_sys_hw_msg->hw_module ]( BTA_SYS_HW_OFF_EVT );
|
||||
}
|
||||
} else {
|
||||
/* manually update the state of our system */
|
||||
bta_sys_cb.state = BTA_SYS_HW_STOPPING;
|
||||
|
||||
tBTA_SYS_HW_MSG *p_msg;
|
||||
if ((p_msg = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
|
||||
p_msg->hdr.event = BTA_SYS_EVT_DISABLED_EVT;
|
||||
p_msg->hw_module = p_sys_hw_msg->hw_module;
|
||||
|
||||
bta_sys_sendmsg(p_msg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_event_enabled
|
||||
**
|
||||
** Description
|
||||
**
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_evt_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg)
|
||||
{
|
||||
APPL_TRACE_EVENT("bta_sys_hw_evt_enabled for %i\n", p_sys_hw_msg->hw_module);
|
||||
BTM_DeviceReset( NULL );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_event_disabled
|
||||
**
|
||||
** Description
|
||||
**
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_evt_disabled(tBTA_SYS_HW_MSG *p_sys_hw_msg)
|
||||
{
|
||||
UINT8 hw_module_index;
|
||||
|
||||
APPL_TRACE_DEBUG("bta_sys_hw_evt_disabled - module 0x%X\n", p_sys_hw_msg->hw_module);
|
||||
|
||||
for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++) {
|
||||
if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) {
|
||||
bta_sys_cb.sys_hw_cback[hw_module_index] (BTA_SYS_HW_OFF_EVT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_hw_event_stack_enabled
|
||||
**
|
||||
** Description we receive this event once the SW side is ready ( stack, FW download,... ),
|
||||
** i.e. we can really start using the device. So notify the app.
|
||||
**
|
||||
** Returns success or failure
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_hw_evt_stack_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg)
|
||||
{
|
||||
UINT8 hw_module_index;
|
||||
UNUSED(p_sys_hw_msg);
|
||||
|
||||
APPL_TRACE_DEBUG(" bta_sys_hw_evt_stack_enabled!notify the callers\n");
|
||||
|
||||
for (hw_module_index = 0; hw_module_index < BTA_SYS_MAX_HW_MODULES; hw_module_index++ ) {
|
||||
if (bta_sys_cb.sys_hw_cback[hw_module_index] != NULL) {
|
||||
bta_sys_cb.sys_hw_cback[hw_module_index] (BTA_SYS_HW_ON_EVT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_event
|
||||
**
|
||||
** Description BTA event handler; called from task event handler.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_event(void * param)
|
||||
{
|
||||
BT_HDR *p_msg = (BT_HDR *)param;
|
||||
|
||||
UINT8 id;
|
||||
BOOLEAN freebuf = TRUE;
|
||||
|
||||
APPL_TRACE_EVENT("BTA got event 0x%x\n", p_msg->event);
|
||||
|
||||
/* get subsystem id from event */
|
||||
id = (UINT8) (p_msg->event >> 8);
|
||||
|
||||
/* verify id and call subsystem event handler */
|
||||
if ((id < BTA_ID_MAX) && (bta_sys_cb.reg[id] != NULL)) {
|
||||
freebuf = (*bta_sys_cb.reg[id]->evt_hdlr)(p_msg);
|
||||
} else {
|
||||
APPL_TRACE_WARNING("BTA got unregistered event id %d\n", id);
|
||||
}
|
||||
|
||||
if (freebuf) {
|
||||
osi_free(p_msg);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_register
|
||||
**
|
||||
** Description Called by other BTA subsystems to register their event
|
||||
** handler.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_register(UINT8 id, const tBTA_SYS_REG *p_reg)
|
||||
{
|
||||
bta_sys_cb.reg[id] = (tBTA_SYS_REG *) p_reg;
|
||||
bta_sys_cb.is_reg[id] = TRUE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_deregister
|
||||
**
|
||||
** Description Called by other BTA subsystems to de-register
|
||||
** handler.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_deregister(UINT8 id)
|
||||
{
|
||||
bta_sys_cb.is_reg[id] = FALSE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_is_register
|
||||
**
|
||||
** Description Called by other BTA subsystems to get registeration
|
||||
** status.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN bta_sys_is_register(UINT8 id)
|
||||
{
|
||||
return bta_sys_cb.is_reg[id];
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_sendmsg
|
||||
**
|
||||
** Description Send a message to BTA. This function is designed to
|
||||
** optimize sending of messages to BTA. It is called by BTA
|
||||
** API functions and call-in functions.
|
||||
**
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_sendmsg(void *p_msg)
|
||||
{
|
||||
// There is a race condition that occurs if the stack is shut down while
|
||||
// there is a procedure in progress that can schedule a task via this
|
||||
// message queue. This causes |btu_bta_msg_queue| to get cleaned up before
|
||||
// it gets used here; hence we check for NULL before using it.
|
||||
if (btu_task_post(SIG_BTU_BTA_MSG, p_msg, OSI_THREAD_MAX_TIMEOUT) == false) {
|
||||
osi_free(p_msg);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_start_timer
|
||||
**
|
||||
** Description Start a protocol timer for the specified amount
|
||||
** of time in milliseconds.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_alarm_cb(void *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
TIMER_LIST_ENT *p_tle = (TIMER_LIST_ENT *)data;
|
||||
|
||||
btu_task_post(SIG_BTU_BTA_ALARM, p_tle, OSI_THREAD_MAX_TIMEOUT);
|
||||
}
|
||||
|
||||
void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms)
|
||||
{
|
||||
assert(p_tle != NULL);
|
||||
|
||||
// Get the alarm for this p_tle.
|
||||
osi_mutex_lock(&bta_alarm_lock, OSI_MUTEX_MAX_TIMEOUT);
|
||||
if (!hash_map_has_key(bta_alarm_hash_map, p_tle)) {
|
||||
hash_map_set(bta_alarm_hash_map, p_tle, osi_alarm_new("bta_sys", bta_alarm_cb, p_tle, 0));
|
||||
}
|
||||
osi_mutex_unlock(&bta_alarm_lock);
|
||||
|
||||
osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle);
|
||||
if (alarm == NULL) {
|
||||
APPL_TRACE_ERROR("%s unable to create alarm.", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
p_tle->event = type;
|
||||
p_tle->ticks = timeout_ms;
|
||||
//osi_alarm_set(alarm, (period_ms_t)timeout_ms, bta_alarm_cb, p_tle);
|
||||
osi_alarm_set(alarm, (period_ms_t)timeout_ms);
|
||||
}
|
||||
|
||||
bool hash_iter_ro_cb(hash_map_entry_t *hash_map_entry, void *context)
|
||||
{
|
||||
osi_alarm_t *alarm = (osi_alarm_t *)hash_map_entry->data;
|
||||
period_ms_t *p_remaining_ms = (period_ms_t *)context;
|
||||
*p_remaining_ms += osi_alarm_get_remaining_ms(alarm);
|
||||
return true;
|
||||
}
|
||||
|
||||
UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle)
|
||||
{
|
||||
period_ms_t remaining_ms = 0;
|
||||
osi_mutex_lock(&bta_alarm_lock, OSI_MUTEX_MAX_TIMEOUT);
|
||||
// Get the alarm for this p_tle
|
||||
hash_map_foreach(bta_alarm_hash_map, hash_iter_ro_cb, &remaining_ms);
|
||||
osi_mutex_unlock(&bta_alarm_lock);
|
||||
return remaining_ms;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_timer_is_active
|
||||
**
|
||||
** Description Get info of timer is active or not.
|
||||
**
|
||||
** Returns true if timer is exist and active, false otherwise.
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN bta_sys_timer_is_active(TIMER_LIST_ENT *p_tle)
|
||||
{
|
||||
assert(p_tle != NULL);
|
||||
|
||||
osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle);
|
||||
if (alarm != NULL && osi_alarm_is_active(alarm)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_stop_timer
|
||||
**
|
||||
** Description Stop a BTA timer.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle)
|
||||
{
|
||||
assert(p_tle != NULL);
|
||||
|
||||
osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle);
|
||||
if (alarm == NULL) {
|
||||
APPL_TRACE_DEBUG("%s expected alarm was not in bta alarm hash map.", __func__);
|
||||
return;
|
||||
}
|
||||
osi_alarm_cancel(alarm);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_free_timer
|
||||
**
|
||||
** Description Stop and free a BTA timer.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_free_timer(TIMER_LIST_ENT *p_tle)
|
||||
{
|
||||
assert(p_tle != NULL);
|
||||
|
||||
osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle);
|
||||
if (alarm == NULL) {
|
||||
APPL_TRACE_DEBUG("%s expected alarm was not in bta alarm hash map.", __func__);
|
||||
return;
|
||||
}
|
||||
osi_alarm_cancel(alarm);
|
||||
hash_map_erase(bta_alarm_hash_map, p_tle);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_disable
|
||||
**
|
||||
** Description For each registered subsystem execute its disable function.
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_disable(tBTA_SYS_HW_MODULE module)
|
||||
{
|
||||
int bta_id = 0;
|
||||
int bta_id_max = 0;
|
||||
|
||||
APPL_TRACE_DEBUG("bta_sys_disable: module %i", module);
|
||||
|
||||
switch ( module ) {
|
||||
case BTA_SYS_HW_BLUETOOTH:
|
||||
bta_id = BTA_ID_DM;
|
||||
bta_id_max = BTA_ID_BLUETOOTH_MAX;
|
||||
break;
|
||||
default:
|
||||
APPL_TRACE_WARNING("bta_sys_disable: unkown module");
|
||||
return;
|
||||
}
|
||||
|
||||
for ( ; bta_id <= bta_id_max; bta_id++) {
|
||||
if (bta_sys_cb.reg[bta_id] != NULL) {
|
||||
if (bta_sys_cb.is_reg[bta_id] == TRUE && bta_sys_cb.reg[bta_id]->disable != NULL) {
|
||||
(*bta_sys_cb.reg[bta_id]->disable)();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_set_trace_level
|
||||
**
|
||||
** Description Set trace level for BTA
|
||||
**
|
||||
** Returns void
|
||||
**
|
||||
*******************************************************************************/
|
||||
void bta_sys_set_trace_level(UINT8 level)
|
||||
{
|
||||
appl_trace_level = level;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function bta_sys_get_sys_features
|
||||
**
|
||||
** Description Returns sys_features to other BTA modules.
|
||||
**
|
||||
** Returns sys_features
|
||||
**
|
||||
*******************************************************************************/
|
||||
UINT16 bta_sys_get_sys_features (void)
|
||||
{
|
||||
return bta_sys_cb.sys_features;
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2003-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 private interface file for the BTA system manager.
|
||||
*
|
||||
******************************************************************************/
|
||||
#ifndef BTA_SYS_INT_H
|
||||
#define BTA_SYS_INT_H
|
||||
|
||||
/*****************************************************************************
|
||||
** Constants and data types
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
** state table
|
||||
*****************************************************************************/
|
||||
|
||||
/* SYS HW state */
|
||||
enum {
|
||||
BTA_SYS_HW_OFF,
|
||||
BTA_SYS_HW_STARTING,
|
||||
BTA_SYS_HW_ON,
|
||||
BTA_SYS_HW_STOPPING
|
||||
};
|
||||
typedef UINT8 tBTA_SYS_HW_STATE;
|
||||
|
||||
/* Collision callback */
|
||||
#define MAX_COLLISION_REG 5
|
||||
|
||||
typedef struct {
|
||||
UINT8 id[MAX_COLLISION_REG];
|
||||
tBTA_SYS_CONN_CBACK *p_coll_cback[MAX_COLLISION_REG];
|
||||
} tBTA_SYS_COLLISION;
|
||||
|
||||
/* system manager control block */
|
||||
typedef struct {
|
||||
tBTA_SYS_REG *reg[BTA_ID_MAX]; /* registration structures */
|
||||
BOOLEAN is_reg[BTA_ID_MAX]; /* registration structures */
|
||||
tBTA_SYS_HW_STATE state;
|
||||
tBTA_SYS_HW_CBACK *sys_hw_cback[BTA_SYS_MAX_HW_MODULES]; /* enable callback for each HW modules */
|
||||
UINT32 sys_hw_module_active; /* bitmask of all active modules */
|
||||
UINT16 sys_features; /* Bitmask of sys features */
|
||||
|
||||
tBTA_SYS_CONN_CBACK *prm_cb; /* role management callback registered by DM */
|
||||
tBTA_SYS_CONN_CBACK *ppm_cb; /* low power management callback registered by DM */
|
||||
tBTA_SYS_CONN_CBACK *p_policy_cb; /* link policy change callback registered by DM */
|
||||
tBTA_SYS_CONN_CBACK *p_sco_cb; /* SCO connection change callback registered by AV */
|
||||
tBTA_SYS_CONN_CBACK *p_role_cb; /* role change callback registered by AV */
|
||||
tBTA_SYS_COLLISION colli_reg; /* collision handling module */
|
||||
#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
|
||||
tBTA_SYS_EIR_CBACK *eir_cb; /* add/remove UUID into EIR */
|
||||
#endif
|
||||
#if (BTM_SSR_INCLUDED == TRUE)
|
||||
tBTA_SYS_SSR_CFG_CBACK *p_ssr_cb;
|
||||
#endif
|
||||
/* VS event handler */
|
||||
tBTA_SYS_VS_EVT_HDLR *p_vs_evt_hdlr;
|
||||
|
||||
} tBTA_SYS_CB;
|
||||
|
||||
/*****************************************************************************
|
||||
** Global variables
|
||||
*****************************************************************************/
|
||||
|
||||
/* system manager control block */
|
||||
#if BTA_DYNAMIC_MEMORY == FALSE
|
||||
extern tBTA_SYS_CB bta_sys_cb;
|
||||
#else
|
||||
extern tBTA_SYS_CB *bta_sys_cb_ptr;
|
||||
#define bta_sys_cb (*bta_sys_cb_ptr)
|
||||
#endif
|
||||
|
||||
/* functions used for BTA SYS HW state machine */
|
||||
void bta_sys_hw_btm_cback( tBTM_DEV_STATUS status );
|
||||
void bta_sys_hw_error(tBTA_SYS_HW_MSG *p_sys_hw_msg);
|
||||
void bta_sys_hw_api_enable( tBTA_SYS_HW_MSG *p_sys_hw_msg );
|
||||
void bta_sys_hw_api_disable(tBTA_SYS_HW_MSG *p_sys_hw_msg);
|
||||
void bta_sys_hw_evt_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg);
|
||||
void bta_sys_hw_evt_disabled(tBTA_SYS_HW_MSG *p_sys_hw_msg);
|
||||
void bta_sys_hw_evt_stack_enabled(tBTA_SYS_HW_MSG *p_sys_hw_msg);
|
||||
|
||||
BOOLEAN bta_sys_sm_execute(BT_HDR *p_msg);
|
||||
|
||||
#endif /* BTA_SYS_INT_H */
|
||||
@@ -0,0 +1,319 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2003-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 file contains utility functions.
|
||||
*
|
||||
******************************************************************************/
|
||||
#include <stddef.h>
|
||||
#include "bta/utl.h"
|
||||
#include "stack/btm_api.h"
|
||||
#include "osi/allocator.h"
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_str2int
|
||||
**
|
||||
** Description This utility function converts a character string to an
|
||||
** integer. Acceptable values in string are 0-9. If invalid
|
||||
** string or string value too large, -1 is returned. Leading
|
||||
** spaces are skipped.
|
||||
**
|
||||
**
|
||||
** Returns Integer value or -1 on error.
|
||||
**
|
||||
*******************************************************************************/
|
||||
INT16 utl_str2int(const char *p_s)
|
||||
{
|
||||
INT32 val = 0;
|
||||
|
||||
for (; *p_s == ' ' && *p_s != 0; p_s++);
|
||||
|
||||
if (*p_s == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if ((*p_s < '0') || (*p_s > '9')) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
val += (INT32) (*p_s++ - '0');
|
||||
|
||||
if (val > 32767) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*p_s == 0) {
|
||||
return (INT16) val;
|
||||
} else {
|
||||
val *= 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_strucmp
|
||||
**
|
||||
** Description This utility function compares two strings in uppercase.
|
||||
** String p_s must be uppercase. String p_t is converted to
|
||||
** uppercase if lowercase. If p_s ends first, the substring
|
||||
** match is counted as a match.
|
||||
**
|
||||
**
|
||||
** Returns 0 if strings match, nonzero otherwise.
|
||||
**
|
||||
*******************************************************************************/
|
||||
int utl_strucmp(const char *p_s, const char *p_t)
|
||||
{
|
||||
char c;
|
||||
|
||||
while (*p_s && *p_t) {
|
||||
c = *p_t++;
|
||||
if (c >= 'a' && c <= 'z') {
|
||||
c -= 0x20;
|
||||
}
|
||||
if (*p_s++ != c) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* if p_t hit null first, no match */
|
||||
if (*p_t == 0 && *p_s != 0) {
|
||||
return 1;
|
||||
}
|
||||
/* else p_s hit null first, count as match */
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_itoa
|
||||
**
|
||||
** Description This utility function converts a UINT16 to a string. The
|
||||
** string is NULL-terminated. The length of the string is
|
||||
** returned;
|
||||
**
|
||||
**
|
||||
** Returns Length of string.
|
||||
**
|
||||
*******************************************************************************/
|
||||
UINT8 utl_itoa(UINT16 i, char *p_s)
|
||||
{
|
||||
UINT16 j, k;
|
||||
char *p = p_s;
|
||||
BOOLEAN fill = FALSE;
|
||||
|
||||
if (i == 0) {
|
||||
/* take care of zero case */
|
||||
*p++ = '0';
|
||||
} else {
|
||||
for (j = 10000; j > 0; j /= 10) {
|
||||
k = i / j;
|
||||
i %= j;
|
||||
if (k > 0 || fill) {
|
||||
*p++ = k + '0';
|
||||
fill = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
*p = 0;
|
||||
return (UINT8) (p - p_s);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_freebuf
|
||||
**
|
||||
** Description This function calls osi_free to free the buffer passed
|
||||
** in, if buffer pointer is not NULL, and also initializes
|
||||
** buffer pointer to NULL.
|
||||
**
|
||||
**
|
||||
** Returns Nothing.
|
||||
**
|
||||
*******************************************************************************/
|
||||
void utl_freebuf(void **p)
|
||||
{
|
||||
if (*p != NULL) {
|
||||
osi_free(*p);
|
||||
*p = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_set_device_class
|
||||
**
|
||||
** Description This function updates the local Device Class.
|
||||
**
|
||||
** Parameters:
|
||||
** p_cod - Pointer to the device class to set to
|
||||
**
|
||||
** cmd - the fields of the device class to update.
|
||||
** BTA_UTL_SET_COD_MAJOR_MINOR, - overwrite major, minor class
|
||||
** BTA_UTL_SET_COD_SERVICE_CLASS - set the bits in the input
|
||||
** BTA_UTL_CLR_COD_SERVICE_CLASS - clear the bits in the input
|
||||
** BTA_UTL_SET_COD_ALL - overwrite major, minor, set the bits in service class
|
||||
** BTA_UTL_INIT_COD - overwrite major, minor, and service class
|
||||
**
|
||||
** Returns TRUE if successful, Otherwise FALSE
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN utl_set_device_class(tBTA_UTL_COD *p_cod, UINT8 cmd)
|
||||
{
|
||||
UINT8 *dev;
|
||||
UINT16 service;
|
||||
UINT8 minor, major;
|
||||
DEV_CLASS dev_class;
|
||||
|
||||
dev = BTM_ReadDeviceClass();
|
||||
BTM_COD_SERVICE_CLASS( service, dev );
|
||||
BTM_COD_MINOR_CLASS(minor, dev );
|
||||
BTM_COD_MAJOR_CLASS(major, dev );
|
||||
|
||||
switch (cmd) {
|
||||
case BTA_UTL_SET_COD_MAJOR_MINOR:
|
||||
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
|
||||
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
|
||||
break;
|
||||
|
||||
case BTA_UTL_SET_COD_SERVICE_CLASS:
|
||||
/* clear out the bits that is not SERVICE_CLASS bits */
|
||||
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
|
||||
service = service | p_cod->service;
|
||||
break;
|
||||
|
||||
case BTA_UTL_CLR_COD_SERVICE_CLASS:
|
||||
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
|
||||
service = service & (~p_cod->service);
|
||||
break;
|
||||
|
||||
case BTA_UTL_SET_COD_ALL:
|
||||
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
|
||||
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
|
||||
p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
|
||||
service = service | p_cod->service;
|
||||
break;
|
||||
|
||||
case BTA_UTL_INIT_COD:
|
||||
minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
|
||||
major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
|
||||
service = p_cod->service & BTM_COD_SERVICE_CLASS_MASK;
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* convert the fields into the device class type */
|
||||
FIELDS_TO_COD(dev_class, minor, major, service);
|
||||
|
||||
if (BTM_SetDeviceClass(dev_class) == BTM_SUCCESS) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_get_device_class
|
||||
**
|
||||
** Description This function get the local Device Class.
|
||||
**
|
||||
** Parameters:
|
||||
** p_cod - Pointer to the device class to get to
|
||||
**
|
||||
**
|
||||
** Returns TRUE if successful, Otherwise FALSE
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN utl_get_device_class(tBTA_UTL_COD *p_cod)
|
||||
{
|
||||
UINT8 *dev;
|
||||
UINT16 service;
|
||||
UINT8 minor, major;
|
||||
|
||||
dev = BTM_ReadDeviceClass();
|
||||
BTM_COD_SERVICE_CLASS( service, dev );
|
||||
BTM_COD_MINOR_CLASS(minor, dev );
|
||||
BTM_COD_MAJOR_CLASS(major, dev );
|
||||
|
||||
p_cod->minor = minor;
|
||||
p_cod->major = major;
|
||||
p_cod->service = service;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_isintstr
|
||||
**
|
||||
** Description This utility function checks if the given string is an
|
||||
** integer string or not
|
||||
**
|
||||
**
|
||||
** Returns TRUE if successful, Otherwise FALSE
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN utl_isintstr(const char *p_s)
|
||||
{
|
||||
UINT16 i = 0;
|
||||
|
||||
for (i = 0; p_s[i] != 0; i++) {
|
||||
if (((p_s[i] < '0') || (p_s[i] > '9')) && (p_s[i] != ';')) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
** Function utl_isdialstr
|
||||
**
|
||||
** Description This utility function checks if the given string contains
|
||||
** only dial digits or not
|
||||
**
|
||||
**
|
||||
** Returns TRUE if successful, Otherwise FALSE
|
||||
**
|
||||
*******************************************************************************/
|
||||
BOOLEAN utl_isdialstr(const char *p_s)
|
||||
{
|
||||
UINT16 i = 0;
|
||||
|
||||
for (i = 0; p_s[i] != 0; i++) {
|
||||
if (!(((p_s[i] >= '0') && (p_s[i] <= '9'))
|
||||
|| (p_s[i] == '*') || (p_s[i] == '+') || (p_s[i] == '#') || (p_s[i] == ';')
|
||||
|| ((p_s[i] >= 'A') && (p_s[i] <= 'C'))
|
||||
|| ((p_s[i] == 'p') || (p_s[i] == 'P')
|
||||
|| (p_s[i] == 'w') || (p_s[i] == 'W')))) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user