1 /*
2 * Copyright (C) 2012-2014 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 #include <phNxpNciHal_ext.h>
17 #include <phNxpNciHal.h>
18 #include <phTmlNfc.h>
19 #include <phDal4Nfc_messageQueueLib.h>
20 #include <phNxpNciHal_NfcDepSWPrio.h>
21 #include <phNxpNciHal_Kovio.h>
22 #include <phNxpLog.h>
23 #include <phNxpConfig.h>
24
25 #define HAL_EXTNS_WRITE_RSP_TIMEOUT (1000) /* Timeout value to wait for response from PN548AD */
26
27 #undef P2P_PRIO_LOGIC_HAL_IMP
28
29 /******************* Global variables *****************************************/
30 extern phNxpNciHal_Control_t nxpncihal_ctrl;
31 extern phNxpNciProfile_Control_t nxpprofile_ctrl;
32
33 extern int kovio_detected;
34 extern int disable_kovio;
35 extern int send_to_upper_kovio;
36 extern uint32_t cleanup_timer;
37 uint8_t icode_detected = 0x00;
38 uint8_t icode_send_eof = 0x00;
39 #if(NFC_NXP_CHIP_TYPE == PN548C2)
40 uint8_t nfcdep_detected = 0x00;
41 #endif
42 static uint8_t ee_disc_done = 0x00;
43 uint8_t EnableP2P_PrioLogic = FALSE;
44 static uint32_t RfDiscID = 1;
45 static uint32_t RfProtocolType = 4;
46 /* NFCEE Set mode */
47 static uint8_t setEEModeDone = 0x00;
48 static uint8_t cmd_nfcee_setmode_enable[] = { 0x22, 0x01, 0x02, 0x01, 0x01 };
49
50 /* External global variable to get FW version from NCI response*/
51 extern uint32_t wFwVerRsp;
52 /* External global variable to get FW version from FW file*/
53 extern uint16_t wFwVer;
54
55 uint16_t fw_maj_ver;
56 uint16_t rom_version;
57 /* local buffer to store CORE_INIT response */
58 static uint32_t bCoreInitRsp[40];
59 static uint32_t iCoreInitRspLen;
60
61 extern uint32_t timeoutTimerId;
62
63 extern NFCSTATUS read_retry();
64
65 /************** HAL extension functions ***************************************/
66 static void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void *pContext);
67
68 /*Proprietary cmd sent to HAL to send reader mode flag
69 * Last byte of 4 byte proprietary cmd data contains ReaderMode flag
70 * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol
71 * if FrameRF interface is selected. This needs to be done as the FW
72 * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is
73 * previously selected with DISCOVER_SELECT_CMD
74 */
75 #define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE
76 static uint8_t gFelicaReaderMode;
77
78
79 /*******************************************************************************
80 **
81 ** Function phNxpNciHal_ext_init
82 **
83 ** Description initialize extension function
84 **
85 *******************************************************************************/
phNxpNciHal_ext_init(void)86 void phNxpNciHal_ext_init (void)
87 {
88 icode_detected = 0x00;
89 icode_send_eof = 0x00;
90 setEEModeDone = 0x00;
91 kovio_detected = 0x00;
92 disable_kovio = 0x00;
93 send_to_upper_kovio = 0x01;
94 EnableP2P_PrioLogic = FALSE;
95 }
96
97 /*******************************************************************************
98 **
99 ** Function phNxpNciHal_process_ext_rsp
100 **
101 ** Description Process extension function response
102 **
103 ** Returns NFCSTATUS_SUCCESS if success
104 **
105 *******************************************************************************/
phNxpNciHal_process_ext_rsp(uint8_t * p_ntf,uint16_t * p_len)106 NFCSTATUS phNxpNciHal_process_ext_rsp (uint8_t *p_ntf, uint16_t *p_len)
107 {
108
109 NFCSTATUS status = NFCSTATUS_SUCCESS;
110 uint16_t rf_technology_length_param = 0;
111
112 if (p_ntf[0] == 0x61 &&
113 p_ntf[1] == 0x05 &&
114 p_ntf[4] == 0x03 &&
115 p_ntf[5] == 0x05 &&
116 nxpprofile_ctrl.profile_type == EMV_CO_PROFILE)
117 {
118 p_ntf[4] = 0xFF;
119 p_ntf[5] = 0xFF;
120 p_ntf[6] = 0xFF;
121 NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling");
122 }
123
124 if (p_ntf[0] == 0x61 &&
125 p_ntf[1] == 0x05 &&
126 p_ntf[4] == 0x01 &&
127 p_ntf[5] == 0x05 &&
128 p_ntf[6] == 0x02 &&
129 gFelicaReaderMode)
130 {
131 /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP
132 * when FrameRF interface is selected*/
133 p_ntf[5] = 0x03;
134 NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1");
135 }
136
137 #ifdef P2P_PRIO_LOGIC_HAL_IMP
138 if(p_ntf[0] == 0x61 &&
139 p_ntf[1] == 0x05 &&
140 p_ntf[4] == 0x02 &&
141 p_ntf[5] == 0x04 &&
142 nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE)
143 {
144 EnableP2P_PrioLogic = TRUE;
145 }
146
147 NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X", EnableP2P_PrioLogic);
148 if(phNxpDta_IsEnable() == FALSE)
149 {
150 if ((icode_detected != 1)&&(kovio_detected != 1) && (EnableP2P_PrioLogic == TRUE))
151 {
152 if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED)
153 {
154 status = phNxpNciHal_NfcDep_rsp_ext(p_ntf,p_len);
155 if(status != NFCSTATUS_INVALID_PARAMETER)
156 {
157 return status;
158 }
159 }
160 }
161 }
162 #endif
163
164 status = NFCSTATUS_SUCCESS;
165 status = phNxpNciHal_kovio_rsp_ext(p_ntf,p_len);
166
167 if (p_ntf[0] == 0x61 &&
168 p_ntf[1] == 0x05)
169 {
170 #if(NFC_NXP_CHIP_TYPE == PN548C2)
171 if (nfcdep_detected)
172 {
173 nfcdep_detected = 0x00;
174 }
175 #endif
176
177 switch (p_ntf[4])
178 {
179 case 0x00:
180 NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF");
181 break;
182 case 0x01:
183 NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF");
184 break;
185 case 0x02:
186 NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP");
187 break;
188 case 0x03:
189 NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
190 #if(NFC_NXP_CHIP_TYPE == PN548C2)
191 nfcdep_detected = 0x01;
192 #endif
193 break;
194 case 0x80:
195 NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
196 break;
197 default:
198 NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown");
199 break;
200 }
201
202 switch (p_ntf[5])
203 {
204 case 0x01:
205 NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T");
206 phNxpDta_T1TEnable();
207 break;
208 case 0x02:
209 NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T");
210 break;
211 case 0x03:
212 NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T");
213 break;
214 case 0x04:
215 NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP");
216 break;
217 case 0x05:
218 NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP");
219 break;
220 case 0x06:
221 NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693");
222 break;
223 case 0x80:
224 NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE");
225 break;
226 #if(NFC_NXP_CHIP_TYPE != PN547C2)
227 case 0x81:
228 #else
229 case 0x8A:
230 #endif
231 NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio");
232 break;
233 default:
234 NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown");
235 break;
236 }
237
238 switch (p_ntf[6])
239 {
240 case 0x00:
241 NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll");
242 break;
243 case 0x01:
244 NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll");
245 break;
246 case 0x02:
247 NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll");
248 break;
249 case 0x03:
250 NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll");
251 break;
252 case 0x05:
253 NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll");
254 break;
255 case 0x06:
256 NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll");
257 break;
258 #if(NFC_NXP_CHIP_TYPE != PN547C2)
259 case 0x70:
260 #else
261 case 0x77:
262 #endif
263 NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio");
264 break;
265 case 0x80:
266 NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen");
267 break;
268 case 0x81:
269 NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen");
270 break;
271 case 0x82:
272 NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen");
273 break;
274 case 0x83:
275 NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen");
276 break;
277 case 0x85:
278 NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen");
279 break;
280 case 0x86:
281 NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen");
282 break;
283 default:
284 NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown");
285 break;
286 }
287 }
288
289 if (p_ntf[0] == 0x61 &&
290 p_ntf[1] == 0x05 &&
291 p_ntf[2] == 0x15 &&
292 p_ntf[4] == 0x01 &&
293 p_ntf[5] == 0x06 &&
294 p_ntf[6] == 0x06)
295 {
296 NXPLOG_NCIHAL_D ("> Going through workaround - notification of ISO 15693");
297 icode_detected = 0x01;
298 p_ntf[21] = 0x01;
299 p_ntf[22] = 0x01;
300 }
301 else if (icode_detected == 1 &&
302 icode_send_eof == 2)
303 {
304 icode_send_eof = 3;
305 }
306 else if (p_ntf[0] == 0x00 &&
307 p_ntf[1] == 0x00 &&
308 icode_detected == 1)
309 {
310 if (icode_send_eof == 3)
311 {
312 icode_send_eof = 0;
313 }
314 if (p_ntf[p_ntf[2]+ 2] == 0x00)
315 {
316 NXPLOG_NCIHAL_D ("> Going through workaround - data of ISO 15693");
317 p_ntf[2]--;
318 (*p_len)--;
319 }
320 else
321 {
322 p_ntf[p_ntf[2]+ 2] |= 0x01;
323 }
324 }
325 else if (p_ntf[2] == 0x02 &&
326 p_ntf[1] == 0x00 && icode_detected == 1)
327 {
328 NXPLOG_NCIHAL_D ("> ICODE EOF response do not send to upper layer");
329 }
330 else if(p_ntf[0] == 0x61 &&
331 p_ntf[1] == 0x06 && icode_detected == 1)
332 {
333 NXPLOG_NCIHAL_D ("> Polling Loop Re-Started");
334 icode_detected = 0;
335 icode_send_eof = 0;
336 }
337 else if(*p_len == 4 &&
338 p_ntf[0] == 0x40 &&
339 p_ntf[1] == 0x02 &&
340 p_ntf[2] == 0x01 &&
341 p_ntf[3] == 0x06 )
342 {
343 NXPLOG_NCIHAL_D ("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x", p_ntf[21], p_ntf[22], p_ntf[23]);
344 p_ntf[0] = 0x40;
345 p_ntf[1] = 0x02;
346 p_ntf[2] = 0x02;
347 p_ntf[3] = 0x00;
348 p_ntf[4] = 0x00;
349 *p_len = 5;
350 }
351 else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01))
352 {
353 int len = p_ntf[2] + 2; /*include 2 byte header*/
354 wFwVerRsp= (((uint32_t)p_ntf[len - 2])<< 16U)|(((uint32_t)p_ntf[len - 1])<< 8U)|p_ntf[len];
355 if(wFwVerRsp == 0)
356 status = NFCSTATUS_FAILED;
357 iCoreInitRspLen = *p_len;
358 memcpy(bCoreInitRsp, p_ntf, *p_len);
359 NXPLOG_NCIHAL_D ("NxpNci> FW Version: %x.%x.%x", p_ntf[len-2], p_ntf[len-1], p_ntf[len]);
360 fw_maj_ver = p_ntf[len-1];
361 rom_version = p_ntf[len-2];
362 }
363 //4200 02 00 01
364 else if(p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01)
365 {
366 NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP");
367 if(p_ntf[4] == 0x01)
368 {
369 p_ntf[4] = 0x00;
370
371 ee_disc_done = 0x00;
372 }
373 NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END");
374
375 }
376 else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/)
377 {
378 if(cleanup_timer!=0)
379 {
380 /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */
381 if(0== (*(p_ntf + 2 + (*(p_ntf+2)))))
382 {
383 phNxpNciHal_select_RF_Discovery(RfDiscID,RfProtocolType);
384 status = NFCSTATUS_FAILED;
385 return status;
386 }
387 else
388 {
389 RfDiscID=p_ntf[3];
390 RfProtocolType=p_ntf[4];
391 }
392 status = NFCSTATUS_FAILED;
393 return status;
394
395 }
396 }
397 else if(p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer!=0)
398 {
399 status = NFCSTATUS_FAILED;
400 return status;
401 }
402 else if(p_ntf[0] == 0x60 && p_ntf[1] == 0x00)
403 {
404 NXPLOG_NCIHAL_E ("CORE_RESET_NTF received!");
405 #if(NFC_NXP_CHIP_TYPE == PN548C2)
406 if ( nfcdep_detected &&
407 !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00
408 && ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95
409 && p_ntf[7] == 0x00 && p_ntf[8] == 0x00)
410 || (p_ntf[5] == 0x07 && p_ntf[6] == 0x39
411 && p_ntf[7] == 0xF2 && p_ntf[8] == 0x00)) ))
412 {
413 nfcdep_detected = 0x00;
414 }
415 #endif
416 phNxpNciHal_emergency_recovery ();
417 status = NFCSTATUS_FAILED;
418 return status;
419 }
420 #if(NFC_NXP_CHIP_TYPE == PN547C2)
421 else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05
422 && p_ntf[4] == 0x02 && p_ntf[5] == 0x80
423 && p_ntf[6] == 0x00 )
424 {
425 NXPLOG_NCIHAL_D("Going through workaround - iso-dep interface mifare protocol with sak value not equal to 0x20");
426 rf_technology_length_param = p_ntf[9];
427 if((p_ntf[ 9 + rf_technology_length_param] & 0x20) != 0x20)
428 {
429 p_ntf[4] = 0x80;
430 }
431 }
432 #endif
433 else if (*p_len == 4 &&
434 p_ntf[0] == 0x4F &&
435 p_ntf[1] == 0x11 &&
436 p_ntf[2] == 0x01 )
437 {
438 if (p_ntf[3] == 0x00)
439 {
440 NXPLOG_NCIHAL_D ("> Workaround for ISO-DEP Presence Check, ignore response and wait for notification");
441 p_ntf[0] = 0x60;
442 p_ntf[1] = 0x06;
443 p_ntf[2] = 0x03;
444 p_ntf[3] = 0x01;
445 p_ntf[4] = 0x00;
446 p_ntf[5] = 0x01;
447 *p_len = 6;
448 }
449 else
450 {
451 NXPLOG_NCIHAL_D ("> Workaround for ISO-DEP Presence Check, presence check return failed");
452 p_ntf[0] = 0x60;
453 p_ntf[1] = 0x08;
454 p_ntf[2] = 0x02;
455 p_ntf[3] = 0xB2;
456 p_ntf[4] = 0x00;
457 *p_len = 5;
458
459 }
460 }
461 else if (*p_len == 4 &&
462 p_ntf[0] == 0x6F &&
463 p_ntf[1] == 0x11 &&
464 p_ntf[2] == 0x01 )
465 {
466 if (p_ntf[3] == 0x01)
467 {
468 NXPLOG_NCIHAL_D ("> Workaround for ISO-DEP Presence Check - Card still in field");
469 p_ntf[0] = 0x00;
470 p_ntf[1] = 0x00;
471 p_ntf[2] = 0x01;
472 p_ntf[3] = 0x7E;
473 }
474 else
475 {
476 NXPLOG_NCIHAL_D ("> Workaround for ISO-DEP Presence Check - Card not in field");
477 p_ntf[0] = 0x60;
478 p_ntf[1] = 0x08;
479 p_ntf[2] = 0x02;
480 p_ntf[3] = 0xB2;
481 p_ntf[4] = 0x00;
482 *p_len = 5;
483 }
484 }
485 /*
486 else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5] == 0x00 && p_ntf[6] == 0x01)
487 {
488 NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not supported, disabling");
489 p_ntf[4] = 0xFF;
490 p_ntf[5] = 0xFF;
491 p_ntf[6] = 0xFF;
492 }*/
493
494 return status;
495 }
496
497 /******************************************************************************
498 * Function phNxpNciHal_process_ext_cmd_rsp
499 *
500 * Description This function process the extension command response. It
501 * also checks the received response to expected response.
502 *
503 * Returns returns NFCSTATUS_SUCCESS if response is as expected else
504 * returns failure.
505 *
506 ******************************************************************************/
phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,uint8_t * p_cmd)507 static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len, uint8_t *p_cmd)
508 {
509 NFCSTATUS status = NFCSTATUS_FAILED;
510 uint16_t data_written = 0;
511
512 /* Create the local semaphore */
513 if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL)
514 != NFCSTATUS_SUCCESS)
515 {
516 NXPLOG_NCIHAL_D("Create ext_cb_data failed");
517 return NFCSTATUS_FAILED;
518 }
519
520 nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS;
521
522 /* Send ext command */
523 data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd);
524 if (data_written != cmd_len)
525 {
526 NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext");
527 goto clean_and_return;
528 }
529
530 /* Start timer */
531 status = phOsalNfc_Timer_Start(timeoutTimerId,
532 HAL_EXTNS_WRITE_RSP_TIMEOUT,
533 &hal_extns_write_rsp_timeout_cb,
534 NULL);
535 if (NFCSTATUS_SUCCESS == status)
536 {
537 NXPLOG_NCIHAL_D("Response timer started");
538 }
539 else
540 {
541 NXPLOG_NCIHAL_E("Response timer not started!!!");
542 status = NFCSTATUS_FAILED;
543 goto clean_and_return;
544 }
545
546 /* Wait for rsp */
547 NXPLOG_NCIHAL_D("Waiting after ext cmd sent");
548 if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data))
549 {
550 NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
551 goto clean_and_return;
552 }
553
554 /* Stop Timer */
555 status = phOsalNfc_Timer_Stop(timeoutTimerId);
556
557 if (NFCSTATUS_SUCCESS == status)
558 {
559 NXPLOG_NCIHAL_D("Response timer stopped");
560 }
561 else
562 {
563 NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
564 status = NFCSTATUS_FAILED;
565 goto clean_and_return;
566 }
567
568 if(nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS)
569 {
570 NXPLOG_NCIHAL_E("Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x", nxpncihal_ctrl.ext_cb_data.status);
571 status = NFCSTATUS_FAILED;
572 goto clean_and_return;
573 }
574
575 NXPLOG_NCIHAL_D("Checking response");
576 status = NFCSTATUS_SUCCESS;
577
578 clean_and_return:
579 phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data);
580
581 return status;
582 }
583
584 /******************************************************************************
585 * Function phNxpNciHal_write_ext
586 *
587 * Description This function inform the status of phNxpNciHal_open
588 * function to libnfc-nci.
589 *
590 * Returns It return NFCSTATUS_SUCCESS then continue with send else
591 * sends NFCSTATUS_FAILED direct response is prepared and
592 * do not send anything to NFCC.
593 *
594 ******************************************************************************/
595
phNxpNciHal_write_ext(uint16_t * cmd_len,uint8_t * p_cmd_data,uint16_t * rsp_len,uint8_t * p_rsp_data)596 NFCSTATUS phNxpNciHal_write_ext(uint16_t *cmd_len, uint8_t *p_cmd_data,
597 uint16_t *rsp_len, uint8_t *p_rsp_data)
598 {
599 NFCSTATUS status = NFCSTATUS_SUCCESS;
600
601 unsigned long retval = 0;
602 int isfound = GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long));
603
604 phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len);
605
606 if(phNxpDta_IsEnable() == TRUE)
607 {
608 status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data,rsp_len, p_rsp_data);
609 }
610
611 if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE &&
612 p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE &&
613 p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE)
614 {
615 NXPLOG_NCIHAL_D ("Received proprietary command to set Felica Reader mode:%d",p_cmd_data[3]);
616 gFelicaReaderMode = p_cmd_data[3];
617 /* frame the dummy response */
618 *rsp_len = 4;
619 p_rsp_data[0] = 0x00;
620 p_rsp_data[1] = 0x00;
621 p_rsp_data[2] = 0x00;
622 p_rsp_data[3] = 0x00;
623 status = NFCSTATUS_FAILED;
624 }
625 else if (p_cmd_data[0] == 0x20 &&
626 p_cmd_data[1] == 0x02 &&
627 p_cmd_data[2] == 0x05 &&
628 p_cmd_data[3] == 0x01 &&
629 p_cmd_data[4] == 0xA0 &&
630 p_cmd_data[5] == 0x44 &&
631 p_cmd_data[6] == 0x01 &&
632 p_cmd_data[7] == 0x01)
633 {
634 nxpprofile_ctrl.profile_type = EMV_CO_PROFILE;
635 NXPLOG_NCIHAL_D ("EMV_CO_PROFILE mode - Enabled");
636 status = NFCSTATUS_SUCCESS;
637 }
638 else if (p_cmd_data[0] == 0x20 &&
639 p_cmd_data[1] == 0x02 &&
640 p_cmd_data[2] == 0x05 &&
641 p_cmd_data[3] == 0x01 &&
642 p_cmd_data[4] == 0xA0 &&
643 p_cmd_data[5] == 0x44 &&
644 p_cmd_data[6] == 0x01 &&
645 p_cmd_data[7] == 0x00)
646 {
647 NXPLOG_NCIHAL_D ("NFC_FORUM_PROFILE mode - Enabled");
648 nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE;
649 status = NFCSTATUS_SUCCESS;
650 }
651
652 if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE)
653 {
654 if (p_cmd_data[0] == 0x21 &&
655 p_cmd_data[1] == 0x06 &&
656 p_cmd_data[2] == 0x01 &&
657 p_cmd_data[3] == 0x03)
658 {
659 #if 0
660 //Needs clarification whether to keep it or not
661 NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard");
662 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
663 *rsp_len = 4;
664 p_rsp_data[0] = 0x41;
665 p_rsp_data[1] = 0x06;
666 p_rsp_data[2] = 0x01;
667 p_rsp_data[3] = 0x00;
668 phNxpNciHal_print_packet("RECV", p_rsp_data, 4);
669 status = NFCSTATUS_FAILED;
670 #endif
671 }
672 else if(p_cmd_data[0] == 0x21 &&
673 p_cmd_data[1] == 0x03 )
674 {
675 NXPLOG_NCIHAL_D ("EmvCo Poll mode - Discover map only for A and B");
676 p_cmd_data[2] = 0x05;
677 p_cmd_data[3] = 0x02;
678 p_cmd_data[4] = 0x00;
679 p_cmd_data[5] = 0x01;
680 p_cmd_data[6] = 0x01;
681 p_cmd_data[7] = 0x01;
682 *cmd_len = 8;
683 }
684 }
685
686 if (retval == 0x01 &&
687 p_cmd_data[0] == 0x21 &&
688 p_cmd_data[1] == 0x00)
689 {
690 NXPLOG_NCIHAL_D ("Going through extns - Adding Mifare in RF Discovery");
691 p_cmd_data[2] += 3;
692 p_cmd_data[3] += 1;
693 p_cmd_data[*cmd_len] = 0x80;
694 p_cmd_data[*cmd_len + 1] = 0x01;
695 p_cmd_data[*cmd_len + 2] = 0x80;
696 *cmd_len += 3;
697 status = NFCSTATUS_SUCCESS;
698 NXPLOG_NCIHAL_D ("Going through extns - Adding Mifare in RF Discovery - END");
699 }
700 else if (p_cmd_data[3] == 0x81 &&
701 p_cmd_data[4] == 0x01 &&
702 p_cmd_data[5] == 0x03)
703 {
704 NXPLOG_NCIHAL_D("> Going through workaround - set host list");
705
706 #if(NFC_NXP_CHIP_TYPE != PN547C2)
707 *cmd_len = 8;
708
709 p_cmd_data[2] = 0x05;
710 p_cmd_data[6] = 0x02;
711 p_cmd_data[7] = 0xC0;
712 #else
713 *cmd_len = 7;
714
715 p_cmd_data[2] = 0x04;
716 p_cmd_data[6] = 0xC0;
717 #endif
718
719 NXPLOG_NCIHAL_D("> Going through workaround - set host list - END");
720 status = NFCSTATUS_SUCCESS;
721 }
722 else if(icode_detected)
723 {
724 if ((p_cmd_data[3] & 0x40) == 0x40 &&
725 (p_cmd_data[4] == 0x21 ||
726 p_cmd_data[4] == 0x22 ||
727 p_cmd_data[4] == 0x24 ||
728 p_cmd_data[4] == 0x27 ||
729 p_cmd_data[4] == 0x28 ||
730 p_cmd_data[4] == 0x29 ||
731 p_cmd_data[4] == 0x2a))
732 {
733 NXPLOG_NCIHAL_D ("> Send EOF set");
734 icode_send_eof = 1;
735 }
736
737 if(p_cmd_data[3] == 0x20 || p_cmd_data[3] == 0x24 ||
738 p_cmd_data[3] == 0x60)
739 {
740 NXPLOG_NCIHAL_D ("> NFC ISO_15693 Proprietary CMD ");
741 p_cmd_data[3] += 0x02;
742 }
743 }
744 else if(p_cmd_data[0] == 0x21 &&
745 p_cmd_data[1] == 0x03 )
746 {
747 NXPLOG_NCIHAL_D ("> Polling Loop Started");
748 icode_detected = 0;
749 icode_send_eof = 0;
750 #if(NFC_NXP_CHIP_TYPE == PN548C2)
751 // Cache discovery cmd for recovery
752 phNxpNciHal_discovery_cmd_ext (p_cmd_data, *cmd_len);
753 #endif
754 }
755 //22000100
756 else if (p_cmd_data[0] == 0x22 &&
757 p_cmd_data[1] == 0x00 &&
758 p_cmd_data[2] == 0x01 &&
759 p_cmd_data[3] == 0x00
760 )
761 {
762 //ee_disc_done = 0x01;//Reader Over SWP event getting
763 *rsp_len = 0x05;
764 p_rsp_data[0] = 0x42;
765 p_rsp_data[1] = 0x00;
766 p_rsp_data[2] = 0x02;
767 p_rsp_data[3] = 0x00;
768 p_rsp_data[4] = 0x00;
769 phNxpNciHal_print_packet("RECV", p_rsp_data,5);
770 status = NFCSTATUS_FAILED;
771 }
772 //2002 0904 3000 3100 3200 5000
773 else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
774 ( (p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*||
775 (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
776 )
777 )
778 {
779 *cmd_len += 0x01;
780 p_cmd_data[2] += 0x01;
781 p_cmd_data[9] = 0x01;
782 p_cmd_data[10] = 0x40;
783 p_cmd_data[11] = 0x50;
784 p_cmd_data[12] = 0x00;
785
786 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
787 // phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
788 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
789 }
790 // 20020703300031003200
791 // 2002 0301 3200
792 else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
793 (
794 (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) ||
795 (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 && p_cmd_data[4] == 0x32)
796 )
797 )
798 {
799 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
800 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
801 *rsp_len = 5;
802 p_rsp_data[0] = 0x40;
803 p_rsp_data[1] = 0x02;
804 p_rsp_data[2] = 0x02;
805 p_rsp_data[3] = 0x00;
806 p_rsp_data[4] = 0x00;
807
808 phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
809 status = NFCSTATUS_FAILED;
810 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
811 }
812
813 //2002 0D04 300104 310100 320100 500100
814 //2002 0401 320100
815 else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
816 (
817 /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
818 (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 && p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00)
819 )
820 )
821 {
822 // p_cmd_data[12] = 0x40;
823
824 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
825 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
826 p_cmd_data[6] = 0x60;
827
828 phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
829 // status = NFCSTATUS_FAILED;
830 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
831 }
832 else if(p_cmd_data[0] == 0x21 &&
833 p_cmd_data[1] == 0x00 )
834 {
835 NXPLOG_NCIHAL_D ("> Going through workaround - Add Mifare Classic in Discovery Map");
836 p_cmd_data[*cmd_len] = 0x80;
837 p_cmd_data[*cmd_len +1] = 0x01;
838 p_cmd_data[*cmd_len + 2] = 0x80;
839 p_cmd_data[5] = 0x01;
840 p_cmd_data[6] = 0x01;
841 p_cmd_data[2] += 3;
842 p_cmd_data[3] += 1;
843 *cmd_len += 3;
844 }
845 else if (*cmd_len == 3 &&
846 p_cmd_data[0] == 0x00 &&
847 p_cmd_data[1] == 0x00 &&
848 p_cmd_data[2] == 0x00 )
849 {
850 NXPLOG_NCIHAL_D ("> Going through workaround - ISO-DEP Presence Check ");
851 p_cmd_data[0] = 0x2F;
852 p_cmd_data[1] = 0x11;
853 p_cmd_data[2] = 0x00;
854 status = NFCSTATUS_SUCCESS;
855 NXPLOG_NCIHAL_D ("> Going through workaround - ISO-DEP Presence Check - End");
856 }
857
858 #if 0
859 else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
860 ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) ||
861 (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) ||
862 (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) ||
863 (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) ||
864 (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) ||
865 (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02))
866 )
867 {
868 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
869 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
870 *rsp_len = 5;
871 p_rsp_data[0] = 0x40;
872 p_rsp_data[1] = 0x02;
873 p_rsp_data[2] = 0x02;
874 p_rsp_data[3] = 0x00;
875 p_rsp_data[4] = 0x00;
876
877 phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
878 status = NFCSTATUS_FAILED;
879 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
880 }
881
882 else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
883 ((p_cmd_data[3] == 0x00) ||
884 ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/
885 {
886 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
887 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
888 *rsp_len = 5;
889 p_rsp_data[0] = 0x40;
890 p_rsp_data[1] = 0x02;
891 p_rsp_data[2] = 0x02;
892 p_rsp_data[3] = 0x00;
893 p_rsp_data[4] = 0x00;
894
895 phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
896 status = NFCSTATUS_FAILED;
897 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
898 }
899 #endif
900 else if ((wFwVerRsp & 0x0000FFFF) == wFwVer)
901 {
902 /* skip CORE_RESET and CORE_INIT from Brcm */
903 if (p_cmd_data[0] == 0x20 &&
904 p_cmd_data[1] == 0x00 &&
905 p_cmd_data[2] == 0x01 &&
906 p_cmd_data[3] == 0x01
907 )
908 {
909 // *rsp_len = 6;
910 //
911 // NXPLOG_NCIHAL_D("> Going - core reset optimization");
912 //
913 // p_rsp_data[0] = 0x40;
914 // p_rsp_data[1] = 0x00;
915 // p_rsp_data[2] = 0x03;
916 // p_rsp_data[3] = 0x00;
917 // p_rsp_data[4] = 0x10;
918 // p_rsp_data[5] = 0x01;
919 //
920 // status = NFCSTATUS_FAILED;
921 // NXPLOG_NCIHAL_D("> Going - core reset optimization - END");
922 }
923 /* CORE_INIT */
924 else if (
925 p_cmd_data[0] == 0x20 &&
926 p_cmd_data[1] == 0x01 &&
927 p_cmd_data[2] == 0x00
928 )
929 {
930 // NXPLOG_NCIHAL_D("> Going - core init optimization");
931 // *rsp_len = iCoreInitRspLen;
932 // memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen);
933 // status = NFCSTATUS_FAILED;
934 // NXPLOG_NCIHAL_D("> Going - core init optimization - END");
935 }
936 }
937
938 #if(NFC_NXP_CHIP_TYPE == PN548C2)
939 if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02)
940 {
941 uint8_t temp;
942 uint8_t *p = p_cmd_data + 4;
943 uint8_t *end = p_cmd_data + *cmd_len;
944 while (p < end)
945 {
946 if (*p == 0x53) //LF_T3T_FLAGS
947 {
948 NXPLOG_NCIHAL_D ("> Going through workaround - LF_T3T_FLAGS swap");
949 temp = *(p + 3);
950 *(p + 3) = *(p + 2);
951 *(p + 2) = temp;
952 NXPLOG_NCIHAL_D ("> Going through workaround - LF_T3T_FLAGS - End");
953 status = NFCSTATUS_SUCCESS;
954 break;
955 }
956 if (*p == 0xA0)
957 {
958 p += *(p + 2) + 3;
959 }
960 else
961 {
962 p += *(p + 1) + 2;
963 }
964 }
965 }
966 #endif
967
968 return status;
969 }
970
971 /******************************************************************************
972 * Function phNxpNciHal_send_ext_cmd
973 *
974 * Description This function send the extension command to NFCC. No
975 * response is checked by this function but it waits for
976 * the response to come.
977 *
978 * Returns Returns NFCSTATUS_SUCCESS if sending cmd is successful and
979 * response is received.
980 *
981 ******************************************************************************/
phNxpNciHal_send_ext_cmd(uint16_t cmd_len,uint8_t * p_cmd)982 NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t *p_cmd)
983 {
984 NFCSTATUS status = NFCSTATUS_FAILED;
985
986 HAL_ENABLE_EXT();
987 nxpncihal_ctrl.cmd_len = cmd_len;
988 memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len);
989 status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len, nxpncihal_ctrl.p_cmd_data);
990 HAL_DISABLE_EXT();
991
992 return status;
993 }
994
995 /******************************************************************************
996 * Function hal_extns_write_rsp_timeout_cb
997 *
998 * Description Timer call back function
999 *
1000 * Returns None
1001 *
1002 ******************************************************************************/
hal_extns_write_rsp_timeout_cb(uint32_t timerId,void * pContext)1003 static void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void *pContext)
1004 {
1005 UNUSED(timerId);
1006 UNUSED(pContext);
1007 NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!");
1008 nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED;
1009 usleep(1);
1010 SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
1011
1012 return;
1013 }
1014