• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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