1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Copyright (C) 2011-2012 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#pragma once 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <pthread.h> 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef UINT32 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttypedef unsigned long UINT32; 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "nfc_target.h" 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h" 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <hardware/nfc.h> 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass ThreadMutex 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectpublic: 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ThreadMutex(); 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual ~ThreadMutex(); 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void lock(); 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void unlock(); 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project operator pthread_mutex_t* () {return &mMutex;} 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectprivate: 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pthread_mutex_t mMutex; 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass ThreadCondVar : public ThreadMutex 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectpublic: 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ThreadCondVar(); 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual ~ThreadCondVar(); 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void signal(); 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void wait(); 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project operator pthread_cond_t* () {return &mCondVar;} 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project operator pthread_mutex_t* () {return ThreadMutex::operator pthread_mutex_t*();} 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectprivate: 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pthread_cond_t mCondVar; 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass AutoThreadMutex 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectpublic: 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project AutoThreadMutex(ThreadMutex &m); 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual ~AutoThreadMutex(); 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project operator ThreadMutex& () {return mm;} 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project operator pthread_mutex_t* () {return (pthread_mutex_t*)mm;} 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectprivate: 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ThreadMutex &mm; 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass NfcAdaptation 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectpublic: 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual ~NfcAdaptation(); 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void Initialize(); 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void Finalize(); 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static NfcAdaptation& GetInstance(); 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_ENTRY* GetHalEntryFuncs (); 725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen void DownloadFirmware (); 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectprivate: 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NfcAdaptation(); 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void signal(); 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static NfcAdaptation* mpInstance; 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static ThreadMutex sLock; 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ThreadCondVar mCondVar; 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_ENTRY mHalEntryFuncs; // function pointers for HAL entry points 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static nfc_nci_device_t* mHalDeviceContext; 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static tHAL_NFC_CBACK* mHalCallback; 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static tHAL_NFC_DATA_CBACK* mHalDataCallback; 845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen static ThreadCondVar mHalOpenCompletedEvent; 855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen static ThreadCondVar mHalCloseCompletedEvent; 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static UINT32 NFCA_TASK (UINT32 arg); 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static UINT32 Thread (UINT32 arg); 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void InitializeHalDeviceContext (); 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalDeviceContextCallback (nfc_event_t event, nfc_status_t event_status); 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalDeviceContextDataCallback (uint16_t data_len, uint8_t* p_data); 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalInitialize (); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalTerminate (); 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalOpen (tHAL_NFC_CBACK* p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback); 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalClose (); 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalCoreInitialized (UINT8* p_core_init_rsp_params); 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalWrite (UINT16 data_len, UINT8* p_data); 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static BOOLEAN HalPrediscover (); 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalControlGranted (); 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static void HalPowerCycle (); 102b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson static UINT8 HalGetMaxNfcee (); 1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen static void HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status); 1045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen static void HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data); 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 107