11c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/*
21c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Copyright (C) 2012 The Android Open Source Project
31c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *
41c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
51c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * you may not use this file except in compliance with the License.
61c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * You may obtain a copy of the License at
71c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *
81c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *      http://www.apache.org/licenses/LICENSE-2.0
91c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen *
101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Unless required by applicable law or agreed to in writing, software
111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * See the License for the specific language governing permissions and
141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * limitations under the License.
151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */
161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <errno.h>
171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <string.h>
181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <cutils/log.h>
201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/hardware.h>
211c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/nfc.h>
221c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
231c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
241c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/*
251c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * NCI HAL method implementations. These must be overriden
261c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */
271c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_open(const struct nfc_nci_device *dev,
28442752aecdc54c32e77227e792fca64dcf1c1fb8Martijn Coenen        nfc_stack_callback_t *p_cback, nfc_stack_data_callback_t *p_data_cback) {
291c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
301c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
311c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
321c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
331c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_write(const struct nfc_nci_device *dev,
341c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        uint16_t data_len, const uint8_t *p_data) {
351c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
361c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
371c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
381c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
391c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_core_initialized(const struct nfc_nci_device *dev,
401c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        uint8_t* p_core_init_rsp_params) {
411c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
421c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
431c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
441c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
451c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_pre_discover(const struct nfc_nci_device *dev) {
461c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
471c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
481c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
491c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
501c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_close(const struct nfc_nci_device *dev) {
511c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
521c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
531c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
541c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
551c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_control_granted (const struct nfc_nci_device *p_dev)
561c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{
571c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
581c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
591c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
601c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
611c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
621c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_power_cycle (const struct nfc_nci_device *p_dev)
631c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{
641c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
651c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
661c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
671c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
681c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/*
691c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Generic device handling below - can generally be left unchanged.
701c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */
711c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* Close an opened nfc device instance */
721c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_close(hw_device_t *dev) {
731c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    free(dev);
741c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
751c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
761c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
771c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_open(const hw_module_t* module, const char* name,
781c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        hw_device_t** device) {
791c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
801c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        nfc_nci_device_t *dev = calloc(1, sizeof(nfc_nci_device_t));
811c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
821c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.tag = HARDWARE_DEVICE_TAG;
831c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.version = 0x00010000; // [31:16] major, [15:0] minor
841c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.module = (struct hw_module_t*) module;
851c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.close = nfc_close;
861c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
871c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        // NCI HAL method pointers
881c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->open = hal_open;
891c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->write = hal_write;
901c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->core_initialized = hal_core_initialized;
911c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->pre_discover = hal_pre_discover;
921c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->close = hal_close;
931c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->control_granted = hal_control_granted;
941c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->power_cycle = hal_power_cycle;
951c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
961c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        *device = (hw_device_t*) dev;
971c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
981c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        return 0;
991c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    } else {
1001c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        return -EINVAL;
1011c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    }
1021c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
1031c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1041c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1051c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic struct hw_module_methods_t nfc_module_methods = {
1061c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    .open = nfc_open,
1071c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen};
1081c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1091c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstruct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
1101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    .common = {
1111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .tag = HARDWARE_MODULE_TAG,
1121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0)
1131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .hal_api_version = 0x00, // 0 is only valid value
1141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .id = NFC_NCI_HARDWARE_MODULE_ID,
1151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .name = "Default NFC NCI HW HAL",
1161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .author = "The Android Open Source Project",
1171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .methods = &nfc_module_methods,
1181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    },
1191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen};
120