1 #define LOG_TAG "android.hardware.nfc@1.0-impl"
2 
3 #include <log/log.h>
4 
5 #include <hardware/hardware.h>
6 #include <hardware/nfc.h>
7 #include "Nfc.h"
8 
9 namespace android {
10 namespace hardware {
11 namespace nfc {
12 namespace V1_0 {
13 namespace implementation {
14 
15 sp<INfcClientCallback> Nfc::mCallback = nullptr;
16 
Nfc(nfc_nci_device_t * device)17 Nfc::Nfc(nfc_nci_device_t* device) : mDevice(device),
18     mDeathRecipient(new NfcDeathRecipient(this)) {
19 }
20 
21 // Methods from ::android::hardware::nfc::V1_0::INfc follow.
open(const sp<INfcClientCallback> & clientCallback)22 ::android::hardware::Return<NfcStatus> Nfc::open(const sp<INfcClientCallback>& clientCallback)  {
23     mCallback = clientCallback;
24 
25     if (mDevice == nullptr || mCallback == nullptr) {
26         return NfcStatus::FAILED;
27     }
28     mCallback->linkToDeath(mDeathRecipient, 0 /*cookie*/);
29     int ret = mDevice->open(mDevice, eventCallback, dataCallback);
30     return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
31 }
32 
write(const hidl_vec<uint8_t> & data)33 ::android::hardware::Return<uint32_t> Nfc::write(const hidl_vec<uint8_t>& data)  {
34     if (mDevice == nullptr) {
35         return -1;
36     }
37     return mDevice->write(mDevice, data.size(), &data[0]);
38 }
39 
coreInitialized(const hidl_vec<uint8_t> & data)40 ::android::hardware::Return<NfcStatus> Nfc::coreInitialized(const hidl_vec<uint8_t>& data)  {
41     hidl_vec<uint8_t> copy = data;
42 
43     if (mDevice == nullptr) {
44         return NfcStatus::FAILED;
45     }
46     int ret = mDevice->core_initialized(mDevice, &copy[0]);
47     return ret == 0 ? NfcStatus::OK : NfcStatus::FAILED;
48 }
49 
prediscover()50 ::android::hardware::Return<NfcStatus> Nfc::prediscover()  {
51     if (mDevice == nullptr) {
52         return NfcStatus::FAILED;
53     }
54     return mDevice->pre_discover(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
55 }
56 
close()57 ::android::hardware::Return<NfcStatus> Nfc::close()  {
58     if (mDevice == nullptr || mCallback == nullptr) {
59         return NfcStatus::FAILED;
60     }
61     mCallback->unlinkToDeath(mDeathRecipient);
62     return mDevice->close(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
63 }
64 
controlGranted()65 ::android::hardware::Return<NfcStatus> Nfc::controlGranted()  {
66     if (mDevice == nullptr) {
67         return NfcStatus::FAILED;
68     }
69     return mDevice->control_granted(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
70 }
71 
powerCycle()72 ::android::hardware::Return<NfcStatus> Nfc::powerCycle()  {
73     if (mDevice == nullptr) {
74         return NfcStatus::FAILED;
75     }
76     return mDevice->power_cycle(mDevice) ? NfcStatus::FAILED : NfcStatus::OK;
77 }
78 
79 
HIDL_FETCH_INfc(const char *)80 INfc* HIDL_FETCH_INfc(const char * /*name*/) {
81     nfc_nci_device_t* nfc_device;
82     int ret = 0;
83     const hw_module_t* hw_module = nullptr;
84 
85     ret = hw_get_module (NFC_NCI_HARDWARE_MODULE_ID, &hw_module);
86     if (ret == 0) {
87         ret = nfc_nci_open (hw_module, &nfc_device);
88         if (ret != 0) {
89             ALOGE ("nfc_nci_open failed: %d", ret);
90         }
91     }
92     else
93         ALOGE ("hw_get_module %s failed: %d", NFC_NCI_HARDWARE_MODULE_ID, ret);
94 
95     if (ret == 0) {
96         return new Nfc(nfc_device);
97     } else {
98         ALOGE("Passthrough failed to load legacy HAL.");
99         return nullptr;
100     }
101 }
102 
103 } // namespace implementation
104 }  // namespace V1_0
105 }  // namespace nfc
106 }  // namespace hardware
107 }  // namespace android
108