blob: a1e50f059c17ce020ab5a10e4c3d36faec096e07 [file] [log] [blame]
#define LOG_TAG "android.hardware.nfc@1.0-impl"
#include <log/log.h>
#include <hardware/hardware.h>
#include <hardware/nfc.h>
#include "Nfc.h"
namespace android {
namespace hardware {
namespace nfc {
namespace V1_0 {
namespace implementation {
sp<INfcClientCallback> Nfc::mCallback = nullptr;
Nfc::Nfc(nfc_nci_device_t* device) : mDevice(device) {}
// Methods from ::android::hardware::nfc::V1_0::INfc follow.
::android::hardware::Return<NfcStatus> Nfc::open(const sp<INfcClientCallback>& clientCallback) {
mCallback = clientCallback;
if (mDevice == nullptr || mCallback == nullptr) {
return NfcStatus::FAILED;
}
mCallback->linkToDeath(this, 0 /*cookie*/);
int ret = mDevice->open(mDevice, eventCallback, dataCallback);
return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
}
::android::hardware::Return<uint32_t> Nfc::write(const hidl_vec<uint8_t>& data) {
if (mDevice == nullptr) {
return -1;
}
return mDevice->write(mDevice, data.size(), &data[0]);
}
::android::hardware::Return<NfcStatus> Nfc::coreInitialized(const hidl_vec<uint8_t>& data) {
hidl_vec<uint8_t> copy = data;
if (mDevice == nullptr || copy.size() == 0) {
return NfcStatus::FAILED;
}
int ret = mDevice->core_initialized(mDevice, &copy[0]);
return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
}
::android::hardware::Return<NfcStatus> Nfc::prediscover() {
if (mDevice == nullptr) {
return NfcStatus::FAILED;
}
return mDevice->pre_discover(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}
::android::hardware::Return<NfcStatus> Nfc::close() {
if (mDevice == nullptr || mCallback == nullptr) {
return NfcStatus::FAILED;
}
mCallback->unlinkToDeath(this);
return mDevice->close(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}
::android::hardware::Return<NfcStatus> Nfc::controlGranted() {
if (mDevice == nullptr) {
return NfcStatus::FAILED;
}
return mDevice->control_granted(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}
::android::hardware::Return<NfcStatus> Nfc::powerCycle() {
if (mDevice == nullptr) {
return NfcStatus::FAILED;
}
return mDevice->power_cycle(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
}
INfc* HIDL_FETCH_INfc(const char * /*name*/) {
nfc_nci_device_t* nfc_device;
int ret = 0;
const hw_module_t* hw_module = nullptr;
ret = hw_get_module (NFC_NCI_HARDWARE_MODULE_ID, &hw_module);
if (ret == 0) {
ret = nfc_nci_open (hw_module, &nfc_device);
if (ret != 0) {
ALOGE ("nfc_nci_open failed: %d", ret);
}
}
else
ALOGE ("hw_get_module %s failed: %d", NFC_NCI_HARDWARE_MODULE_ID, ret);
if (ret == 0) {
return new Nfc(nfc_device);
} else {
ALOGE("Passthrough failed to load legacy HAL.");
return nullptr;
}
}
} // namespace implementation
} // namespace V1_0
} // namespace nfc
} // namespace hardware
} // namespace android