1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /** 18 * \file phOsalNfc.c 19 * \brief OSAL Implementation for linux 20 * 21 * Project: Trusted NFC Linux Light 22 * 23 * $Date: 03 aug 2009 24 * $Author: Jrmie Corbier 25 * $Revision: 1.0 26 * 27 */ 28 29 #include <stddef.h> 30 #include <stdlib.h> 31 #include <stdio.h> 32 #include <signal.h> 33 #include <unistd.h> 34 35 #include <phOsalNfc.h> 36 37 #ifdef ANDROID 38 #define LOG_TAG "NFC-HCI" 39 40 #include <utils/Log.h> 41 42 phOsalNfc_Exception_t phOsalNfc_Exception; 43 #endif 44 45 #ifdef DEBUG 46 #define MAX_PRINT_BUFSIZE (0x450U) 47 char phOsalNfc_DbgTraceBuffer[MAX_PRINT_BUFSIZE]; 48 #endif 49 50 /*! 51 * \brief Allocates memory. 52 * This function attempts to allocate \a size bytes on the heap and 53 * returns a pointer to the allocated block. 54 * 55 * \param size size of the memory block to be allocated on the heap. 56 * 57 * \return pointer to allocated memory block or NULL in case of error. 58 */ 59 void *phOsalNfc_GetMemory(uint32_t size) 60 { 61 void *pMem = (void *)malloc(size); 62 return pMem; 63 } 64 65 /*! 66 * \brief Frees allocated memory block. 67 * This function deallocates memory region pointed to by \a pMem. 68 * 69 * \param pMem pointer to memory block to be freed. 70 */ 71 void phOsalNfc_FreeMemory(void *pMem) 72 { 73 if(NULL != pMem) 74 free(pMem); 75 } 76 77 void phOsalNfc_DbgString(const char *pString) 78 { 79 #ifdef DEBUG 80 if(pString != NULL) 81 #ifndef ANDROID 82 printf(pString); 83 #else 84 LOGD("%s", pString); 85 #endif 86 #endif 87 } 88 89 void phOsalNfc_DbgTrace(uint8_t data[], uint32_t size) 90 { 91 #ifdef DEBUG 92 uint32_t i; 93 #ifdef ANDROID 94 char buf[10]; 95 #endif 96 97 if(size == 0) 98 return; 99 100 #ifndef ANDROID 101 for(i = 0; i < size; i++) 102 { 103 if((i % 10) == 0) 104 printf("\n\t\t\t"); 105 printf("%02X ", data[i]); 106 } 107 printf("\n\tBlock size is: %d\n", size); 108 #else 109 phOsalNfc_DbgTraceBuffer[0] = '\0'; 110 for(i = 0; i < size; i++) 111 { 112 if((i % 10) == 0) 113 { 114 LOGD("%s", phOsalNfc_DbgTraceBuffer); 115 phOsalNfc_DbgTraceBuffer[0] = '\0'; 116 } 117 118 snprintf(buf, 10, "%02X ", data[i]); 119 strncat(phOsalNfc_DbgTraceBuffer, buf, 10); 120 } 121 LOGD("%s", phOsalNfc_DbgTraceBuffer); 122 LOGD("Block size is: %d", size); 123 #endif 124 #endif 125 } 126 127 /*! 128 * \brief Raises exception. 129 * This function raises an exception of type \a eExceptionType with 130 * reason \a reason to stack clients. 131 * 132 * \param eExceptionType exception type. 133 * \param reason reason for this exception. 134 * 135 * \note Clients willing to catch exceptions are to handle the SIGABRT signal. 136 * On Linux, exception type and reason are passed to the signal handler as 137 * a pointer to a phOsalNfc_Exception_t structure. 138 * As sigqueue is not available in Android, exception information are 139 * stored in the phOsalNfc_Exception global. 140 */ 141 void phOsalNfc_RaiseException(phOsalNfc_ExceptionType_t eExceptionType, uint16_t reason) 142 { 143 LOGD("phOsalNfc_RaiseException() called"); 144 145 if(eExceptionType == phOsalNfc_e_UnrecovFirmwareErr) 146 { 147 LOGE("HCI Timeout - Exception raised"); 148 LOGE("Force restart of NFC Service"); 149 abort(); 150 } 151 } 152 153