/******************************************************************************
*
* Copyright (C) 2011-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.
*
******************************************************************************/
#include "OverrideLog.h"
#include "ProtoDispBluetoothHci.h"
#include "nfc_target.h"
#include <cutils/log.h>
extern UINT8 *HCIDisp1 (char *p_descr, UINT8 *p_data);
extern UINT32 ScrProtocolTraceFlag;
#define HCI_GEN_TRACE (TRACE_CTRL_GENERAL | TRACE_LAYER_HCI | \
TRACE_ORG_PROTO_DISP | hci_trace_type)
static UINT8 hci_trace_type = 0;
static char* modes_str [] =
{
"No sleep mode",
"UART",
"UART with messaging",
"USB",
"H4IBSS",
"USB with host wake",
"SDIO",
"UART CS-N",
"SPI",
"H5",
"H4DS",
"",
"UART with BREAK"
};
static UINT8* p_end_hci = NULL;
static UINT8* HCIDisp1Ext (char *p_descr, UINT8 *p_data, char * p_ext);
static void disp_sleepmode (UINT8* p);
static void disp_sleepmode_evt (UINT8* p);
///////////////////////////////////////////
///////////////////////////////////////////
UINT8 *HCIDisp1Ext (char *p_descr, UINT8 *p_data, char * p_ext)
{
if (p_data == p_end_hci)
return p_data;
char buff[200];
sprintf (buff, "%40s : %u (0x%02x): %s", p_descr, *p_data, *p_data, p_ext);
ScrLog (HCI_GEN_TRACE, "%s", buff);
return (p_data + 1);
}
/*******************************************************************************
**
** Function disp_sleepmode
**
** Description Displays VSC sleep mode
**
** Returns none.
**
*******************************************************************************/
void disp_sleepmode(UINT8 * p)
{
hci_trace_type = TRACE_TYPE_CMD_TX;
ScrLog (HCI_GEN_TRACE, "--");
int len = p[2];
ScrLog (HCI_GEN_TRACE, "SEND Command to HCI. Name: Set_Sleepmode_Param (Hex Code: 0xfc27 Param Len: %d)", len);
p += 3;
p_end_hci = p + len;
p = HCIDisp1Ext("Sleep_Mode", p, (*p <= 12) ? modes_str[*p] : "");
p = HCIDisp1("Idle_Threshold_Host", p);
p = HCIDisp1("Idle_Threshold_HC", p);
p = HCIDisp1Ext("BT_WAKE_Active_Mode", p, (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : ""));
p = HCIDisp1Ext("HOST_WAKE_Active_Mode", p, (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : ""));
p = HCIDisp1("Allow_Host_Sleep_During_SCO", p);
p = HCIDisp1("Combine_Sleep_Mode_And_LPM", p);
p = HCIDisp1("Enable_Tristate_Control_Of_UART_Tx_Line", p);
p = HCIDisp1Ext("Active_Connection_Handling_On_Suspend", p, (*p == 0) ? "Maintain connections; sleep when timed activity allows" : ((*p == 1) ? "Sleep until resume is detected" : ""));
p = HCIDisp1("Resume_Timeout", p);
p = HCIDisp1("Enable_BREAK_To_Host", p);
p = HCIDisp1("Pulsed_HOST_WAKE", p);
ScrLog (HCI_GEN_TRACE, "--");
}
/*******************************************************************************
**
** Function disp_sleepmode_evt
**
** Description Displays HCI comand complete event for VSC sleep mode.
**
** Returns none.
**
*******************************************************************************/
void disp_sleepmode_evt(UINT8* p)
{
UINT8 len=p[1], status=p[5];
hci_trace_type = TRACE_TYPE_EVT_RX;
ScrLog (HCI_GEN_TRACE, "--");
ScrLog (HCI_GEN_TRACE, "RCVD Event from HCI. Name: HCI_Command_Complete (Hex Code: 0x0e Param Len: %d)", len);
p = HCIDisp1 ("Num HCI Cmd Packets", p+2);
ScrLog (HCI_GEN_TRACE,"%40s : 0xfc27 (Set_Sleepmode_Param)", "Cmd Code");
ScrLog (HCI_GEN_TRACE, "%40s : %d (0x%02x) %s", "Status", status, status, (status == 0) ? "Success" : "");
ScrLog (HCI_GEN_TRACE, "--");
}
/*******************************************************************************
**
** Function ProtoDispBluetoothHciCmd
**
** Description Display a HCI command string
**
** Returns:
** Nothing
**
*******************************************************************************/
void ProtoDispBluetoothHciCmd (BT_HDR *p_buf)
{
if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
return;
UINT8 * p = (UINT8 *)(p_buf + 1) + p_buf->offset;
if (*(p) == 0x27 && *(p+1) == 0xfc) // opcode sleep mode
{
disp_sleepmode(p);
}
}
/*******************************************************************************
**
** Function ProtoDispBluetoothHciEvt
**
** Description display a NCI event
**
** Returns:
** Nothing
**
*******************************************************************************/
void ProtoDispBluetoothHciEvt (BT_HDR *pBuffer)
{
if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
return;
UINT8 *p = (UINT8 *)(pBuffer + 1) + pBuffer->offset;
if (*p == 0x0e) // command complete
{
if (*(p+1) == 4) // length
{
if (*(p+3) == 0x27 && *(p+4) == 0xfc) // opcode 0x27fc (sleep mode)
{
disp_sleepmode_evt(p);
}
}
}
}