1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 1999-2012 Broadcom Corporation
4eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
19eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
20eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define LOG_TAG "NfcNciHal"
21eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "OverrideLog.h"
22eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <errno.h>
23eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <hardware/hardware.h>
24eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <hardware/nfc.h>
25eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "HalAdaptation.h"
26eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
27eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
28eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*********************************
29eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * NCI HAL method implementations.
30eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *********************************/
31eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
32eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
33ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chustatic int hal_open (const struct nfc_nci_device *p_dev, nfc_stack_callback_t *p_hal_cback, nfc_stack_data_callback_t *p_hal_data_callback)
34eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
35eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
36eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t *dev = (bcm2079x_dev_t*) p_dev;
37eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
38ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    retval = HaiOpen (dev, p_hal_cback, p_hal_data_callback);
39eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
40eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
41eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
42eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
43eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_write (const struct nfc_nci_device *p_dev,
44eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        uint16_t data_len, const uint8_t *p_data)
45eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
46eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
47eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
48eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
49eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiWrite (dev, data_len, p_data);
50eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
51eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
52eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
53eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
54eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_core_initialized (const struct nfc_nci_device *p_dev,
55eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        uint8_t* p_core_init_rsp_params)
56eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
57eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
58eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
59eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
60eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiCoreInitialized (dev, p_core_init_rsp_params);
61eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
62eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
63eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
64eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
65eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_pre_discover (const struct nfc_nci_device *p_dev)
66eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
67eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
68eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
69eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
70eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiPreDiscover (dev);
71eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
72eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
73eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
74eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
75eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_close (const struct nfc_nci_device *p_dev)
76eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
77eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
78eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
79eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
80eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiClose (dev);
81eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
82eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
83eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
84eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
85eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_control_granted (const struct nfc_nci_device *p_dev)
86eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
87eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
88eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
89eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
90eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiControlGranted (dev);
91eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu   return retval;
92eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
95eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int hal_power_cycle (const struct nfc_nci_device *p_dev)
96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiPowerCycle (dev);
101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*************************************
106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * Generic device handling.
107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *************************************/
108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Close an opened nfc device instance */
111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int nfc_close (hw_device_t *dev)
112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0;
114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    free (dev);
115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    retval = HaiTerminateLibrary ();
116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
120eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic int nfc_open (const hw_module_t* module, const char* name, hw_device_t** device)
121eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
122eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: enter; name=%s", __FUNCTION__, name);
123eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int retval = 0; //0 is ok; -1 is error
124eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
125eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (strcmp (name, NFC_NCI_CONTROLLER) == 0)
126eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
127eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        bcm2079x_dev_t *dev = calloc (1, sizeof(bcm2079x_dev_t));
128eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
129eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        // Common hw_device_t fields
130eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
131eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.common.version = 0x00010000; // [31:16] major, [15:0] minor
132eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.common.module = (struct hw_module_t*) module;
133eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.common.close = nfc_close;
134eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
135eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        // NCI HAL method pointers
136eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.open = hal_open;
137eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.write = hal_write;
138eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.core_initialized = hal_core_initialized;
139eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.pre_discover = hal_pre_discover;
140eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.close = hal_close;
141eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.control_granted = hal_control_granted;
142eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        dev->nci_device.power_cycle = hal_power_cycle;
143eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
144eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        // Copy in
145eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        *device = (hw_device_t*) dev;
146eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
147eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        retval = HaiInitializeLibrary (dev);
148eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
149eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
150eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
151eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        retval = -EINVAL;
152eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
153eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: exit %d", __FUNCTION__, retval);
154eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
155eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
156eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
157eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
158eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic struct hw_module_methods_t nfc_module_methods =
159eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
160eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    .open = nfc_open,
161eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu};
162eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
163eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
164eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustruct nfc_nci_module_t HAL_MODULE_INFO_SYM =
165eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
166eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    .common =
167eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
168eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .tag = HARDWARE_MODULE_TAG, .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0)
169eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .hal_api_version = 0x00, // 0 is only valid value
170eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .id = NFC_NCI_HARDWARE_MODULE_ID,
171eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .name = "Default NFC NCI HW HAL",
172eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .author = "The Android Open Source Project",
173eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        .methods = &nfc_module_methods,
174eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    },
175eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu};
176