/****************************************************************************** * * 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); } } } }