libmain.c revision 63f80ce896f0f8c203191b4e44e038fecb6be02a
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*****************************************************************************/
1145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/types.h>
1245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <sys/stat.h>
1345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <fcntl.h>
1445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <errno.h>
1545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "buildcfg.h"
1645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_mem_co.h"
1745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_co.h"
1845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfa_nv_ci.h"
1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <cutils/log.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)
2463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen#define MAX_NCI_PACKET_SIZE  259
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern UINT32 ScrProtocolTraceFlag;         // = SCR_PROTO_TRACE_ALL; // 0x017F;
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic const char* sTable = "0123456789abcdef";
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern char bcm_nfc_location[];
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_alloc
3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      allocate a buffer from platform's memory pool
3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  pointer to buffer if successful
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  NULL otherwise
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void *nfa_mem_co_alloc(UINT32 num_bytes)
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return malloc(num_bytes);
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_mem_co_free
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      free buffer previously allocated using nfa_mem_co_alloc
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_mem_co_free(void *pBuffer)
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    free(pBuffer);
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_init
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is executed as a part of the start up sequence
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  to make sure the control block is initialized.
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       void.
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_init(void)
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: enter/exit ", __FUNCTION__);
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_read
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by NFA to read in data from the
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  previously opened file.
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data into.
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to read into the buffer.
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_read() is
9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the buffer of data, along with the number
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        of bytes read into the buffer, and a status.  The
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been read, the end of file has been detected,
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        or an error has occurred.
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_read(UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = open (filename, O_RDONLY);
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualRead = read (fileStream, pBuffer, nbytes);
11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualRead > 0)
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead);
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_OK, block);
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to read", __FUNCTION__);
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_read (actualRead, NFA_NV_CO_FAIL, block);
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open", __FUNCTION__);
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         nfa_nv_co_write
13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function is called by io to send file data to the
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  phone.
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Parameters       pBuffer   - buffer to read the data from.
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  nbytes  - number of bytes to write out to the file.
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          void
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Note: Upon completion of the request, nfa_nv_ci_write() is
14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        called with the file descriptor and the status.  The
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        call-in function should only be called when ALL requested
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                        bytes have been written, or an error has been detected,
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNFC_API extern void nfa_nv_co_write(const UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char filename[256], filename2[256];
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcpy(filename2, bcm_nfc_location);
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    strcat(filename2, "/nfaStorage.bin");
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (strlen(filename2) > 200)
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    sprintf (filename, "%s%u", filename2, block);
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int fileStream = 0;
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (fileStream > 0)
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        size_t actualWritten = write (fileStream, pBuffer, nbytes);
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten);
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (actualWritten > 0) {
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_OK);
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ALOGE ("%s: fail to write", __FUNCTION__);
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfa_nv_ci_write (NFA_NV_CO_FAIL);
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        close (fileStream);
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfa_nv_ci_write (NFA_NV_CO_FAIL);
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2hex
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to hexadecimal string
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
19945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2hex(const char* data, char** str)
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[(*data >> 4) & 0xf];
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = sTable[*data & 0xf];
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++*str;
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         byte2char
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to displayable text string
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void byte2char(const char* data, char** str)
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data;
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ++(*str);
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         word2hex
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Convert a two byte into text string as little-endian WORD
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic inline void word2hex(const char* data, char** hex)
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[1], hex);
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    byte2hex(&data[0], hex);
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         dumpbin
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      convert a byte array to a blob of text string for logging
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid dumpbin(const char* data, int size, UINT32 trace_layer, UINT32 trace_type)
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char line_buff[256];
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char *line;
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int i, j, addr;
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const int width = 16;
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(size <= 0)
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#ifdef __RAW_HEADER
26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //write offset
26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    line = line_buff;
26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line++ = ' ';
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(j = 0; j < width; j++)
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        byte2hex((const char*)&j, &line);
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ' ';
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    *line = 0;
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    PRINT(line_buff);
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for(i = 0; i < size / width; i++)
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < width; j++)
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //wirte the end of line
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    //last line of left over if any
29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int leftover = size % width;
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(leftover > 0)
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        line = line_buff;
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write address:
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        addr = i*width;
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        word2hex((const char*)&addr, &line);
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line++ = ':'; *line++ = ' ';
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex of data
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2hex(&data[j], &line);
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write hex padding
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(; j < width; j++)
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            *line++ = ' ';
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write char of data
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        for(j = 0; j < leftover; j++)
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            byte2char(data++, &line);
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //write the end of line
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *line = 0;
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        //output the line
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(line_buff);
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         scru_dump_hex
33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      print a text string to log
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  text string
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT8 *scru_dump_hex (UINT8 *p, char *pTitle, UINT32 len, UINT32 layer, UINT32 type)
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(pTitle && *pTitle)
34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        PRINT(pTitle);
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    dumpbin(p, len, layer, type);
34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return p;
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciCmd
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Display a HCI command string
35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid DispHciCmd (BT_HDR *pBuffer)
35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8   *p = (UINT8 *)(pBuffer + 1) + pBuffer->offset;
36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         DispHciEvt
36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      display a NCI event
37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:
37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  Nothing
37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid DispHciEvt (BT_HDR *pBuffer)
37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!(ScrProtocolTraceFlag & SCR_PROTO_TRACE_HCI_SUMMARY))
37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
38263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen/*******************************************************************************
38363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
38463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function         DispNciDump
38563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
38663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description      Log raw NCI packet as hex-ascii bytes
38763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
38863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns          None.
38963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
39063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen*******************************************************************************/
39163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid DispNciDump (UINT8 *data, UINT16 len, BOOLEAN is_recv)
39263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen{
39363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    char line_buf[(MAX_NCI_PACKET_SIZE*2)+1];
39463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    int i,j;
39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
39663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    for(i = 0, j = 0; i < len && j < sizeof(line_buf)-3; i++)
39763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
39863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[(*data >> 4) & 0xf];
39963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        line_buf[j++] = sTable[*data & 0xf];
40063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        data++;
40163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
40263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    line_buf[j] = '\0';
40363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
40463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    __android_log_write(ANDROID_LOG_DEBUG, (is_recv) ? "BrcmNciR": "BrcmNciX", line_buf);
40563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen}
406