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