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