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