15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors 35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License. 65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at 75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * http://www.apache.org/licenses/LICENSE-2.0 95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software 115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and 145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License. 155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file phDalNfc.c 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL Implementation for linux 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: Trusted NFC Linux Lignt 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Date: 07 aug 2009 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Author: Jonathan roux 255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Revision: 1.0 $ 265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define _DAL_4_NFC_C 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <unistd.h> 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <pthread.h> 33e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas#include <stdlib.h> 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ANDROID 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <linux/ipc.h> 364812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly#include <cutils/log.h> 374812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly#include <cutils/properties.h> // for property_get 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <sys/msg.h> 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 41e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton#include <semaphore.h> 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc.h> 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h> 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcStatus.h> 455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_DeferredCall.h> 465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_debug.h> 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_uart.h> 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_i2c.h> 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_link.h> 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phDal4Nfc_messageQueueLib.h> 51b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen#include <hardware/hardware.h> 52b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen#include <hardware/nfc.h> 535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------------- 565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TYPES 575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly------------------------------------------------------------------------------------*/ 585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*structure holds members related for both read and write operations*/ 595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef struct Dal_RdWr_st 605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read members */ 625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pthread_t nReadThread; /* Read thread Hanlde */ 635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t * pReadBuffer; /* Read local buffer */ 645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesToRead; /* Number of bytes to read */ 655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesRead; /* Number of read bytes */ 665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nReadBusy; /* Read state machine */ 675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nReadThreadAlive; /* Read state machine */ 685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nWaitingOnRead; /* Read state machine */ 695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read wait members */ 715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t * pReadWaitBuffer; /* Read wait local Buffer */ 725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesToReadWait; /* Number of bytes to read */ 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesReadWait; /* Number of read bytes */ 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nReadWaitBusy; /* Read state machine */ 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nWaitingOnReadWait; /* Read state machine */ 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nCancelReadWait; /* Read state machine */ 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write members */ 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pthread_t nWriteThread; /* Write thread Hanlde */ 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t * pWriteBuffer; /* Write local buffer */ 813e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton uint8_t * pTempWriteBuffer; /* Temp Write local buffer */ 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesToWrite; /* Number of bytes to write */ 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int nNbOfBytesWritten; /* Number of bytes written */ 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nWaitingOnWrite; /* Write state machine */ 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nWriteThreadAlive; /* Write state machine */ 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char nWriteBusy; /* Write state machine */ 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} phDal4Nfc_RdWr_t; 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef void (*pphDal4Nfc_DeferFuncPointer_t) (void * ); 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef void * (*pphDal4Nfc_thread_handler_t) (void * pParam); 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------------- 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly VARIABLES 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly------------------------------------------------------------------------------------*/ 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic phDal4Nfc_RdWr_t gReadWriteContext; 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic phDal4Nfc_SContext_t gDalContext; 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic pphDal4Nfc_SContext_t pgDalContext; 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic phHal_sHwReference_t * pgDalHwContext; 100e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamiltonstatic sem_t nfc_read_sem; 1014812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pellystatic int low_level_traces; 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef USE_MQ_MESSAGE_QUEUE 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic phDal4Nfc_DeferredCall_Msg_t nDeferedMessage; 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic mqd_t nDeferedCallMessageQueueId; 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyint nDeferedCallMessageQueueId = 0; 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic phDal4Nfc_link_cbk_interface_t gLinkFunc; 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------------- 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PROTOTYPES 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly------------------------------------------------------------------------------------*/ 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phDal4Nfc_DeferredCb (void *params); 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phDal4Nfc_StartThreads (void); 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phDal4Nfc_FillMsg (phDal4Nfc_Message_t *pDalMsg, phOsalNfc_Message_t *pOsalMsg); 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------------- 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL API IMPLEMENTATION 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly------------------------------------------------------------------------------------*/ 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1214812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pellystatic void refresh_low_level_traces() { 12223482d091c046310ef4c57f625c67e0d0e776500Nick Pelly#ifdef LOW_LEVEL_TRACES 12323482d091c046310ef4c57f625c67e0d0e776500Nick Pelly low_level_traces = 1; 12423482d091c046310ef4c57f625c67e0d0e776500Nick Pelly return; 12523482d091c046310ef4c57f625c67e0d0e776500Nick Pelly#else 12623482d091c046310ef4c57f625c67e0d0e776500Nick Pelly 1274812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly#ifdef ANDROID 12823482d091c046310ef4c57f625c67e0d0e776500Nick Pelly char value[PROPERTY_VALUE_MAX]; 12923482d091c046310ef4c57f625c67e0d0e776500Nick Pelly 13023482d091c046310ef4c57f625c67e0d0e776500Nick Pelly property_get("ro.debuggable", value, ""); 13123482d091c046310ef4c57f625c67e0d0e776500Nick Pelly if (!value[0] || !atoi(value)) { 13223482d091c046310ef4c57f625c67e0d0e776500Nick Pelly low_level_traces = 0; // user build, do not allow debug 13323482d091c046310ef4c57f625c67e0d0e776500Nick Pelly return; 13423482d091c046310ef4c57f625c67e0d0e776500Nick Pelly } 13523482d091c046310ef4c57f625c67e0d0e776500Nick Pelly 1365ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly property_get("debug.nfc.LOW_LEVEL_TRACES", value, "0"); 1374812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly if (value[0]) { 1385ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly low_level_traces = atoi(value); 13923482d091c046310ef4c57f625c67e0d0e776500Nick Pelly return; 1404812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly } 1414812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly#endif 14223482d091c046310ef4c57f625c67e0d0e776500Nick Pelly low_level_traces = 0; 1434812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly#endif 1444812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly} 1454812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Register 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL register function. 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Register( phNfcIF_sReference_t *psRefer, 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfcIF_sCallBack_t if_cb, void *psIFConf ) 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != psRefer) && 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NULL != psRefer->plower_if) && 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NULL != if_cb.receive_complete) && 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NULL != if_cb.send_complete) 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the LLC functions to the upper layer */ 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->init = phDal4Nfc_Init; 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->release = phDal4Nfc_Shutdown; 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->send = phDal4Nfc_Write; 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->receive = phDal4Nfc_Read; 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->receive_wait = phDal4Nfc_ReadWait; 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->transact_abort = phDal4Nfc_ReadWaitCancel; 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->unregister = phDal4Nfc_Unregister; 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NULL != pgDalContext) 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy the DAL context to the upper layer */ 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psRefer->plower_if->pcontext = pgDalContext; 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the callback function from the upper layer */ 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.receive_complete = if_cb.receive_complete; 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.send_complete = if_cb.send_complete; 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.notify = if_cb.notify; 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the upper layer context */ 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.pif_ctxt = if_cb.pif_ctxt; 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the error state */ 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_SUCCESS; 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_NOT_INITIALISED); 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else /*Input parameters invalid*/ 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_PARAMETER); 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Unregister 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL unregister function. 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Unregister(void *pContext, void *pHwRef ) 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL == pContext) && (NULL == pHwRef)) 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_PARAMETER); 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NULL != pgDalContext) 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the callback function from the upper layer */ 2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.receive_complete = NULL; 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.send_complete = NULL ; 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.notify = NULL ; 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the upper layer context */ 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.pif_ctxt = NULL ; 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_NOT_INITIALISED); 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Init 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL Init function. 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Init(void *pContext, void *pHwRef ) 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2454812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly refresh_low_level_traces(); 2464812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != pContext) && (NULL != pHwRef)) 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pContext = pgDalContext; 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalHwContext = (phHal_sHwReference_t *)pHwRef; 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( gDalContext.hw_valid == TRUE ) 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The link has been opened from the application interface */ 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.open_from_handle(pgDalHwContext); 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (!gLinkFunc.is_opened()) 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_DEVICE); 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Clear link buffers */ 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.flush(); 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static phDal4Nfc_sConfig_t hw_config; 270b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen hw_config.deviceNode = NULL; 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = phDal4Nfc_Config(&hw_config, pHwRef ); 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else /*Input parametrs invalid*/ 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_INVALID_PARAMETER; 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Shutdown 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL Shutdown function. 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Shutdown( void *pContext, void *pHwRef) 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void * pThreadReturn; 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly// if (pContext == NULL) 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly// return NFCSTATUS_INVALID_PARAMETER; 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (gDalContext.hw_valid == TRUE) 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Flush the link */ 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.flush(); 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Close the message queue */ 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef USE_MQ_MESSAGE_QUEUE 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly mq_close(nDeferedCallMessageQueueId); 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 313df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMASNFCSTATUS phDal4Nfc_ConfigRelease(void *pHwRef) 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void * pThreadReturn; 318e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 319e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("phDal4Nfc_ConfigRelease "); 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (gDalContext.hw_valid == TRUE) 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 323df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS /* Signal the read and write threads to exit. NOTE: there 324df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS actually is no write thread! :) */ 325df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_PRINT("Stop Reader Thread"); 326df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS gReadWriteContext.nReadThreadAlive = 0; 327df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS gReadWriteContext.nWriteThreadAlive = 0; 328df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 329df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS /* Wake up the read thread so it can exit */ 330df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_PRINT("Release Read Semaphore"); 331df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS sem_post(&nfc_read_sem); 332df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 333df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_DEBUG("phDal4Nfc_ConfigRelease - doing pthread_join(%d)", 334df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS gReadWriteContext.nReadThread); 335df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS if (pthread_join(gReadWriteContext.nReadThread, &pThreadReturn) != 0) 336df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS { 337df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_FAILED); 338df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_PRINT("phDal4Nfc_ConfigRelease KO"); 339df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS } 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Close the message queue */ 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef USE_MQ_MESSAGE_QUEUE 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly mq_close(nDeferedCallMessageQueueId); 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Shutdown NFC Chip */ 3475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDal4Nfc_Reset(0); 3485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Close the link */ 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.close(); 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 352b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if (gDalContext.pDev != NULL) { 353b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen nfc_pn544_close(gDalContext.pDev); 354b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } 355e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Reset the Read Writer context to NULL */ 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memset((void *)&gReadWriteContext,0,sizeof(gReadWriteContext)); 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the DAL context values to NULL */ 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memset((void *)&gDalContext,0,sizeof(gDalContext)); 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gDalContext.hw_valid = FALSE; 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_DEBUG("phDal4Nfc_ConfigRelease(): %04x\n", result); 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Write 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL Write function. 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 376e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Write( void *pContext, void *pHwRef,uint8_t *pBuffer, uint16_t length) 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 380e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton static int MsgType= PHDAL4NFC_WRITE_MESSAGE; 381e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton int * pmsgType=&MsgType; 382e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton phDal4Nfc_Message_t sMsg; 383e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton phOsalNfc_Message_t OsalMsg; 384e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != pContext) && (NULL != pHwRef)&& 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NULL != pBuffer) && (0 != length)) 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( gDalContext.hw_valid== TRUE) 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((!gReadWriteContext.nWriteBusy)&& 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (!gReadWriteContext.nWaitingOnWrite)) 392e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 393e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("phDal4Nfc_Write() : Temporary buffer !! \n"); 3943e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton gReadWriteContext.pTempWriteBuffer = (uint8_t*)malloc(length * sizeof(uint8_t)); 395e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Make a copy of the passed arguments */ 3963e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton memcpy(gReadWriteContext.pTempWriteBuffer,pBuffer,length); 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_DEBUG("phDal4Nfc_Write(): %d\n", length); 3983e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton gReadWriteContext.pWriteBuffer = gReadWriteContext.pTempWriteBuffer; 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nNbOfBytesToWrite = length; 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the write state so that thread can take over the write */ 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nWriteBusy = TRUE; 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Just set variable here. This is the trigger for the Write thread */ 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nWaitingOnWrite = TRUE; 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the error state */ 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_PENDING; 406e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Send Message and perform physical write in the DefferedCallback */ 407e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* read completed immediately */ 408e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton sMsg.eMsgType= PHDAL4NFC_WRITE_MESSAGE; 409e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Update the state */ 410e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton phDal4Nfc_FillMsg(&sMsg,&OsalMsg); 411e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType); 412e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton memset(&sMsg,0,sizeof(phDal4Nfc_Message_t)); 413e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t)); 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Driver is BUSY with previous Write */ 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT("phDal4Nfc_Write() : Busy \n"); 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_BUSY) ; 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TBD :Additional error code : NOT_INITIALISED */ 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_DEVICE); 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/*end if-Input parametrs valid-check*/ 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_INVALID_PARAMETER; 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Read 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL Read function. 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Read( void *pContext, void *pHwRef,uint8_t *pBuffer, uint16_t length) 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != pContext) && (NULL != pHwRef)&& 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NULL != pBuffer) && (0 != length)) 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( gDalContext.hw_valid== TRUE) 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((!gReadWriteContext.nReadBusy)&& 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (!gReadWriteContext.nWaitingOnRead)) 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_DEBUG("*****DAl Read called length : %d\n", length); 457e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Make a copy of the passed arguments */ 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.pReadBuffer = pBuffer; 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nNbOfBytesToRead = length; 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the Read state so that thread can take over the read */ 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nReadBusy = TRUE; 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Just set variable here. This is the trigger for the Reader thread */ 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nWaitingOnRead = TRUE; 465e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Update the return state */ 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_PENDING; 467e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* unlock reader thread */ 468e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton sem_post(&nfc_read_sem); 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Driver is BUSY with prev Read */ 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT("DAL BUSY\n"); 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Make a copy of the passed arguments */ 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.pReadBuffer = pBuffer; 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nNbOfBytesToRead = length; 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_PENDING; 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TBD :Additional error code : NOT_INITIALISED */ 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_DEVICE); 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/*end if-Input parametrs valid-check*/ 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = NFCSTATUS_INVALID_PARAMETER; 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_DEBUG("*****DAl Read called result : %x\n", result); 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_ReadWait 4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: DAL Read wait function. 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_ReadWait(void *pContext, void *pHwRef,uint8_t *pBuffer, uint16_t length) 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 505e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* not used */ 506e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("phDal4Nfc_ReadWait"); 507e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton return 0; 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_ReadWaitCancel 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: Cancel the Read wait function. 5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_ReadWaitCancel( void *pContext, void *pHwRef) 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 51973fcd52e49db49449613035a3bce8b04d9890f72daniel_Tomas DAL_PRINT("phDal4Nfc_ReadWaitCancel"); 52073fcd52e49db49449613035a3bce8b04d9890f72daniel_Tomas 52173fcd52e49db49449613035a3bce8b04d9890f72daniel_Tomas /* unlock read semaphore */ 52273fcd52e49db49449613035a3bce8b04d9890f72daniel_Tomas sem_post(&nfc_read_sem); 52373fcd52e49db49449613035a3bce8b04d9890f72daniel_Tomas 5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return 0; 5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------- 5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFUNCTION: phDal4Nfc_Config 5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyPURPOSE: Configure the serial port. 5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------*/ 5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref) 5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS retstatus = NFCSTATUS_SUCCESS; 537b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen const hw_module_t* hw_module; 538b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen nfc_pn544_device_t* pn544_dev; 539b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen uint8_t num_eeprom_settings; 540b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen uint8_t* eeprom_settings; 541b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen int ret; 542b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen 543b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen /* Retrieve the hw module from the Android NFC HAL */ 544b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen ret = hw_get_module(NFC_HARDWARE_MODULE_ID, &hw_module); 545b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if (ret) { 546a12acb119fa8cda91ca23d191b41b9438402e4d1Steve Block ALOGE("hw_get_module() failed"); 547b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen return NFCSTATUS_FAILED; 548b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } 549b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen ret = nfc_pn544_open(hw_module, &pn544_dev); 550b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if (ret) { 551a12acb119fa8cda91ca23d191b41b9438402e4d1Steve Block ALOGE("Could not open pn544 hw_module"); 552b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen return NFCSTATUS_FAILED; 553b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } 554b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen config->deviceNode = pn544_dev->device_node; 555b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if (config->deviceNode == NULL) { 556a12acb119fa8cda91ca23d191b41b9438402e4d1Steve Block ALOGE("deviceNode NULL"); 557b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen return NFCSTATUS_FAILED; 558b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } 5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT("phDal4Nfc_Config"); 5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 562b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if ((config == NULL) || (phwref == NULL)) 5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_INVALID_PARAMETER; 5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the link callbacks */ 5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memset(&gLinkFunc, 0, sizeof(phDal4Nfc_link_cbk_interface_t)); 567b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen switch(pn544_dev->linktype) 5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 569b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen case PN544_LINK_TYPE_UART: 570b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen case PN544_LINK_TYPE_USB: 5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5723e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton DAL_PRINT("UART link Config"); 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Uart link interface */ 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.init = phDal4Nfc_uart_initialize; 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.open_from_handle = phDal4Nfc_uart_set_open_from_handle; 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.is_opened = phDal4Nfc_uart_is_opened; 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.flush = phDal4Nfc_uart_flush; 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.close = phDal4Nfc_uart_close; 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.open_and_configure = phDal4Nfc_uart_open_and_configure; 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.read = phDal4Nfc_uart_read; 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.write = phDal4Nfc_uart_write; 5825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas gLinkFunc.reset = phDal4Nfc_uart_reset; 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 586b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen case PN544_LINK_TYPE_I2C: 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5883e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton DAL_PRINT("I2C link Config"); 5893e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton /* i2c link interface */ 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.init = phDal4Nfc_i2c_initialize; 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.open_from_handle = phDal4Nfc_i2c_set_open_from_handle; 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.is_opened = phDal4Nfc_i2c_is_opened; 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.flush = phDal4Nfc_i2c_flush; 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.close = phDal4Nfc_i2c_close; 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.open_and_configure = phDal4Nfc_i2c_open_and_configure; 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.read = phDal4Nfc_i2c_read; 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.write = phDal4Nfc_i2c_write; 5985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas gLinkFunc.reset = phDal4Nfc_i2c_reset; 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Shound not happen : Bad parameter */ 6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_PARAMETER); 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gLinkFunc.init(); /* So that link interface can initialize its internal state */ 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly retstatus = gLinkFunc.open_and_configure(config, phwref); 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (retstatus != NFCSTATUS_SUCCESS) 6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return retstatus; 6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Iniatilize the DAL context */ 6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memset(&gDalContext,0,sizeof(phDal4Nfc_SContext_t)); 6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext = &gDalContext; 617e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the Reader Thread values to NULL */ 6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memset((void *)&gReadWriteContext,0,sizeof(gReadWriteContext)); 6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nReadThreadAlive = TRUE; 621e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nWriteBusy = FALSE; 622e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nWaitingOnWrite = FALSE; 623e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Prepare the message queue for the defered calls */ 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef USE_MQ_MESSAGE_QUEUE 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedCallMessageQueueId = mq_open(MQ_NAME_IDENTIFIER, O_CREAT|O_RDWR, 0666, &MQ_QUEUE_ATTRIBUTES); 6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedCallMessageQueueId = config->nClientId; 6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 630b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen 631b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen gDalContext.pDev = pn544_dev; 632b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Start Read and Write Threads */ 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NFCSTATUS_SUCCESS != phDal4Nfc_StartThreads()) 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_FAILED); 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gDalContext.hw_valid = TRUE; 640df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS phDal4Nfc_Reset(1); 6413e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton phDal4Nfc_Reset(0); 6423e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton phDal4Nfc_Reset(1); 6433e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_SUCCESS; 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6473e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton/*----------------------------------------------------------------------------- 6483e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6493e98767aaf73b4779a2bb39601806045b2ba1739Jeff HamiltonFUNCTION: phDal4Nfc_Reset 6503e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6513e98767aaf73b4779a2bb39601806045b2ba1739Jeff HamiltonPURPOSE: Reset the PN544, using the VEN pin 6523e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6533e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton-----------------------------------------------------------------------------*/ 6543e98767aaf73b4779a2bb39601806045b2ba1739Jeff HamiltonNFCSTATUS phDal4Nfc_Reset(long level) 6553e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton{ 6563e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton NFCSTATUS retstatus = NFCSTATUS_SUCCESS; 6573e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 65834ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly DAL_DEBUG("phDal4Nfc_Reset: VEN to %ld",level); 6593e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6603e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton retstatus = gLinkFunc.reset(level); 6613e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6623e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton return retstatus; 6633e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton} 6643e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6653e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton/*----------------------------------------------------------------------------- 6663e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6673e98767aaf73b4779a2bb39601806045b2ba1739Jeff HamiltonFUNCTION: phDal4Nfc_Download 6683e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6693e98767aaf73b4779a2bb39601806045b2ba1739Jeff HamiltonPURPOSE: Put the PN544 in download mode, using the GPIO4 pin 6703e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6713e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton-----------------------------------------------------------------------------*/ 6725e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS phDal4Nfc_Download() 6733e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton{ 6743e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton NFCSTATUS retstatus = NFCSTATUS_SUCCESS; 6753e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DAL_DEBUG("phDal4Nfc_Download: GPIO4 to %d",1); 6773e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas usleep(10000); 6795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas retstatus = phDal4Nfc_Reset(2); 6803e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton 6813e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton return retstatus; 6823e98767aaf73b4779a2bb39601806045b2ba1739Jeff Hamilton} 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*----------------------------------------------------------------------------------- 6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL INTERNAL IMPLEMENTATION 6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly------------------------------------------------------------------------------------*/ 6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_nfc_dal 6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL Reader thread handler 6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function manages the reads from the link interface. The reads are done from 6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * this thread to create the asynchronous mecanism. When calling the synchronous 6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * function phDal4Nfc_Read, the nWaitingOnRead mutex is unlocked and the read 6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * can be done. Then a client callback is called to send the result. 7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] pArg A custom argument that can be passed to the thread (not used) 7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval TRUE Thread exiting. 7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 705e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyint phDal4Nfc_ReaderThread(void * pArg) 7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly char retvalue; 7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t retry_cnt=0; 7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void * memsetRet; 7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static int MsgType= PHDAL4NFC_READ_MESSAGE; 7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int * pmsgType=&MsgType; 7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phDal4Nfc_Message_t sMsg; 7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_Message_t OsalMsg ; 7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int i; 71992c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly int i2c_error_count; 720b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen int i2c_workaround; 7213f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal int i2c_device_address = 0x57; 722b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen if (gDalContext.pDev != NULL) { 723b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen i2c_workaround = gDalContext.pDev->enable_i2c_workaround; 7243f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal if (gDalContext.pDev->i2c_device_address) { 7253f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal i2c_device_address = gDalContext.pDev->i2c_device_address; 7263f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal if (i2c_workaround && i2c_device_address < 32) 7273f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal { 728c67f72f38f9c22b8a3c217a0807b40f2eda78f08Ramanan Rajeswaran ALOGE("i2c_device_address not set to valid value"); 7293f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal return NFCSTATUS_FAILED; 7303f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal } 7313f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal } 732b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } else { 733a12acb119fa8cda91ca23d191b41b9438402e4d1Steve Block ALOGE("gDalContext.pDev is not set"); 734b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen return NFCSTATUS_FAILED; 735b99be65c277b0cc65a00a33e784ed49461531737Martijn Coenen } 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7378763a1998eee9b43169bf0824a77b00b3b88a938Nick Pelly pthread_setname_np(pthread_self(), "reader"); 7388763a1998eee9b43169bf0824a77b00b3b88a938Nick Pelly 7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Create the overlapped event. Must be closed before exiting 7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly to avoid a handle leak. This event is used READ API and the Reader thread*/ 7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT("RX Thread \n"); 743e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_DEBUG("\nRX Thread nReadThreadAlive = %d",gReadWriteContext.nReadThreadAlive); 744e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_DEBUG("\nRX Thread nWaitingOnRead = %d",gReadWriteContext.nWaitingOnRead); 7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly while(gReadWriteContext.nReadThreadAlive) /* Thread Loop */ 7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check for the read request from user */ 748e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("RX Thread Sem Lock\n"); 749e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton sem_wait(&nfc_read_sem); 750e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("RX Thread Sem UnLock\n"); 751df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 752df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS if (!gReadWriteContext.nReadThreadAlive) 753df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS { 754df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS /* got the signal that we should exit. NOTE: we don't 755df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS attempt to read below, since the read may block */ 756df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS break; 757df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS } 758df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 759e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Issue read operation.*/ 76092c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly 76192c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly i2c_error_count = 0; 76292c7e0144b84a27b4573043fef718a8ba458d062Nick Pellyretry: 763e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nNbOfBytesRead=0; 764df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_DEBUG("RX Thread *New *** *****Request Length = %d",gReadWriteContext.nNbOfBytesToRead); 765e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton memsetRet=memset(gReadWriteContext.pReadBuffer,0,gReadWriteContext.nNbOfBytesToRead); 766e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 767e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Wait for IRQ !!! */ 768e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead); 769e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas 7703f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal /* A read value equal to the i2c_device_address indicates a HW I2C error at I2C address i2c_device_address 771e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas * (pn544). There should not be false positives because a read of length 1 7723f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal * must be a HCI length read, and a length of i2c_device_address is impossible (max is 33). 773e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas */ 7743f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal if (i2c_workaround && gReadWriteContext.nNbOfBytesToRead == 1 && 7753f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal gReadWriteContext.pReadBuffer[0] == i2c_device_address) 776e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas { 77792c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly i2c_error_count++; 7783f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal DAL_DEBUG("RX Thread Read 0x%02x ", i2c_device_address); 7793f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal DAL_DEBUG("%d times\n", i2c_error_count); 7803f791036276b6f535ad253dd25650fad60c72695Rakesh Goyal 78192c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly if (i2c_error_count < 5) { 78292c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly usleep(2000); 78392c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly goto retry; 78492c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly } 785df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_PRINT("RX Thread NOTHING TO READ, RECOVER"); 786e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1); 787e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas } 788e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas else 789e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas { 79092c7e0144b84a27b4573043fef718a8ba458d062Nick Pelly i2c_error_count = 0; 7914812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly 7924812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly if (low_level_traces) 7934812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly { 7945ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly phOsalNfc_PrintData("RECV", (uint16_t)gReadWriteContext.nNbOfBytesRead, 7955ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly gReadWriteContext.pReadBuffer, low_level_traces); 7964812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly } 797df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_DEBUG("RX Thread Read ok. nbToRead=%d\n", gReadWriteContext.nNbOfBytesToRead); 798df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_DEBUG("RX Thread NbReallyRead=%d\n", gReadWriteContext.nNbOfBytesRead); 79971b688d07db1e7fd32a1e02f29b9779f0d0db377Jeff Hamilton/* DAL_PRINT("RX Thread ReadBuff[]={ "); 800e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton for (i = 0; i < gReadWriteContext.nNbOfBytesRead; i++) 8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 802df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_DEBUG("RX Thread 0x%x ", gReadWriteContext.pReadBuffer[i]); 8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 80471b688d07db1e7fd32a1e02f29b9779f0d0db377Jeff Hamilton DAL_PRINT("RX Thread }\n"); */ 805e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 806e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas /* read completed immediately */ 807e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE; 808e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas /* Update the state */ 809e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas phDal4Nfc_FillMsg(&sMsg,&OsalMsg); 810e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType); 811e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas memsetRet=memset(&sMsg,0,sizeof(phDal4Nfc_Message_t)); 812e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas memsetRet=memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t)); 813e5201c1575b080d023a36ed36edd8017f5c4ce28Daniel Tomas } 814e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* End of thread Loop*/ 816df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 817df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS DAL_PRINT("RX Thread exiting"); 818df82c4dd7c6d5ad232b5628edf73aa9ea3f8c2c0Daniel TOMAS 8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return TRUE; 8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_nfc_dal 8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL Start threads function 8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function is called from phDal4Nfc_Config and is responsible of creating the 829e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton * reader thread. 8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval NFCSTATUS_SUCCESS If success. 8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \retval NFCSTATUS_FAILED Can not create thread or retreive its attributes 8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phDal4Nfc_StartThreads(void) 8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pthread_attr_t nReadThreadAttributes; 8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pthread_attr_t nWriteThreadAttributes; 8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int ret; 8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 840e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton if(sem_init(&nfc_read_sem, 0, 0) == -1) 841e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 842e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT("NFC Init Semaphore creation Error"); 843e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton return -1; 844e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ret = pthread_create(&gReadWriteContext.nReadThread, NULL, (pphDal4Nfc_thread_handler_t)phDal4Nfc_ReaderThread, (void*) "dal_read_thread"); 8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(ret != 0) 8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return(PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_FAILED)); 849e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_SUCCESS; 8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_nfc_dal 8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL fill message function 8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Internal messages management. This function fills message structure 8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * depending on message types. 8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in, out] pDalMsg DAL message to fill 8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in, out] pOsalMsg OSAL message to fill 8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phDal4Nfc_FillMsg(phDal4Nfc_Message_t *pDalMsg,phOsalNfc_Message_t *pOsalMsg) 8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL != pgDalHwContext) 8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pDalMsg->eMsgType == PHDAL4NFC_WRITE_MESSAGE) 8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.length = (uint8_t)gReadWriteContext.nNbOfBytesWritten; 8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.buffer = NULL; 8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.status = NFCSTATUS_SUCCESS; 8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->pHwRef = pgDalHwContext; 8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->writeCbPtr = pgDalContext->cb_if.send_complete; 8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pOsalMsg->eMsgType = PH_DAL4NFC_MESSAGE_BASE; 8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pOsalMsg->pMsgData = pDalMsg; 8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return; 8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(pDalMsg->eMsgType == PHDAL4NFC_READ_MESSAGE) 8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.length = (uint8_t)gReadWriteContext.nNbOfBytesRead; 8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.buffer = gReadWriteContext.pReadBuffer; 8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->pContext= pgDalContext->cb_if.pif_ctxt; 8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.length = (uint8_t)gReadWriteContext.nNbOfBytesReadWait; 8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.buffer = gReadWriteContext.pReadWaitBuffer; 8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->pContext= pgDalContext; 8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->transactInfo.status = NFCSTATUS_SUCCESS; 8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->pHwRef = pgDalHwContext; 8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDalMsg->readCbPtr = pgDalContext->cb_if.receive_complete; 8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*map to OSAL msg format*/ 8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pOsalMsg->eMsgType = PH_DAL4NFC_MESSAGE_BASE; 8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pOsalMsg->pMsgData = pDalMsg; 8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_nfc_dal 9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL deferred callback function 9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Generic handler function called by a client thread when reading a message from the queue. 9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Will function will directly call the client function (same context). See phDal4Nfc_DeferredCall 9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] params Parameter that will be passed to the client function. 9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phDal4Nfc_DeferredCb (void *params) 9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int* pParam=NULL; 914e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton int i; 9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sTransactionInfo_t TransactionInfo; 9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pParam=(int*)params; 9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(*pParam) 9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PHDAL4NFC_READ_MESSAGE: 9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT(" Dal deferred read called \n"); 9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TransactionInfo.buffer=gReadWriteContext.pReadBuffer; 9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TransactionInfo.length=(uint16_t)gReadWriteContext.nNbOfBytesRead; 9255ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly if (gReadWriteContext.nNbOfBytesRead == gReadWriteContext.nNbOfBytesToRead) { 9265ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly TransactionInfo.status=NFCSTATUS_SUCCESS; 9275ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly } else { 9285ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly TransactionInfo.status=NFCSTATUS_READ_FAILED; 9295ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly } 9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nReadBusy = FALSE; 931e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 932e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset flag so that another opertion can be issued.*/ 9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly gReadWriteContext.nWaitingOnRead = FALSE; 9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != pgDalContext) && (NULL != pgDalContext->cb_if.receive_complete)) 9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.receive_complete(pgDalContext->cb_if.pif_ctxt, 9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalHwContext,&TransactionInfo); 9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 940e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PHDAL4NFC_WRITE_MESSAGE: 9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DAL_PRINT(" Dal deferred write called \n"); 944c1f33130d9d2100e6232f8f3c782949c75205be6Daniel Tomas 9454812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly if(low_level_traces) 9464812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly { 9475ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly phOsalNfc_PrintData("SEND", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, 9485ea62ad25e2050f543d8e2104f5ffc1bb2c1ef28Nick Pelly gReadWriteContext.pWriteBuffer, low_level_traces); 9494812a72ceaada294477b4c2015c42cb8bcbe93a4Nick Pelly } 950c1f33130d9d2100e6232f8f3c782949c75205be6Daniel Tomas 9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* DAL_DEBUG("dalMsg->transactInfo.length : %d\n", dalMsg->transactInfo.length); */ 952e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Make a Physical WRITE */ 95374decc93d868ec1a8f3975a4ce3d1548c6ec6d8fNick Pelly /* NOTE: need to usleep(3000) here if the write is for SWP */ 95499141cdd942973bc0cb8ef208ef717b14eb73b8eNick Pelly usleep(500); /* NXP advise 500us sleep required between I2C writes */ 955e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nNbOfBytesWritten = gLinkFunc.write(gReadWriteContext.pWriteBuffer, gReadWriteContext.nNbOfBytesToWrite); 956e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton if (gReadWriteContext.nNbOfBytesWritten != gReadWriteContext.nNbOfBytesToWrite) 957e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 958e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* controller may be in standby. do it again! */ 959e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton usleep(10000); /* wait 10 ms */ 960e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nNbOfBytesWritten = gLinkFunc.write(gReadWriteContext.pWriteBuffer, gReadWriteContext.nNbOfBytesToWrite); 961e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 962e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton if (gReadWriteContext.nNbOfBytesWritten != gReadWriteContext.nNbOfBytesToWrite) 963e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 964e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Report write failure or timeout */ 965e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT(" Physical Write Error !!! \n"); 966e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton TransactionInfo.length=(uint16_t)gReadWriteContext.nNbOfBytesWritten; 967e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton TransactionInfo.status = PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_BOARD_COMMUNICATION_ERROR); 968e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 969e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton else 970e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 971e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_PRINT(" Physical Write Success \n"); 972e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton TransactionInfo.length=(uint16_t)gReadWriteContext.nNbOfBytesWritten; 973e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton TransactionInfo.status=NFCSTATUS_SUCCESS; 97434ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly/* DAL_PRINT("WriteBuff[]={ "); 975e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton for (i = 0; i < gReadWriteContext.nNbOfBytesWritten; i++) 976e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 977e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton DAL_DEBUG("0x%x ", gReadWriteContext.pWriteBuffer[i]); 978e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 97934ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly DAL_PRINT("}\n"); */ 9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 981e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton // Free TempWriteBuffer 982e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton if(gReadWriteContext.pTempWriteBuffer != NULL) 983e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton { 984e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton free(gReadWriteContext.pTempWriteBuffer); 985e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 986e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton } 987e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* Reset Write context */ 988e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nWriteBusy = FALSE; 989e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton gReadWriteContext.nWaitingOnWrite = FALSE; 990e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton 991e7f38d39c75da44b181ef924d215411e048a5848Jeff Hamilton /* call LLC callback */ 9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NULL != pgDalContext) && (NULL != pgDalContext->cb_if.send_complete)) 9935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalContext->cb_if.send_complete(pgDalContext->cb_if.pif_ctxt, 9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pgDalHwContext,&TransactionInfo); 9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_nfc_dal 10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief DAL deferred call function 10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function will enable to call the callback client asyncronously and in the client context. 10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * It will post a message in a queue that will be processed by a client thread. 10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] func The function to call when message is read from the queue 10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \param[in] param Parameter that will be passed to the 'func' function. 10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phDal4Nfc_DeferredCall(pphDal4Nfc_DeferFuncPointer_t func, void *param) 10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int retvalue = 0; 10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phDal4Nfc_Message_Wrapper_t nDeferedMessageWrapper; 10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phDal4Nfc_DeferredCall_Msg_t *pDeferedMessage; 10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static phDal4Nfc_DeferredCall_Msg_t nDeferedMessageRead; 10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static phDal4Nfc_DeferredCall_Msg_t nDeferedMessageWrite; 10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef USE_MQ_MESSAGE_QUEUE 10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessage.eMsgType = PH_DAL4NFC_MESSAGE_BASE; 10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessage.def_call = func; 10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessage.params = param; 10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly retvalue = (int)mq_send(nDeferedCallMessageQueueId, (char *)&nDeferedMessage, sizeof(phDal4Nfc_DeferredCall_Msg_t), 0); 10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(PHDAL4NFC_READ_MESSAGE==(* (int*)param)) 10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDeferedMessage = &nDeferedMessageRead; 10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDeferedMessage = &nDeferedMessageWrite; 10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessageWrapper.mtype = 1; 10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessageWrapper.msg.eMsgType = PH_DAL4NFC_MESSAGE_BASE; 10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDeferedMessage->pCallback = func; 10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pDeferedMessage->pParameter = param; 10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessageWrapper.msg.pMsgData = pDeferedMessage; 10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly nDeferedMessageWrapper.msg.Size = sizeof(phDal4Nfc_DeferredCall_Msg_t); 10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly retvalue = phDal4Nfc_msgsnd(nDeferedCallMessageQueueId, (struct msgbuf *)&nDeferedMessageWrapper, sizeof(phLibNfc_Message_t), 0); 10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#undef _DAL_4_NFC_C 1048