1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 2011-2012 Broadcom Corporation
4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#include "OverrideLog.h"
1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/types.h>
2045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/stat.h>
2145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <fcntl.h>
2245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <errno.h>
2345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "buildcfg.h"
2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h"
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h"
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_ci.h"
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "config.h"
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define LOG_TAG "BrcmNfcNfa"
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define PRINT(s) __android_log_write(ANDROID_LOG_DEBUG, "BrcmNci", s)
31e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#define MAX_NCI_PACKET_SIZE  259
32e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#define MAX_LOGCAT_LINE     4096
33e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chustatic char log_line[MAX_LOGCAT_LINE];
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern UINT32 ScrProtocolTraceFlag;         // = SCR_PROTO_TRACE_ALL; // 0x017F;
3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic const char* sTable = "0123456789abcdef";
3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern char bcm_nfc_location[];
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_alloc
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      allocate a buffer from platform's memory pool
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  pointer to buffer if successful
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  NULL otherwise
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void *nfa_mem_co_alloc(UINT32 num_bytes)
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return malloc(num_bytes);
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_free
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      free buffer previously allocated using nfa_mem_co_alloc
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_mem_co_free(void *pBuffer)
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    free(pBuffer);
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_read
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by NFA to read in data from the
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  previously opened file.
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data into.
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to read into the buffer.
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
83e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_read() is
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the buffer of data, along with the number
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        of bytes read into the buffer, and a status.  The
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been read, the end of file has been detected,
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        or an error has occurred.
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_read(UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = open (filename, O_RDONLY);
10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualRead = read (fileStream, pBuffer, nbytes);
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualRead > 0)
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead);
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_OK, block);
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to read", __FUNCTION__);
11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_FAIL, block);
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open", __FUNCTION__);
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_write
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by io to send file data to the
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  phone.
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data from.
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to write out to the file.
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
139e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_write() is
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the file descriptor and the status.  The
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been written, or an error has been detected,
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_write(const UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
158e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = 0;
160e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualWritten = write (fileStream, pBuffer, nbytes);
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten);
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualWritten > 0) {
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_OK);
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to write", __FUNCTION__);
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_FAIL);
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_write (NFA_NV_CO_FAIL);
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2hex
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to hexadecimal string
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2hex(const char* data, char** str)
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[(*data >> 4) & 0xf];
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[*data & 0xf];
19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2char
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to displayable text string
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2char(const char* data, char** str)
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++(*str);
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         word2hex
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Convert a two byte into text string as little-endian WORD
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void word2hex(const char* data, char** hex)
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[1], hex);
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[0], hex);
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         dumpbin
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to a blob of text string for logging
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid dumpbin(const char* data, int size, UINT32 trace_layer, UINT32 trace_type)
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char line_buff[256];
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char *line;
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int i, j, addr;
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const int width = 16;
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(size <= 0)
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifdef __RAW_HEADER
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //write offset
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    line = line_buff;
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(j = 0; j < width; j++)
26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        byte2hex((const char*)&j, &line);
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ' ';
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line = 0;
26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    PRINT(line_buff);
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(i = 0; i < size / width; i++)
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //wirte the end of line
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //last line of left over if any
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int leftover = size % width;
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(leftover > 0)
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex padding
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(; j < width; j++)
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write the end of line
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         scru_dump_hex
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      print a text string to log
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  text string
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 *scru_dump_hex (UINT8 *p, char *pTitle, UINT32 len, UINT32 layer, UINT32 type)
33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(pTitle && *pTitle)
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(pTitle);
33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    dumpbin(p, len, layer, type);
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return p;
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciCmd
34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Display a HCI command string
34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
349e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHciCmd (BT_HDR *p_buf)
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
351e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
352e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
353e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
354e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
358e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
359e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(log_line))
360e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
361e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
362e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
363e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
364e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[(*data >> 4) & 0xf];
365e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[*data & 0xf];
366e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        data++;
367e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
368e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    log_line[j] = '\0';
369e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
370e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciX", log_line);
37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciEvt
37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      display a NCI event
37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
384e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHciEvt (BT_HDR *p_buf)
38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
386e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
387e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
388e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
389e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
390e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
393e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
394e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(log_line))
395e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
396e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
397e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for(i = 0, j = 0; i < data_len && j < sizeof(log_line)-3; i++)
398e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
399e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[(*data >> 4) & 0xf];
400e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j++] = sTable[*data & 0xf];
401e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        data++;
402e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
403e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    log_line[j] = '\0';
404e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
405e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    __android_log_write(ANDROID_LOG_DEBUG, "BrcmHciR", log_line);
40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen/*******************************************************************************
40963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
41063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function         DispNciDump
41163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
41263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description      Log raw NCI packet as hex-ascii bytes
41363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
41463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns          None.
41563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
41663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen*******************************************************************************/
41763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid DispNciDump (UINT8 *data, UINT16 len, BOOLEAN is_recv)
41863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen{
41942d73cd99ecb8ad8d1108017be383d871b288605Martijn Coenen    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_NCI))
420e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
421e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
42263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    char line_buf[(MAX_NCI_PACKET_SIZE*2)+1];
42363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    int i,j;
42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
42563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
42663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
42763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[(*data >> 4) & 0xf];
42863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[*data & 0xf];
42963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        data++;
43063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
43163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    line_buf[j] = '\0';
432e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
43363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR": "BrcmNciX", line_buf);
43463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen}
435e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
436e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
437e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu/*******************************************************************************
438e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
439e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Function         DispLLCP
440e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
441e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      Log raw LLCP packet as hex-ascii bytes
442e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
443e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Returns          None.
444e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
445e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu*******************************************************************************/
446e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispLLCP (BT_HDR *p_buf, BOOLEAN is_recv)
447e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu{
448e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
449e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = ((BT_HDR_SIZE + p_buf->offset + p_buf->len)*2)+1;
450e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    UINT8 * data = (UINT8*) p_buf;
451e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int data_len = BT_HDR_SIZE + p_buf->offset + p_buf->len;
452e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
4536a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu    if (appl_trace_level < BT_TRACE_LEVEL_DEBUG)
4546a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu        return;
4556a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu
456e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    for (i = 0; i < data_len; )
457e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    {
458e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        for(j = 0; i < data_len && j < sizeof(log_line)-3; i++)
459e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        {
460e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            log_line[j++] = sTable[(*data >> 4) & 0xf];
461e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            log_line[j++] = sTable[*data & 0xf];
462e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu            data++;
463e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        }
464e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        log_line[j] = '\0';
465e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmLlcpR": "BrcmLlcpX", log_line);
466e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
467e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu}
468e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
469e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
470e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu/*******************************************************************************
471e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
472e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Function         DispHcp
473e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
474e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      Log raw HCP packet as hex-ascii bytes
475e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
476e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Returns          None.
477e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
478e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu*******************************************************************************/
479e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chuvoid DispHcp (UINT8 *data, UINT16 len, BOOLEAN is_recv)
480e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu{
481e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int i,j;
482e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    int nBytes = (len*2)+1;
483e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    char line_buf[400];
484e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
4856a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu    if (appl_trace_level < BT_TRACE_LEVEL_DEBUG)
4866a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu        return;
4876a36486bba856b2ea2783c88f47e262c131a68fbEvan Chu
488e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if (nBytes > sizeof(line_buf))
489e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        return;
490e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
49142d73cd99ecb8ad8d1108017be383d871b288605Martijn Coenen    // Only trace HCP if we're tracing HCI as well
49242d73cd99ecb8ad8d1108017be383d871b288605Martijn Coenen    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
49342d73cd99ecb8ad8d1108017be383d871b288605Martijn Coenen        return;
49442d73cd99ecb8ad8d1108017be383d871b288605Martijn Coenen
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