• 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 <sys/types.h>
20 #include <sys/stat.h>
21 #include <fcntl.h>
22 #include <errno.h>
23 #include "buildcfg.h"
24 #include "nfa_mem_co.h"
25 #include "nfa_nv_co.h"
26 #include "nfa_nv_ci.h"
27 #include "config.h"
28 
29 #define LOG_TAG "BrcmNfcNfa"
30 #define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
31 #define MAX_NCI_PACKET_SIZE  259
32 #define MAX_LOGCAT_LINE     4096
33 static char log_line[MAX_LOGCAT_LINE];
34 
35 extern UINT32 ScrProtocolTraceFlag;         // = SCR_PROTO_TRACE_ALL; // 0x017F;
36 static const char* sTable = "0123456789abcdef";
37 extern char bcm_nfc_location[];
38 
39 /*******************************************************************************
40 **
41 ** Function         nfa_mem_co_alloc
42 **
43 ** Description      allocate a buffer from platform's memory pool
44 **
45 ** Returns:
46 **                  pointer to buffer if successful
47 **                  NULL otherwise
48 **
49 *******************************************************************************/
nfa_mem_co_alloc(UINT32 num_bytes)50 NFC_API extern void *nfa_mem_co_alloc(UINT32 num_bytes)
51 {
52     return malloc(num_bytes);
53 }
54 
55 
56 /*******************************************************************************
57 **
58 ** Function         nfa_mem_co_free
59 **
60 ** Description      free buffer previously allocated using nfa_mem_co_alloc
61 **
62 ** Returns:
63 **                  Nothing
64 **
65 *******************************************************************************/
nfa_mem_co_free(void * pBuffer)66 NFC_API extern void nfa_mem_co_free(void *pBuffer)
67 {
68     free(pBuffer);
69 }
70 
71 
72 /*******************************************************************************
73 **
74 ** Function         nfa_nv_co_read
75 **
76 ** Description      This function is called by NFA to read in data from the
77 **                  previously opened file.
78 **
79 ** Parameters       pBuffer   - buffer to read the data into.
80 **                  nbytes  - number of bytes to read into the buffer.
81 **
82 ** Returns          void
83 **
84 **                  Note: Upon completion of the request, nfa_nv_ci_read() is
85 **                        called with the buffer of data, along with the number
86 **                        of bytes read into the buffer, and a status.  The
87 **                        call-in function should only be called when ALL requested
88 **                        bytes have been read, the end of file has been detected,
89 **                        or an error has occurred.
90 **
91 *******************************************************************************/
nfa_nv_co_read(UINT8 * pBuffer,UINT16 nbytes,UINT8 block)92 NFC_API extern void nfa_nv_co_read(UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
93 {
94     char filename[256], filename2[256];
95     strcpy(filename2, bcm_nfc_location);
96     strcat(filename2, "/nfaStorage.bin");
97     if (strlen(filename2) > 200)
98     {
99         ALOGE ("%s: filename too long", __FUNCTION__);
100         return;
101     }
102     sprintf (filename, "%s%u", filename2, block);
103 
104     ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
105     int fileStream = open (filename, O_RDONLY);
106     if (fileStream > 0)
107     {
108         size_t actualRead = read (fileStream, pBuffer, nbytes);
109         if (actualRead > 0)
110         {
111             ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead);
112             nfa_nv_ci_read (actualRead, NFA_NV_CO_OK, block);
113         }
114         else
115         {
116             ALOGE ("%s: fail to read", __FUNCTION__);
117             nfa_nv_ci_read (actualRead, NFA_NV_CO_FAIL, block);
118         }
119         close (fileStream);
120     }
121     else
122     {
123         ALOGE ("%s: fail to open", __FUNCTION__);
124         nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
125     }
126 }
127 
128 /*******************************************************************************
129 **
130 ** Function         nfa_nv_co_write
131 **
132 ** Description      This function is called by io to send file data to the
133 **                  phone.
134 **
135 ** Parameters       pBuffer   - buffer to read the data from.
136 **                  nbytes  - number of bytes to write out to the file.
137 **
138 ** Returns          void
139 **
140 **                  Note: Upon completion of the request, nfa_nv_ci_write() is
141 **                        called with the file descriptor and the status.  The
142 **                        call-in function should only be called when ALL requested
143 **                        bytes have been written, or an error has been detected,
144 **
145 *******************************************************************************/
nfa_nv_co_write(const UINT8 * pBuffer,UINT16 nbytes,UINT8 block)146 NFC_API extern void nfa_nv_co_write(const UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
147 {
148     char filename[256], filename2[256];
149     strcpy(filename2, bcm_nfc_location);
150     strcat(filename2, "/nfaStorage.bin");
151     if (strlen(filename2) > 200)
152     {
153         ALOGE ("%s: filename too long", __FUNCTION__);
154         return;
155     }
156     sprintf (filename, "%s%u", filename2, block);
157     ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
158 
159     int fileStream = 0;
160 
161     fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
162     if (fileStream > 0)
163     {
164         size_t actualWritten = write (fileStream, pBuffer, nbytes);
165         ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten);
166         if (actualWritten > 0) {
167             nfa_nv_ci_write (NFA_NV_CO_OK);
168         }
169         else
170         {
171             ALOGE ("%s: fail to write", __FUNCTION__);
172             nfa_nv_ci_write (NFA_NV_CO_FAIL);
173         }
174         close (fileStream);
175     }
176     else
177     {
178         ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
179         nfa_nv_ci_write (NFA_NV_CO_FAIL);
180     }
181 }
182 
183 /*******************************************************************************
184 **
185 ** Function         byte2hex
186 **
187 ** Description      convert a byte array to hexadecimal string
188 **
189 ** Returns:
190 **                  Nothing
191 **
192 *******************************************************************************/
byte2hex(const char * data,char ** str)193 static inline void byte2hex(const char* data, char** str)
194 {
195     **str = sTable[(*data >> 4) & 0xf];
196     ++*str;
197     **str = sTable[*data & 0xf];
198     ++*str;
199 }
200 
201 /*******************************************************************************
202 **
203 ** Function         byte2char
204 **
205 ** Description      convert a byte array to displayable text string
206 **
207 ** Returns:
208 **                  Nothing
209 **
210 *******************************************************************************/
byte2char(const char * data,char ** str)211 static inline void byte2char(const char* data, char** str)
212 {
213     **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
214     ++(*str);
215 }
216 
217 /*******************************************************************************
218 **
219 ** Function         word2hex
220 **
221 ** Description      Convert a two byte into text string as little-endian WORD
222 **
223 ** Returns:
224 **                  Nothing
225 **
226 *******************************************************************************/
word2hex(const char * data,char ** hex)227 static inline void word2hex(const char* data, char** hex)
228 {
229     byte2hex(&data[1], hex);
230     byte2hex(&data[0], hex);
231 }
232 
233 /*******************************************************************************
234 **
235 ** Function         dumpbin
236 **
237 ** Description      convert a byte array to a blob of text string for logging
238 **
239 ** Returns:
240 **                  Nothing
241 **
242 *******************************************************************************/
dumpbin(const char * data,int size,UINT32 trace_layer,UINT32 trace_type)243 void dumpbin(const char* data, int size, UINT32 trace_layer, UINT32 trace_type)
244 {
245     char line_buff[256];
246     char *line;
247     int i, j, addr;
248     const int width = 16;
249     if(size <= 0)
250         return;
251 #ifdef __RAW_HEADER
252     //write offset
253     line = line_buff;
254     *line++ = ' ';
255     *line++ = ' ';
256     *line++ = ' ';
257     *line++ = ' ';
258     *line++ = ' ';
259     *line++ = ' ';
260     for(j = 0; j < width; j++)
261     {
262         byte2hex((const char*)&j, &line);
263         *line++ = ' ';
264     }
265     *line = 0;
266     PRINT(line_buff);
267 #endif
268     for(i = 0; i < size / width; i++)
269     {
270         line = line_buff;
271         //write address:
272         addr = i*width;
273         word2hex((const char*)&addr, &line);
274         *line++ = ':'; *line++ = ' ';
275         //write hex of data
276         for(j = 0; j < width; j++)
277         {
278             byte2hex(&data[j], &line);
279             *line++ = ' ';
280         }
281         //write char of data
282         for(j = 0; j < width; j++)
283             byte2char(data++, &line);
284         //wirte the end of line
285         *line = 0;
286         //output the line
287         PRINT(line_buff);
288     }
289     //last line of left over if any
290     int leftover = size % width;
291     if(leftover > 0)
292     {
293         line = line_buff;
294         //write address:
295         addr = i*width;
296         word2hex((const char*)&addr, &line);
297         *line++ = ':'; *line++ = ' ';
298         //write hex of data
299         for(j = 0; j < leftover; j++)
300         {
301             byte2hex(&data[j], &line);
302             *line++ = ' ';
303         }
304         //write hex padding
305         for(; j < width; j++)
306         {
307             *line++ = ' ';
308             *line++ = ' ';
309             *line++ = ' ';
310         }
311         //write char of data
312         for(j = 0; j < leftover; j++)
313             byte2char(data++, &line);
314         //write the end of line
315         *line = 0;
316         //output the line
317         PRINT(line_buff);
318     }
319 }
320 
321 /*******************************************************************************
322 **
323 ** Function         scru_dump_hex
324 **
325 ** Description      print a text string to log
326 **
327 ** Returns:
328 **                  text string
329 **
330 *******************************************************************************/
scru_dump_hex(UINT8 * p,char * pTitle,UINT32 len,UINT32 layer,UINT32 type)331 UINT8 *scru_dump_hex (UINT8 *p, char *pTitle, UINT32 len, UINT32 layer, UINT32 type)
332 {
333     if(pTitle && *pTitle)
334         PRINT(pTitle);
335     dumpbin(p, len, layer, type);
336     return p;
337 }
338 
339 /*******************************************************************************
340 **
341 ** Function         DispHciCmd
342 **
343 ** Description      Display a HCI command string
344 **
345 ** Returns:
346 **                  Nothing
347 **
348 *******************************************************************************/
DispHciCmd(BT_HDR * p_buf)349 void DispHciCmd (BT_HDR *p_buf)
350 {
351     int i,j;
352     int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
353     UINT8 * data = (UINT8*) p_buf;
354     int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
355 
356     if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
357         return;
358 
359     if (nBytes > sizeof(log_line))
360         return;
361 
362     for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
363     {
364         log_line[j++] = sTable[(*data >> 4) & 0xf];
365         log_line[j++] = sTable[*data & 0xf];
366         data++;
367     }
368     log_line[j] = '\0';
369 
370     __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
371 }
372 
373 
374 /*******************************************************************************
375 **
376 ** Function         DispHciEvt
377 **
378 ** Description      display a NCI event
379 **
380 ** Returns:
381 **                  Nothing
382 **
383 *******************************************************************************/
DispHciEvt(BT_HDR * p_buf)384 void DispHciEvt (BT_HDR *p_buf)
385 {
386     int i,j;
387     int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
388     UINT8 * data = (UINT8*) p_buf;
389     int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
390 
391     if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
392         return;
393 
394     if (nBytes > sizeof(log_line))
395         return;
396 
397     for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
398     {
399         log_line[j++] = sTable[(*data >> 4) & 0xf];
400         log_line[j++] = sTable[*data & 0xf];
401         data++;
402     }
403     log_line[j] = '\0';
404 
405     __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
406 }
407 
408 /*******************************************************************************
409 **
410 ** Function         DispNciDump
411 **
412 ** Description      Log raw NCI packet as hex-ascii bytes
413 **
414 ** Returns          None.
415 **
416 *******************************************************************************/
DispNciDump(UINT8 * data,UINT16 len,BOOLEAN is_recv)417 void DispNciDump (UINT8 *data, UINT16 len, BOOLEAN is_recv)
418 {
419     if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_NCI))
420         return;
421 
422     char line_buf[(MAX_NCI_PACKET_SIZE*2)+1];
423     int i,j;
424 
425     for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
426     {
427         line_buf[j++] = sTable[(*data >> 4) & 0xf];
428         line_buf[j++] = sTable[*data & 0xf];
429         data++;
430     }
431     line_buf[j] = '\0';
432 
433     __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR": "BrcmNciX", line_buf);
434 }
435 
436 
437 /*******************************************************************************
438 **
439 ** Function         DispLLCP
440 **
441 ** Description      Log raw LLCP packet as hex-ascii bytes
442 **
443 ** Returns          None.
444 **
445 *******************************************************************************/
DispLLCP(BT_HDR * p_buf,BOOLEAN is_recv)446 void DispLLCP (BT_HDR *p_buf, BOOLEAN is_recv)
447 {
448     int i,j;
449     int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
450     UINT8 * data = (UINT8*) p_buf;
451     int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
452 
453     if (appl_trace_level < BT_TRACE_LEVEL_DEBUG)
454         return;
455 
456     for (i = 0; i < data_len; )
457     {
458         for(j = 0; i < data_len && j < sizeof(log_line)-3; i++)
459         {
460             log_line[j++] = sTable[(*data >> 4) & 0xf];
461             log_line[j++] = sTable[*data & 0xf];
462             data++;
463         }
464         log_line[j] = '\0';
465         __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR": "BrcmLlcpX", log_line);
466     }
467 }
468 
469 
470 /*******************************************************************************
471 **
472 ** Function         DispHcp
473 **
474 ** Description      Log raw HCP packet as hex-ascii bytes
475 **
476 ** Returns          None.
477 **
478 *******************************************************************************/
DispHcp(UINT8 * data,UINT16 len,BOOLEAN is_recv)479 void DispHcp (UINT8 *data, UINT16 len, BOOLEAN is_recv)
480 {
481     int i,j;
482     int nBytes = (len*2)+1;
483     char line_buf[400];
484 
485     if (appl_trace_level < BT_TRACE_LEVEL_DEBUG)
486         return;
487 
488     if (nBytes > sizeof(line_buf))
489         return;
490 
491     // Only trace HCP if we're tracing HCI as well
492     if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
493         return;
494 
495     for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
496     {
497         line_buf[j++] = sTable[(*data >> 4) & 0xf];
498         line_buf[j++] = sTable[*data & 0xf];
499         data++;
500     }
501     line_buf[j] = '\0';
502 
503     __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmHcpR": "BrcmHcpX", line_buf);
504 }
505 
DispSNEP(UINT8 local_sap,UINT8 remote_sap,BT_HDR * p_buf,BOOLEAN is_first,BOOLEAN is_rx)506 void DispSNEP (UINT8 local_sap, UINT8 remote_sap, BT_HDR *p_buf, BOOLEAN is_first, BOOLEAN is_rx) {}
DispCHO(UINT8 * pMsg,UINT32 MsgLen,BOOLEAN is_rx)507 void DispCHO (UINT8 *pMsg, UINT32 MsgLen, BOOLEAN is_rx) {}
DispT3TagMessage(BT_HDR * p_msg,BOOLEAN is_rx)508 void DispT3TagMessage(BT_HDR *p_msg, BOOLEAN is_rx) {}
DispRWT4Tags(BT_HDR * p_buf,BOOLEAN is_rx)509 void DispRWT4Tags (BT_HDR *p_buf, BOOLEAN is_rx) {}
DispCET4Tags(BT_HDR * p_buf,BOOLEAN is_rx)510 void DispCET4Tags (BT_HDR *p_buf, BOOLEAN is_rx) {}
DispRWI93Tag(BT_HDR * p_buf,BOOLEAN is_rx,UINT8 command_to_respond)511 void DispRWI93Tag (BT_HDR *p_buf, BOOLEAN is_rx, UINT8 command_to_respond) {}
DispNDEFMsg(UINT8 * pMsg,UINT32 MsgLen,BOOLEAN is_recv)512 void DispNDEFMsg (UINT8 *pMsg, UINT32 MsgLen, BOOLEAN is_recv) {}
513