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