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