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>
1707c085565a3b24bb658d05b8aa08fb7420725602Elliott Hughes#include <malloc.h>
181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <string.h>
191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <cutils/log.h>
211c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/hardware.h>
221c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen#include <hardware/nfc.h>
231c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
241c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
251c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/*
261c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * NCI HAL method implementations. These must be overriden
271c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */
281c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_open(const struct nfc_nci_device *dev,
29442752aecdc54c32e77227e792fca64dcf1c1fb8Martijn Coenen        nfc_stack_callback_t *p_cback, nfc_stack_data_callback_t *p_data_cback) {
301c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
311c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
321c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
331c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
341c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_write(const struct nfc_nci_device *dev,
351c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        uint16_t data_len, const uint8_t *p_data) {
361c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
371c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
381c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
391c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
401c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_core_initialized(const struct nfc_nci_device *dev,
411c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        uint8_t* p_core_init_rsp_params) {
421c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
431c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
441c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
451c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
461c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_pre_discover(const struct nfc_nci_device *dev) {
471c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
481c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
491c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
501c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
511c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_close(const struct nfc_nci_device *dev) {
521c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
531c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
541c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
551c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
561c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_control_granted (const struct nfc_nci_device *p_dev)
571c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{
581c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
591c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
601c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
611c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
621c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
631c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int hal_power_cycle (const struct nfc_nci_device *p_dev)
641c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen{
651c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    ALOGE("NFC-NCI HAL: %s", __FUNCTION__);
661c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
671c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
681c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
691c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/*
701c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen * Generic device handling below - can generally be left unchanged.
711c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen */
721c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen/* Close an opened nfc device instance */
731c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_close(hw_device_t *dev) {
741c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    free(dev);
751c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    return 0;
761c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
771c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
781c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic int nfc_open(const hw_module_t* module, const char* name,
791c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        hw_device_t** device) {
801c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
811c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        nfc_nci_device_t *dev = calloc(1, sizeof(nfc_nci_device_t));
821c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
831c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.tag = HARDWARE_DEVICE_TAG;
841c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.version = 0x00010000; // [31:16] major, [15:0] minor
851c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.module = (struct hw_module_t*) module;
861c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->common.close = nfc_close;
871c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
881c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        // NCI HAL method pointers
891c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->open = hal_open;
901c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->write = hal_write;
911c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->core_initialized = hal_core_initialized;
921c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->pre_discover = hal_pre_discover;
931c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->close = hal_close;
941c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->control_granted = hal_control_granted;
951c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        dev->power_cycle = hal_power_cycle;
961c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
971c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        *device = (hw_device_t*) dev;
981c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
991c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        return 0;
1001c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    } else {
1011c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        return -EINVAL;
1021c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    }
1031c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen}
1041c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1051c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1061c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstatic struct hw_module_methods_t nfc_module_methods = {
1071c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    .open = nfc_open,
1081c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen};
1091c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen
1101c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenenstruct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
1111c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    .common = {
1121c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .tag = HARDWARE_MODULE_TAG,
1131c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0)
1141c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .hal_api_version = 0x00, // 0 is only valid value
1151c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .id = NFC_NCI_HARDWARE_MODULE_ID,
1161c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .name = "Default NFC NCI HW HAL",
1171c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .author = "The Android Open Source Project",
1181c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen        .methods = &nfc_module_methods,
1191c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen    },
1201c970f1a493371aaa68f9227a8c3c395c5112facMartijn Coenen};
121