1 /******************************************************************************
2 *
3 * Copyright (C) 1999-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
20 #include <cutils/log.h>
21 #include "android_logmsg.h"
22 #include "buildcfg.h"
23 #include "nfc_target.h"
24
25 extern uint32_t ScrProtocolTraceFlag;
26 #define MAX_NCI_PACKET_SIZE 259
27 #define BTE_LOG_BUF_SIZE 1024
28 #define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12)
29 #define MAX_LOGCAT_LINE 4096
30 #define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
31 static char log_line[MAX_LOGCAT_LINE];
32 static const char* sTable = "0123456789abcdef";
33 static bool sIsUseRaw = FALSE;
34 static void ToHex(const uint8_t* data, uint16_t len, char* hexString,
35 uint16_t hexStringSize);
36 static void dumpbin(const char* data, int size, uint32_t trace_layer,
37 uint32_t trace_type);
38 static inline void word2hex(const char* data, char** hex);
39 static inline void byte2char(const char* data, char** str);
40 static inline void byte2hex(const char* data, char** str);
41
BTDISP_LOCK_LOG()42 void BTDISP_LOCK_LOG() {}
43
BTDISP_UNLOCK_LOG()44 void BTDISP_UNLOCK_LOG() {}
45
BTDISP_INIT_LOCK()46 void BTDISP_INIT_LOCK() {}
47
BTDISP_UNINIT_LOCK()48 void BTDISP_UNINIT_LOCK() {}
49
ProtoDispAdapterUseRawOutput(bool isUseRaw)50 void ProtoDispAdapterUseRawOutput(bool isUseRaw) { sIsUseRaw = isUseRaw; }
51
ProtoDispAdapterDisplayNciPacket(uint8_t * nciPacket,uint16_t nciPacketLen,bool is_recv)52 void ProtoDispAdapterDisplayNciPacket(uint8_t* nciPacket, uint16_t nciPacketLen,
53 bool is_recv) {
54 // Protocol decoder is not available, so decode NCI packet into hex numbers.
55 if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_NCI)) return;
56 char line_buf[(MAX_NCI_PACKET_SIZE * 2) + 1];
57 ToHex(nciPacket, nciPacketLen, line_buf, sizeof(line_buf));
58 __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR" : "BrcmNciX",
59 line_buf);
60 }
61
ToHex(const uint8_t * data,uint16_t len,char * hexString,uint16_t hexStringSize)62 void ToHex(const uint8_t* data, uint16_t len, char* hexString,
63 uint16_t hexStringSize) {
64 int i = 0, j = 0;
65 for (i = 0, j = 0; i < len && j < hexStringSize - 3; i++) {
66 hexString[j++] = sTable[(*data >> 4) & 0xf];
67 hexString[j++] = sTable[*data & 0xf];
68 data++;
69 }
70 hexString[j] = '\0';
71 }
72
73 // Protodisp code calls ScrLog() to print decoded texts.
ScrLog(uint32_t trace_set_mask,const char * fmt_str,...)74 void ScrLog(uint32_t trace_set_mask, const char* fmt_str, ...) {
75 static char buffer[BTE_LOG_BUF_SIZE];
76 va_list ap;
77
78 va_start(ap, fmt_str);
79 vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
80 va_end(ap);
81 __android_log_write(ANDROID_LOG_INFO, "BrcmNci", buffer);
82 }
83
scru_dump_hex(uint8_t * p,char * pTitle,uint32_t len,uint32_t layer,uint32_t type)84 uint8_t* scru_dump_hex(uint8_t* p, char* pTitle, uint32_t len, uint32_t layer,
85 uint32_t type) {
86 if (pTitle && *pTitle) PRINT(pTitle);
87 dumpbin((char*)p, len, layer, type);
88 return p;
89 }
90
dumpbin(const char * data,int size,uint32_t trace_layer,uint32_t trace_type)91 void dumpbin(const char* data, int size, uint32_t trace_layer,
92 uint32_t trace_type) {
93 char line_buff[256];
94 char* line;
95 int i, j, addr;
96 const int width = 16;
97 if (size <= 0) return;
98 for (i = 0; i < size / width; i++) {
99 line = line_buff;
100 // write address:
101 addr = i * width;
102 word2hex((const char*)&addr, &line);
103 *line++ = ':';
104 *line++ = ' ';
105 // write hex of data
106 for (j = 0; j < width; j++) {
107 byte2hex(&data[j], &line);
108 *line++ = ' ';
109 }
110 // write char of data
111 for (j = 0; j < width; j++) byte2char(data++, &line);
112 // wirte the end of line
113 *line = 0;
114 // output the line
115 PRINT(line_buff);
116 }
117 // last line of left over if any
118 int leftover = size % width;
119 if (leftover > 0) {
120 line = line_buff;
121 // write address:
122 addr = i * width;
123 word2hex((const char*)&addr, &line);
124 *line++ = ':';
125 *line++ = ' ';
126 // write hex of data
127 for (j = 0; j < leftover; j++) {
128 byte2hex(&data[j], &line);
129 *line++ = ' ';
130 }
131 // write hex padding
132 for (; j < width; j++) {
133 *line++ = ' ';
134 *line++ = ' ';
135 *line++ = ' ';
136 }
137 // write char of data
138 for (j = 0; j < leftover; j++) byte2char(data++, &line);
139 // write the end of line
140 *line = 0;
141 // output the line
142 PRINT(line_buff);
143 }
144 }
145
word2hex(const char * data,char ** hex)146 inline void word2hex(const char* data, char** hex) {
147 byte2hex(&data[1], hex);
148 byte2hex(&data[0], hex);
149 }
150
byte2char(const char * data,char ** str)151 inline void byte2char(const char* data, char** str) {
152 **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
153 ++(*str);
154 }
155
byte2hex(const char * data,char ** str)156 inline void byte2hex(const char* data, char** str) {
157 **str = sTable[(*data >> 4) & 0xf];
158 ++*str;
159 **str = sTable[*data & 0xf];
160 ++*str;
161 }
162
163 // Decode a few Bluetooth HCI packets into hex numbers.
DispHciCmd(NFC_HDR * p_buf)164 void DispHciCmd(NFC_HDR* p_buf) {
165 uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
166 uint8_t* data = (uint8_t*)p_buf;
167 int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
168
169 if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
170
171 if (nBytes > sizeof(log_line)) return;
172
173 ToHex(data, data_len, log_line, sizeof(log_line));
174 __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
175 }
176
177 // Decode a few Bluetooth HCI packets into hex numbers.
DispHciEvt(NFC_HDR * p_buf)178 void DispHciEvt(NFC_HDR* p_buf) {
179 uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
180 uint8_t* data = (uint8_t*)p_buf;
181 int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
182
183 if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
184
185 if (nBytes > sizeof(log_line)) return;
186
187 ToHex(data, data_len, log_line, sizeof(log_line));
188 __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
189 }
190
191 /***************************************************************************
192 **
193 ** Function DispLLCP
194 **
195 ** Description Log LLCP packet as hex-ascii bytes.
196 **
197 ** Returns None.
198 **
199 ***************************************************************************/
DispLLCP(NFC_HDR * p_buf,bool is_recv)200 void DispLLCP(NFC_HDR* p_buf, bool is_recv) {
201 uint32_t nBytes = ((NFC_HDR_SIZE + p_buf->offset + p_buf->len) * 2) + 1;
202 uint8_t* data = (uint8_t*)p_buf;
203 int data_len = NFC_HDR_SIZE + p_buf->offset + p_buf->len;
204
205 if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
206
207 if (nBytes > sizeof(log_line)) return;
208
209 ToHex(data, data_len, log_line, sizeof(log_line));
210 __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR" : "BrcmLlcpX",
211 log_line);
212 }
213
214 /***************************************************************************
215 **
216 ** Function DispHcp
217 **
218 ** Description Log raw HCP packet as hex-ascii bytes
219 **
220 ** Returns None.
221 **
222 ***************************************************************************/
DispHcp(uint8_t * data,uint16_t len,bool is_recv)223 void DispHcp(uint8_t* data, uint16_t len, bool is_recv) {
224 uint32_t nBytes = (len * 2) + 1;
225
226 if (appl_trace_level < BT_TRACE_LEVEL_DEBUG) return;
227
228 // Only trace HCP if we're tracing HCI as well
229 if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY)) return;
230
231 if (nBytes > sizeof(log_line)) return;
232
233 ToHex(data, len, log_line, sizeof(log_line));
234 __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmHcpR" : "BrcmHcpX",
235 log_line);
236 }
237
DispSNEP(uint8_t local_sap,uint8_t remote_sap,NFC_HDR * p_buf,bool is_first,bool is_rx)238 void DispSNEP(uint8_t local_sap, uint8_t remote_sap, NFC_HDR* p_buf,
239 bool is_first, bool is_rx) {}
DispCHO(uint8_t * pMsg,uint32_t MsgLen,bool is_rx)240 void DispCHO(uint8_t* pMsg, uint32_t MsgLen, bool is_rx) {}
DispT3TagMessage(NFC_HDR * p_msg,bool is_rx)241 void DispT3TagMessage(NFC_HDR* p_msg, bool is_rx) {}
DispRWT4Tags(NFC_HDR * p_buf,bool is_rx)242 void DispRWT4Tags(NFC_HDR* p_buf, bool is_rx) {}
DispCET4Tags(NFC_HDR * p_buf,bool is_rx)243 void DispCET4Tags(NFC_HDR* p_buf, bool is_rx) {}
DispRWI93Tag(NFC_HDR * p_buf,bool is_rx,uint8_t command_to_respond)244 void DispRWI93Tag(NFC_HDR* p_buf, bool is_rx, uint8_t command_to_respond) {}
DispNDEFMsg(uint8_t * pMsg,uint32_t MsgLen,bool is_recv)245 void DispNDEFMsg(uint8_t* pMsg, uint32_t MsgLen, bool is_recv) {}
246
247 /*******************************************************************************
248 **
249 ** Function: LogMsg
250 **
251 ** Description: Print messages from NFC stack.
252 **
253 ** Returns: None.
254 **
255 *******************************************************************************/
LogMsg(uint32_t trace_set_mask,const char * fmt_str,...)256 void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {
257 static char buffer[BTE_LOG_BUF_SIZE];
258 va_list ap;
259 uint32_t trace_type =
260 trace_set_mask & 0x07; // lower 3 bits contain trace type
261 int android_log_type = ANDROID_LOG_INFO;
262
263 va_start(ap, fmt_str);
264 vsnprintf(buffer, BTE_LOG_MAX_SIZE, fmt_str, ap);
265 va_end(ap);
266 if (trace_type == TRACE_TYPE_ERROR) android_log_type = ANDROID_LOG_ERROR;
267 __android_log_write(android_log_type, LOGMSG_TAG_NAME, buffer);
268 }
269
LogMsg_0(uint32_t maskTraceSet,const char * p_str)270 void LogMsg_0(uint32_t maskTraceSet, const char* p_str) {
271 LogMsg(maskTraceSet, p_str);
272 }
273
LogMsg_1(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1)274 void LogMsg_1(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1) {
275 LogMsg(maskTraceSet, fmt_str, p1);
276 }
277
LogMsg_2(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1,uintptr_t p2)278 void LogMsg_2(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
279 uintptr_t p2) {
280 LogMsg(maskTraceSet, fmt_str, p1, p2);
281 }
282
LogMsg_3(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1,uintptr_t p2,uintptr_t p3)283 void LogMsg_3(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
284 uintptr_t p2, uintptr_t p3) {
285 LogMsg(maskTraceSet, fmt_str, p1, p2, p3);
286 }
287
LogMsg_4(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1,uintptr_t p2,uintptr_t p3,uintptr_t p4)288 void LogMsg_4(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
289 uintptr_t p2, uintptr_t p3, uintptr_t p4) {
290 LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4);
291 }
292
LogMsg_5(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1,uintptr_t p2,uintptr_t p3,uintptr_t p4,uintptr_t p5)293 void LogMsg_5(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
294 uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5) {
295 LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5);
296 }
297
LogMsg_6(uint32_t maskTraceSet,const char * fmt_str,uintptr_t p1,uintptr_t p2,uintptr_t p3,uintptr_t p4,uintptr_t p5,uintptr_t p6)298 void LogMsg_6(uint32_t maskTraceSet, const char* fmt_str, uintptr_t p1,
299 uintptr_t p2, uintptr_t p3, uintptr_t p4, uintptr_t p5,
300 uintptr_t p6) {
301 LogMsg(maskTraceSet, fmt_str, p1, p2, p3, p4, p5, p6);
302 }
303