1 /*
2 * Copyright (C) 2012-2014 NXP Semiconductors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "NxpNfcNciHal"
18
19 #include <string.h>
20 #include <stdlib.h>
21 #include <utils/Log.h>
22 #include <errno.h>
23 #include <hardware/hardware.h>
24 #include <hardware/nfc.h>
25 #include <phNxpNciHal_Adaptation.h>
26
27 /*****************************************************************************
28 * NXP NCI HAL Function implementations.
29 *****************************************************************************/
30
31 /*******************************************************************************
32 **
33 ** Function hal_open
34 **
35 ** Description It opens and initialzes the physical connection with NFCC.
36 **
37 ** Returns 0 if successful
38 **
39 *******************************************************************************/
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)40 static int hal_open(const struct nfc_nci_device *p_dev,
41 nfc_stack_callback_t p_hal_cback,
42 nfc_stack_data_callback_t *p_hal_data_callback)
43 {
44 int retval = 0;
45
46 pn547_dev_t *dev = (pn547_dev_t*) p_dev;
47 retval = phNxpNciHal_open(p_hal_cback, p_hal_data_callback);
48
49 return retval;
50 }
51
52 /*******************************************************************************
53 **
54 ** Function hal_write
55 **
56 ** Description Write the data to NFCC.
57 **
58 ** Returns Number of bytes successfully written to NFCC.
59 **
60 *******************************************************************************/
hal_write(const struct nfc_nci_device * p_dev,uint16_t data_len,const uint8_t * p_data)61 static int hal_write(const struct nfc_nci_device *p_dev, uint16_t data_len,
62 const uint8_t *p_data)
63 {
64 int retval = 0;
65 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
66
67 retval = phNxpNciHal_write(data_len, p_data);
68 return retval;
69 }
70
71 /*******************************************************************************
72 **
73 ** Function hal_core_initialized
74 **
75 ** Description Notify NFCC after successful initialization of NFCC.
76 ** All proprietary settings can be done here.
77 **
78 ** Returns 0 if successful
79 **
80 *******************************************************************************/
hal_core_initialized(const struct nfc_nci_device * p_dev,uint8_t * p_core_init_rsp_params)81 static int hal_core_initialized(const struct nfc_nci_device *p_dev,
82 uint8_t* p_core_init_rsp_params)
83 {
84 int retval = 0;
85 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
86
87 retval = phNxpNciHal_core_initialized(p_core_init_rsp_params);
88 return retval;
89 }
90
91 /*******************************************************************************
92 **
93 ** Function hal_pre_discover
94 **
95 ** Description Notify NFCC before start discovery.
96 **
97 ** Returns 0 if successful
98 **
99 *******************************************************************************/
hal_pre_discover(const struct nfc_nci_device * p_dev)100 static int hal_pre_discover(const struct nfc_nci_device *p_dev)
101 {
102 int retval = 0;
103 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
104
105 retval = phNxpNciHal_pre_discover();
106 return retval;
107 }
108
109 /*******************************************************************************
110 **
111 ** Function hal_close
112 **
113 ** Description Close the NFCC interface and free all resources.
114 **
115 ** Returns 0 if successful
116 **
117 *******************************************************************************/
hal_close(const struct nfc_nci_device * p_dev)118 static int hal_close(const struct nfc_nci_device *p_dev)
119 {
120 int retval = 0;
121 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
122
123 retval = phNxpNciHal_close();
124 return retval;
125 }
126
127 /*******************************************************************************
128 **
129 ** Function hal_control_granted
130 **
131 ** Description Notify NFCC that control is granted to HAL.
132 **
133 ** Returns 0 if successful
134 **
135 *******************************************************************************/
hal_control_granted(const struct nfc_nci_device * p_dev)136 static int hal_control_granted(const struct nfc_nci_device *p_dev)
137 {
138 int retval = 0;
139 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
140
141 retval = phNxpNciHal_control_granted();
142 return retval;
143 }
144
145 /*******************************************************************************
146 **
147 ** Function hal_power_cycle
148 **
149 ** Description Notify power cycling has performed.
150 **
151 ** Returns 0 if successful
152 **
153 *******************************************************************************/
hal_power_cycle(const struct nfc_nci_device * p_dev)154 static int hal_power_cycle(const struct nfc_nci_device *p_dev)
155 {
156 int retval = 0;
157 pn547_dev_t* dev = (pn547_dev_t*) p_dev;
158
159 retval = phNxpNciHal_power_cycle();
160 return retval;
161 }
162
163 /*************************************
164 * Generic device handling.
165 *************************************/
166
167 /*******************************************************************************
168 **
169 ** Function nfc_close
170 **
171 ** Description Close the nfc device instance.
172 **
173 ** Returns 0 if successful
174 **
175 *******************************************************************************/
nfc_close(hw_device_t * dev)176 static int nfc_close(hw_device_t *dev)
177 {
178 int retval = 0;
179 free(dev);
180 return retval;
181 }
182
183 /*******************************************************************************
184 **
185 ** Function nfc_open
186 **
187 ** Description Open the nfc device instance.
188 **
189 ** Returns 0 if successful
190 **
191 *******************************************************************************/
nfc_open(const hw_module_t * module,const char * name,hw_device_t ** device)192 static int nfc_open(const hw_module_t* module, const char* name,
193 hw_device_t** device)
194 {
195 ALOGD("%s: enter; name=%s", __FUNCTION__, name);
196 int retval = 0; /* 0 is ok; -1 is error */
197
198 if (strcmp(name, NFC_NCI_CONTROLLER) == 0)
199 {
200 pn547_dev_t *dev = calloc(1, sizeof(pn547_dev_t));
201
202 /* Common hw_device_t fields */
203 dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
204 dev->nci_device.common.version = 0x00010000; /* [31:16] major, [15:0] minor */
205 dev->nci_device.common.module = (struct hw_module_t*) module;
206 dev->nci_device.common.close = nfc_close;
207
208 /* NCI HAL method pointers */
209 dev->nci_device.open = hal_open;
210 dev->nci_device.write = hal_write;
211 dev->nci_device.core_initialized = hal_core_initialized;
212 dev->nci_device.pre_discover = hal_pre_discover;
213 dev->nci_device.close = hal_close;
214 dev->nci_device.control_granted = hal_control_granted;
215 dev->nci_device.power_cycle = hal_power_cycle;
216
217 *device = (hw_device_t*) dev;
218 }
219 else
220 {
221 retval = -EINVAL;
222 }
223
224 ALOGD("%s: exit %d", __FUNCTION__, retval);
225 return retval;
226 }
227
228 /* Android hardware module definition */
229 static struct hw_module_methods_t nfc_module_methods =
230 {
231 .open = nfc_open,
232 };
233
234 /* NFC module definition */
235 struct nfc_nci_module_t HAL_MODULE_INFO_SYM =
236 {
237 .common =
238 {
239 .tag = HARDWARE_MODULE_TAG,
240 .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */
241 .hal_api_version = 0x00, /* 0 is only valid value */
242 .id = NFC_NCI_HARDWARE_MODULE_ID,
243 .name = "NXP PN54X NFC NCI HW HAL",
244 .author = "NXP Semiconductors",
245 .methods = &nfc_module_methods,
246 },
247 };
248