1 /****************************************************************************** 2 * 3 * Copyright (C) 2011-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 #include "ProtoDispBluetoothHci.h" 19 #include <cutils/log.h> 20 #include "_OverrideLog.h" 21 #include "nfc_target.h" 22 23 extern uint8_t* HCIDisp1(char* p_descr, uint8_t* p_data); 24 extern uint32_t ScrProtocolTraceFlag; 25 #define HCI_GEN_TRACE \ 26 (TRACE_CTRL_GENERAL | TRACE_LAYER_HCI | TRACE_ORG_PROTO_DISP | hci_trace_type) 27 static uint8_t hci_trace_type = 0; 28 static char* modes_str[] = {"No sleep mode", 29 "UART", 30 "UART with messaging", 31 "USB", 32 "H4IBSS", 33 "USB with host wake", 34 "SDIO", 35 "UART CS-N", 36 "SPI", 37 "H5", 38 "H4DS", 39 "", 40 "UART with BREAK"}; 41 static uint8_t* p_end_hci = NULL; 42 static uint8_t* HCIDisp1Ext(char* p_descr, uint8_t* p_data, char* p_ext); 43 static void disp_sleepmode(uint8_t* p); 44 static void disp_sleepmode_evt(uint8_t* p); 45 46 /////////////////////////////////////////// 47 /////////////////////////////////////////// 48 49 uint8_t* HCIDisp1Ext(char* p_descr, uint8_t* p_data, char* p_ext) { 50 if (p_data == p_end_hci) return p_data; 51 52 char buff[200]; 53 54 sprintf(buff, "%40s : %u (0x%02x): %s", p_descr, *p_data, *p_data, p_ext); 55 56 ScrLog(HCI_GEN_TRACE, "%s", buff); 57 return (p_data + 1); 58 } 59 60 /******************************************************************************* 61 ** 62 ** Function disp_sleepmode 63 ** 64 ** Description Displays VSC sleep mode 65 ** 66 ** Returns none. 67 ** 68 *******************************************************************************/ 69 void disp_sleepmode(uint8_t* p) { 70 hci_trace_type = TRACE_TYPE_CMD_TX; 71 ScrLog(HCI_GEN_TRACE, "--"); 72 int len = p[2]; 73 ScrLog(HCI_GEN_TRACE, 74 "SEND Command to HCI. Name: Set_Sleepmode_Param (Hex Code: 0xfc27 " 75 "Param Len: %d)", 76 len); 77 p += 3; 78 p_end_hci = p + len; 79 p = HCIDisp1Ext("Sleep_Mode", p, (*p <= 12) ? modes_str[*p] : ""); 80 p = HCIDisp1("Idle_Threshold_Host", p); 81 p = HCIDisp1("Idle_Threshold_HC", p); 82 p = HCIDisp1Ext("BT_WAKE_Active_Mode", p, 83 (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : "")); 84 p = HCIDisp1Ext("HOST_WAKE_Active_Mode", p, 85 (*p == 0) ? "Active Low" : ((*p == 1) ? "Active High" : "")); 86 p = HCIDisp1("Allow_Host_Sleep_During_SCO", p); 87 p = HCIDisp1("Combine_Sleep_Mode_And_LPM", p); 88 p = HCIDisp1("Enable_Tristate_Control_Of_UART_Tx_Line", p); 89 p = HCIDisp1Ext("Active_Connection_Handling_On_Suspend", p, 90 (*p == 0) 91 ? "Maintain connections; sleep when timed activity allows" 92 : ((*p == 1) ? "Sleep until resume is detected" : "")); 93 p = HCIDisp1("Resume_Timeout", p); 94 p = HCIDisp1("Enable_BREAK_To_Host", p); 95 p = HCIDisp1("Pulsed_HOST_WAKE", p); 96 97 ScrLog(HCI_GEN_TRACE, "--"); 98 } 99 100 /******************************************************************************* 101 ** 102 ** Function disp_sleepmode_evt 103 ** 104 ** Description Displays HCI comand complete event for VSC sleep mode. 105 ** 106 ** Returns none. 107 ** 108 *******************************************************************************/ 109 void disp_sleepmode_evt(uint8_t* p) { 110 uint8_t len = p[1], status = p[5]; 111 112 hci_trace_type = TRACE_TYPE_EVT_RX; 113 ScrLog(HCI_GEN_TRACE, "--"); 114 ScrLog(HCI_GEN_TRACE, 115 "RCVD Event from HCI. Name: HCI_Command_Complete (Hex Code: 0x0e " 116 "Param Len: %d)", 117 len); 118 119 p = HCIDisp1("Num HCI Cmd Packets", p + 2); 120 ScrLog(HCI_GEN_TRACE, "%40s : 0xfc27 (Set_Sleepmode_Param)", "Cmd Code"); 121 ScrLog(HCI_GEN_TRACE, "%40s : %d (0x%02x) %s", "Status", status, status, 122 (status == 0) ? "Success" : ""); 123 ScrLog(HCI_GEN_TRACE, "--"); 124 } 125 126 /******************************************************************************* 127 ** 128 ** Function ProtoDispBluetoothHciCmd 129 ** 130 ** Description Display a HCI command string 131 ** 132 ** Returns: 133 ** Nothing 134 ** 135 *******************************************************************************/ 136 void ProtoDispBluetoothHciCmd(NFC_HDR* p_buf) { 137 if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return; 138 uint8_t* p = (uint8_t*)(p_buf + 1) + p_buf->offset; 139 if (*(p) == 0x27 && *(p + 1) == 0xfc) // opcode sleep mode 140 { 141 disp_sleepmode(p); 142 } 143 } 144 145 /******************************************************************************* 146 ** 147 ** Function ProtoDispBluetoothHciEvt 148 ** 149 ** Description display a NCI event 150 ** 151 ** Returns: 152 ** Nothing 153 ** 154 *******************************************************************************/ 155 void ProtoDispBluetoothHciEvt(NFC_HDR* pBuffer) { 156 if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return; 157 158 uint8_t* p = (uint8_t*)(pBuffer + 1) + pBuffer->offset; 159 if (*p == 0x0e) // command complete 160 { 161 if (*(p + 1) == 4) // length 162 { 163 if (*(p + 3) == 0x27 && *(p + 4) == 0xfc) // opcode 0x27fc (sleep mode) 164 { 165 disp_sleepmode_evt(p); 166 } 167 } 168 } 169 } 170