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