• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
32 extern 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 *******************************************************************************/
phPalEse_close(void * pDevHandle)61 void 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 *******************************************************************************/
phPalEse_open_and_configure(pphPalEse_Config_t pConfig)86 ESESTATUS 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 *******************************************************************************/
phPalEse_read(void * pDevHandle,uint8_t * pBuffer,int nNbBytesToRead)111 int 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 *******************************************************************************/
phPalEse_write(void * pDevHandle,uint8_t * pBuffer,int nNbBytesToWrite)136 int 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 *******************************************************************************/
phPalEse_ioctl(phPalEse_ControlCode_t eControlCode,void * pDevHandle,long level)163 ESESTATUS 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 *******************************************************************************/
phPalEse_print_packet(const char * pString,const uint8_t * p_data,uint16_t len)189 void 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 *******************************************************************************/
phPalEse_sleep(long usec)219 void 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  */
phPalEse_memset(void * buff,int val,size_t len)236 void* 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  */
phPalEse_memcpy(void * dest,const void * src,size_t len)252 void* 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  */
phPalEse_memalloc(uint32_t size)265 void* 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  */
phPalEse_calloc(size_t datatype,size_t size)276 void* 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  */
phPalEse_free(void * ptr)289 void phPalEse_free(void* ptr) { return free(ptr); }
290