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