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>
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <hardware/hardware.h>
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <hardware/nfc.h>
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "HalAdaptation.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*********************************
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * NCI HAL method implementations.
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *********************************/
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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)
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t *dev = (bcm2079x_dev_t*) p_dev;
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiOpen (dev, p_hal_cback, p_hal_data_callback);
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_write (const struct nfc_nci_device *p_dev,
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        uint16_t data_len, const uint8_t *p_data)
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiWrite (dev, data_len, p_data);
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_core_initialized (const struct nfc_nci_device *p_dev,
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        uint8_t* p_core_init_rsp_params)
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiCoreInitialized (dev, p_core_init_rsp_params);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_pre_discover (const struct nfc_nci_device *p_dev)
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiPreDiscover (dev);
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_close (const struct nfc_nci_device *p_dev)
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiClose (dev);
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_control_granted (const struct nfc_nci_device *p_dev)
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiControlGranted (dev);
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project   return retval;
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int hal_power_cycle (const struct nfc_nci_device *p_dev)
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiPowerCycle (dev);
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
105b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaissonstatic int hal_get_max_nfcee (const struct nfc_nci_device *p_dev, uint8_t* maxNfcee)
106b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson{
107b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    int retval = 0;
108b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    bcm2079x_dev_t* dev = (bcm2079x_dev_t*) p_dev;
109b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
110b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    retval = HaiGetMaxNfcee (dev, maxNfcee);
111b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    return retval;
112b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson}
113b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
114a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*************************************
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Generic device handling.
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *************************************/
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Close an opened nfc device instance */
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int nfc_close (hw_device_t *dev)
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0;
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    free (dev);
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = HaiTerminateLibrary ();
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic int nfc_open (const hw_module_t* module, const char* name, hw_device_t** device)
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter; name=%s", __FUNCTION__, name);
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = 0; //0 is ok; -1 is error
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (strcmp (name, NFC_NCI_CONTROLLER) == 0)
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        bcm2079x_dev_t *dev = calloc (1, sizeof(bcm2079x_dev_t));
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // Common hw_device_t fields
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.common.version = 0x00010000; // [31:16] major, [15:0] minor
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.common.module = (struct hw_module_t*) module;
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.common.close = nfc_close;
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // NCI HAL method pointers
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.open = hal_open;
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.write = hal_write;
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.core_initialized = hal_core_initialized;
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.pre_discover = hal_pre_discover;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.close = hal_close;
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.control_granted = hal_control_granted;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        dev->nci_device.power_cycle = hal_power_cycle;
153a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        //dev->nci_device.get_max_ee = hal_get_max_nfcee;
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        // Copy in
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *device = (hw_device_t*) dev;
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        retval = HaiInitializeLibrary (dev);
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        retval = -EINVAL;
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic struct hw_module_methods_t nfc_module_methods =
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    .open = nfc_open,
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstruct nfc_nci_module_t HAL_MODULE_INFO_SYM =
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    .common =
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        .tag = HARDWARE_MODULE_TAG, .module_api_version = 0x0100, // [15:8] major, [7:0] minor (1.0)
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        .hal_api_version = 0x00, // 0 is only valid value
182077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        .id = NFC_NCI_BCM2079X_HARDWARE_MODULE_ID,
183077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        .name = "BCM2079x NFC NCI HW HAL",
184077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        .author = "Broadcom Corporation",
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        .methods = &nfc_module_methods,
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    },
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
188