11ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*
21ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
31ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  Copyright (C) 2013-2014 NXP Semiconductors
41ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
51ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  Licensed under the Apache License, Version 2.0 (the "License");
61ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  you may not use this file except in compliance with the License.
71ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  You may obtain a copy of the License at
81ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
91ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  http://www.apache.org/licenses/LICENSE-2.0
101ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
111ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  Unless required by applicable law or agreed to in writing, software
121ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  distributed under the License is distributed on an "AS IS" BASIS,
131ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  See the License for the specific language governing permissions and
151ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *  limitations under the License.
161ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
171ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao ******************************************************************************/
181ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
191ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#ifndef _PHNXPNCIHAL_UTILS_H_
201ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define _PHNXPNCIHAL_UTILS_H_
211ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
221ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <pthread.h>
231ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <semaphore.h>
241ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <phNfcStatus.h>
251ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <assert.h>
261ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
271ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/********************* Definitions and structures *****************************/
281ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
291ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* List structures */
301ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaostruct listNode
311ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao{
321ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    void* pData;
331ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    struct listNode* pNext;
341ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao};
351ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
361ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaostruct listHead
371ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao{
381ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    struct listNode* pFirst;
391ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    pthread_mutex_t mutex;
401ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao};
411ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
421ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
431ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Semaphore handling structure */
441ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaotypedef struct phNxpNciHal_Sem
451ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao{
461ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* Semaphore used to wait for callback */
471ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    sem_t sem;
481ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
491ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* Used to store the status sent by the callback */
501ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    NFCSTATUS status;
511ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
521ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* Used to provide a local context to the callback */
531ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    void* pContext;
541ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
551ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao} phNxpNciHal_Sem_t;
561ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
571ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Semaphore helper macros */
581ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define SEM_WAIT(cb_data) sem_wait(&((cb_data).sem))
591ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define SEM_POST(p_cb_data) sem_post(&((p_cb_data)->sem))
601ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
611ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Semaphore and mutex monitor */
621ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaotypedef struct phNxpNciHal_Monitor
631ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao{
641ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* Mutex protecting native library against reentrance */
651ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    pthread_mutex_t reentrance_mutex;
661ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
671ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* Mutex protecting native library against concurrency */
681ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    pthread_mutex_t concurrency_mutex;
691ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
701ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    /* List used to track pending semaphores waiting for callback */
711ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    struct listHead sem_list;
721ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
731ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao} phNxpNciHal_Monitor_t;
741ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
751ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/************************ Exposed functions ***********************************/
761ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* List functions */
771ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaoint listInit(struct listHead* pList);
781ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaoint listDestroy(struct listHead* pList);
791ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaoint listAdd(struct listHead* pList, void* pData);
801ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaoint listRemove(struct listHead* pList, void* pData);
811ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaoint listGetAndRemoveNext(struct listHead* pList, void** ppData);
821ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid listDump(struct listHead* pList);
831ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
841ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* NXP NCI HAL utility functions */
851ab8a755853d5118d6a504311d079bd5aa21a964Jizhou LiaophNxpNciHal_Monitor_t* phNxpNciHal_init_monitor(void);
861ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid phNxpNciHal_cleanup_monitor(void);
871ab8a755853d5118d6a504311d079bd5aa21a964Jizhou LiaophNxpNciHal_Monitor_t* phNxpNciHal_get_monitor(void);
881ab8a755853d5118d6a504311d079bd5aa21a964Jizhou LiaoNFCSTATUS phNxpNciHal_init_cb_data(phNxpNciHal_Sem_t *pCallbackData,
891ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao        void *pContext);
901ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid phNxpNciHal_cleanup_cb_data(phNxpNciHal_Sem_t* pCallbackData);
911ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid phNxpNciHal_releaseall_cb_data(void);
921ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid phNxpNciHal_print_packet(const char *pString, const uint8_t *p_data,
931ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao        uint16_t len);
941ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaovoid phNxpNciHal_emergency_recovery(void);
951ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
961ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Lock unlock helper macros */
971ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Lock unlock helper macros */
981ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define REENTRANCE_LOCK()      if (phNxpNciHal_get_monitor()) pthread_mutex_lock(&phNxpNciHal_get_monitor()->reentrance_mutex)
991ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define REENTRANCE_UNLOCK()    if (phNxpNciHal_get_monitor()) pthread_mutex_unlock(&phNxpNciHal_get_monitor()->reentrance_mutex)
1001ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define CONCURRENCY_LOCK()     if (phNxpNciHal_get_monitor()) pthread_mutex_lock(&phNxpNciHal_get_monitor()->concurrency_mutex)
1011ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define CONCURRENCY_UNLOCK()   if (phNxpNciHal_get_monitor()) pthread_mutex_unlock(&phNxpNciHal_get_monitor()->concurrency_mutex)
1021ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1031ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#endif /* _PHNXPNCIHAL_UTILS_H_ */
104