libmain.c revision e29968cf3e053557a9c2efc5a7a42d0767c51d9d
145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/****************************************************************************
245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Name:       libmain.h
445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Function    This file contains helper functions for NFA
645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Copyright (c) 2011-2012, Broadcom Corp., All Rights Reserved.
845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**  Broadcom Bluetooth Core. Proprietary and confidential.
945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
1045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
11e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#include "OverrideLog.h"
1245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/types.h>
1345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/stat.h>
1445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <fcntl.h>
1545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <errno.h>
1645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "buildcfg.h"
1745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h"
1845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h"
1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_ci.h"
2045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "config.h"
2145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define LOG_TAG "BrcmNfcNfa"
2345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
24e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#define MAX_NCI_PACKET_SIZE  259
25e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#define MAX_LOGCAT_LINE     4096
26e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chustatic char log_line[MAX_LOGCAT_LINE];
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern UINT32 ScrProtocolTraceFlag;         // = SCR_PROTO_TRACE_ALL; // 0x017F;
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic const char* sTable = "0123456789abcdef";
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern char bcm_nfc_location[];
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_alloc
3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      allocate a buffer from platform's memory pool
3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  pointer to buffer if successful
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  NULL otherwise
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void *nfa_mem_co_alloc(UINT32 num_bytes)
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return malloc(num_bytes);
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_free
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      free buffer previously allocated using nfa_mem_co_alloc
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_mem_co_free(void *pBuffer)
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    free(pBuffer);
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_init
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is executed as a part of the start up sequence
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  to make sure the control block is initialized.
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       void.
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_init(void)
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: enter/exit ", __FUNCTION__);
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_read
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by NFA to read in data from the
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  previously opened file.
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data into.
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to read into the buffer.
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
93e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_read() is
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the buffer of data, along with the number
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        of bytes read into the buffer, and a status.  The
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been read, the end of file has been detected,
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        or an error has occurred.
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_read(UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = open (filename, O_RDONLY);
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualRead = read (fileStream, pBuffer, nbytes);
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualRead > 0)
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead);
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_OK, block);
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to read", __FUNCTION__);
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_FAIL, block);
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open", __FUNCTION__);
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_write
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by io to send file data to the
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  phone.
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data from.
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to write out to the file.
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
149e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_write() is
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the file descriptor and the status.  The
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been written, or an error has been detected,
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_write(const UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
168e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = 0;
170e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualWritten = write (fileStream, pBuffer, nbytes);
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten);
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualWritten > 0) {
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_OK);
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to write", __FUNCTION__);
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_FAIL);
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_write (NFA_NV_CO_FAIL);
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2hex
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to hexadecimal string
19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2hex(const char* data, char** str)
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[(*data >> 4) & 0xf];
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[*data & 0xf];
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2char
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to displayable text string
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2char(const char* data, char** str)
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++(*str);
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         word2hex
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Convert a two byte into text string as little-endian WORD
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void word2hex(const char* data, char** hex)
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[1], hex);
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[0], hex);
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         dumpbin
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to a blob of text string for logging
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid dumpbin(const char* data, int size, UINT32 trace_layer, UINT32 trace_type)
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char line_buff[256];
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char *line;
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int i, j, addr;
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const int width = 16;
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(size <= 0)
26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifdef __RAW_HEADER
26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //write offset
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    line = line_buff;
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(j = 0; j < width; j++)
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        byte2hex((const char*)&j, &line);
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ' ';
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line = 0;
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    PRINT(line_buff);
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(i = 0; i < size / width; i++)
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //wirte the end of line
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //last line of left over if any
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int leftover = size % width;
30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(leftover > 0)
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex padding
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(; j < width; j++)
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write the end of line
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         scru_dump_hex
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      print a text string to log
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  text string
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
34145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 *scru_dump_hex (UINT8 *p, char *pTitle, UINT32 len, UINT32 layer, UINT32 type)
34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(pTitle && *pTitle)
34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(pTitle);
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    dumpbin(p, len, layer, type);
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return p;
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciCmd
35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Display a HCI command string
35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
359e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHciCmd (BT_HDR *p_buf)
36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
361e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
362e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
363e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
364e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
368e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
369e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(log_line))
370e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
371e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
372e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
373e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
374e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[(*data >> 4) & 0xf];
375e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[*data & 0xf];
376e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        data++;
377e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
378e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    log_line[j] = '\0';
379e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
380e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciEvt
38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      display a NCI event
38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
394e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHciEvt (BT_HDR *p_buf)
39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
396e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
397e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
398e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
399e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
400e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
403e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
404e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(log_line))
405e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
406e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
407e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
408e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
409e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[(*data >> 4) & 0xf];
410e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[*data & 0xf];
411e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        data++;
412e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
413e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    log_line[j] = '\0';
414e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
415e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
41863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen/*******************************************************************************
41963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
42063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function         DispNciDump
42163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
42263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description      Log raw NCI packet as hex-ascii bytes
42363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
42463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns          None.
42563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
42663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen*******************************************************************************/
42763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid DispNciDump (UINT8 *data, UINT16 len, BOOLEAN is_recv)
42863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen{
429e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (appl_trace_level < BT_TRACE_LEVEL_DEBUG)
430e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
431e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
43263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    char line_buf[(MAX_NCI_PACKET_SIZE*2)+1];
43363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    int i,j;
43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
43563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
43663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
43763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[(*data >> 4) & 0xf];
43863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[*data & 0xf];
43963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        data++;
44063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
44163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    line_buf[j] = '\0';
442e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
44363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR": "BrcmNciX", line_buf);
44463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen}
445e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
446e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
447e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu/*******************************************************************************
448e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
449e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Function         DispLLCP
450e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
451e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      Log raw LLCP packet as hex-ascii bytes
452e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
453e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Returns          None.
454e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
455e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu*******************************************************************************/
456e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispLLCP (BT_HDR *p_buf, BOOLEAN is_recv)
457e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu{
458e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
459e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
460e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
461e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
462e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
463e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for (i = 0; i < data_len; )
464e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
465e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        for(j = 0; i < data_len && j < sizeof(log_line)-3; i++)
466e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        {
467e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            log_line[j++] = sTable[(*data >> 4) & 0xf];
468e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            log_line[j++] = sTable[*data & 0xf];
469e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            data++;
470e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        }
471e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j] = '\0';
472e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR": "BrcmLlcpX", log_line);
473e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
474e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu}
475e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
476e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
477e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu/*******************************************************************************
478e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
479e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Function         DispHcp
480e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
481e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      Log raw HCP packet as hex-ascii bytes
482e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
483e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Returns          None.
484e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
485e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu*******************************************************************************/
486e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHcp (UINT8 *data, UINT16 len, BOOLEAN is_recv)
487e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu{
488e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
489e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = (len*2)+1;
490e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    char line_buf[400];
491e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
492e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(line_buf))
493e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
494e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
495e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
496e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
497e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        line_buf[j++] = sTable[(*data >> 4) & 0xf];
498e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        line_buf[j++] = sTable[*data & 0xf];
499e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        data++;
500e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
501e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    line_buf[j] = '\0';
502e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
503e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmHcpR": "BrcmHcpX", line_buf);
504e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu}
505e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
506e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispSNEP (UINT8 local_sap, UINT8 remote_sap, BT_HDR *p_buf, BOOLEAN is_first, BOOLEAN is_rx) {}
507e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispCHO (UINT8 *pMsg, UINT32 MsgLen, BOOLEAN is_rx) {}
508e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispT3TagMessage(BT_HDR *p_msg, BOOLEAN is_rx) {}
509e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispRWT4Tags (BT_HDR *p_buf, BOOLEAN is_rx) {}
510e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispCET4Tags (BT_HDR *p_buf, BOOLEAN is_rx) {}
511e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispRWI93Tag (BT_HDR *p_buf, BOOLEAN is_rx, UINT8 command_to_respond) {}
512e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispNDEFMsg (UINT8 *pMsg, UINT32 MsgLen, BOOLEAN is_recv) {}
513