1/****************************************************************************** 2 * 3 * Copyright 2018 NXP 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18#define LOG_TAG "NxpEseHal" 19#include <log/log.h> 20 21#include <errno.h> 22#include <fcntl.h> 23#include <stdlib.h> 24#include <sys/ioctl.h> 25#include <unistd.h> 26 27#include <ese_config.h> 28#include <phEseStatus.h> 29#include <phNxpEsePal_spi.h> 30#include <string.h> 31 32extern bool ese_debug_enabled; 33 34/*! 35 * \brief Normal mode header length 36 */ 37#define NORMAL_MODE_HEADER_LEN 3 38/*! 39 * \brief Normal mode header offset 40 */ 41#define NORMAL_MODE_LEN_OFFSET 2 42/*! 43 * \brief Start of frame marker 44 */ 45#define SEND_PACKET_SOF 0x5A 46/*! 47 * \brief To enable SPI interface for ESE communication 48 */ 49#define SPI_ENABLED 1 50/******************************************************************************* 51** 52** Function phPalEse_close 53** 54** Description Closes PN547 device 55** 56** Parameters pDevHandle - device handle 57** 58** Returns None 59** 60*******************************************************************************/ 61void phPalEse_close(void* pDevHandle) { 62 if (NULL != pDevHandle) { 63#ifdef SPI_ENABLED 64 phPalEse_spi_close(pDevHandle); 65#else 66/* RFU */ 67#endif 68 } 69 return; 70} 71 72/******************************************************************************* 73** 74** Function phPalEse_open_and_configure 75** 76** Description Open and configure ESE device 77** 78** Parameters pConfig - hardware information 79** 80** Returns ESE status: 81** ESESTATUS_SUCCESS - open_and_configure operation 82*success 83** ESESTATUS_INVALID_DEVICE - device open operation failure 84** 85*******************************************************************************/ 86ESESTATUS phPalEse_open_and_configure(pphPalEse_Config_t pConfig) { 87 ESESTATUS status = ESESTATUS_FAILED; 88#ifdef SPI_ENABLED 89 status = phPalEse_spi_open_and_configure(pConfig); 90#else 91/* RFU */ 92#endif 93 return status; 94} 95 96/******************************************************************************* 97** 98** Function phPalEse_read 99** 100** Description Reads requested number of bytes from pn547 device into given 101*buffer 102** 103** Parameters pDevHandle - valid device handle 104** pBuffer - buffer for read data 105** nNbBytesToRead - number of bytes requested to be read 106** 107** Returns numRead - number of successfully read bytes 108** -1 - read operation failure 109** 110*******************************************************************************/ 111int phPalEse_read(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToRead) { 112 int ret = -1; 113#ifdef SPI_ENABLED 114 ret = phPalEse_spi_read(pDevHandle, pBuffer, nNbBytesToRead); 115#else 116/* RFU */ 117#endif 118 return ret; 119} 120 121/******************************************************************************* 122** 123** Function phPalEse_write 124** 125** Description Writes requested number of bytes from given buffer into 126*pn547 device 127** 128** Parameters pDevHandle - valid device handle 129** pBuffer - buffer for read data 130** nNbBytesToWrite - number of bytes requested to be written 131** 132** Returns numWrote - number of successfully written bytes 133** -1 - write operation failure 134** 135*******************************************************************************/ 136int phPalEse_write(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToWrite) { 137 int numWrote = 0; 138 139 if (NULL == pDevHandle) { 140 return -1; 141 } 142#ifdef SPI_ENABLED 143 numWrote = phPalEse_spi_write(pDevHandle, pBuffer, nNbBytesToWrite); 144#else 145/* RFU */ 146#endif 147 return numWrote; 148} 149 150/******************************************************************************* 151** 152** Function phPalEse_ioctl 153** 154** Description Exposed ioctl by p61 spi driver 155** 156** Parameters pDevHandle - valid device handle 157** level - reset level 158** 159** Returns 0 - ioctl operation success 160** -1 - ioctl operation failure 161** 162*******************************************************************************/ 163ESESTATUS phPalEse_ioctl(phPalEse_ControlCode_t eControlCode, void* pDevHandle, 164 long level) { 165 ESESTATUS ret = ESESTATUS_FAILED; 166 ALOGD_IF(ese_debug_enabled, "phPalEse_spi_ioctl(), ioctl %x , level %lx", 167 eControlCode, level); 168 169 if (NULL == pDevHandle) { 170 return ESESTATUS_IOCTL_FAILED; 171 } 172#ifdef SPI_ENABLED 173 ret = phPalEse_spi_ioctl(eControlCode, pDevHandle, level); 174#else 175/* RFU */ 176#endif 177 return ret; 178} 179 180/******************************************************************************* 181** 182** Function phPalEse_print_packet 183** 184** Description Print packet 185** 186** Returns None 187** 188*******************************************************************************/ 189void phPalEse_print_packet(const char* pString, const uint8_t* p_data, 190 uint16_t len) { 191 uint32_t i; 192 char print_buffer[len * 3 + 1]; 193 194 memset(print_buffer, 0, sizeof(print_buffer)); 195 for (i = 0; i < len; i++) { 196 snprintf(&print_buffer[i * 2], 3, "%02X", p_data[i]); 197 } 198 if (0 == memcmp(pString, "SEND", 0x04)) { 199 ALOGD_IF(ese_debug_enabled, "NxpEseDataX len = %3d > %s", len, 200 print_buffer); 201 } else if (0 == memcmp(pString, "RECV", 0x04)) { 202 ALOGD_IF(ese_debug_enabled, "NxpEseDataR len = %3d > %s", len, 203 print_buffer); 204 } 205 206 return; 207} 208 209/******************************************************************************* 210** 211** Function phPalEse_sleep 212** 213** Description This function suspends execution of the calling thread for 214** (at least) usec microseconds 215** 216** Returns None 217** 218*******************************************************************************/ 219void phPalEse_sleep(long usec) { 220 usleep(usec); 221 return; 222} 223 224/** 225 * \ingroup eSe_PAL 226 * \brief This function updates destination buffer with val 227 * data in len size 228 * 229 * \param[in] buff - Array to be udpated 230 * \param[in] val - value to be updated 231 * \param[in] len - length of array to be updated 232 * 233 * \retval void 234 * 235 */ 236void* phPalEse_memset(void* buff, int val, size_t len) { 237 return memset(buff, val, len); 238} 239 240/** 241 * \ingroup eSe_PAL 242 * \brief This function copies source buffer to destination buffer 243 * data in len size 244 * 245 * \param[in] dest - Destination array to be updated 246 * \param[in] src - Source array to be updated 247 * \param[in] len - length of array to be updated 248 * 249 * \retval void 250 * 251 */ 252void* phPalEse_memcpy(void* dest, const void* src, size_t len) { 253 return memcpy(dest, src, len); 254} 255 256/** 257 * \ingroup eSe_PAL 258 * \brief This is utility function for runtime heap memory allocation 259 * 260 * \param[in] size - number of bytes to be allocated 261 * 262 * \retval void 263 * 264 */ 265void* phPalEse_memalloc(uint32_t size) { return malloc(size); } 266 267/** 268 * \ingroup eSe_PAL 269 * \brief This is utility function for runtime heap memory allocation 270 * 271 * \param[in] len - number of bytes to be allocated 272 * 273 * \retval void 274 * 275 */ 276void* phPalEse_calloc(size_t datatype, size_t size) { 277 return calloc(datatype, size); 278} 279 280/** 281 * \ingroup eSe_PAL 282 * \brief This is utility function for freeeing heap memory allocated 283 * 284 * \param[in] ptr - Address pointer to previous allocation 285 * 286 * \retval void 287 * 288 */ 289void phPalEse_free(void* ptr) { return free(ptr); } 290