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