1 /******************************************************************************
2 *
3 * Copyright (C) 2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 /******************************************************************************
20 *
21 * HAL Adaptation Interface (HAI). This interface regulates the interaction
22 * between standard Android HAL and Broadcom-specific HAL. It adapts
23 * Broadcom-specific features to the Android framework.
24 *
25 ******************************************************************************/
26 #define LOG_TAG "NfcNciHal"
27 #include "OverrideLog.h"
28 #include "HalAdaptation.h"
29 #include "SyncEvent.h"
30 #include "config.h"
31 #include "nfc_hal_int.h"
32 #include "nfc_hal_post_reset.h"
33 #include <errno.h>
34 #include <pthread.h>
35
36
37 ///////////////////////////////////////
38 // private declaration, definition
39
40
41 static nfc_stack_callback_t* gAndroidHalCallback = NULL;
42 static nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL;
43 static SyncEvent gOpenCompletedEvent;
44 static SyncEvent gPostInitCompletedEvent;
45 static SyncEvent gCloseCompletedEvent;
46
47 UINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
48
49 static void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status);
50 static void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data);
51
52
53 ///////////////////////////////////////
54
55
HaiInitializeLibrary(const bcm2079x_dev_t * device)56 int HaiInitializeLibrary (const bcm2079x_dev_t* device)
57 {
58 ALOGD ("%s: enter", __FUNCTION__);
59 int retval = EACCES;
60 unsigned long freq = 0;
61 unsigned long num = 0;
62
63 InitializeGlobalAppLogLevel ();
64
65 //initialize the crystal frequency
66 if (GetNumValue((char*)NAME_XTAL_FREQUENCY, &freq, sizeof(freq)))
67 {
68 ALOGD("%s: setting xtal frequency=%lu", __FUNCTION__, freq);
69 nfc_post_reset_cb.dev_init_config.xtal_freq = (UINT16) freq;
70 nfc_post_reset_cb.dev_init_config.flags |= NFC_HAL_DEV_INIT_FLAGS_SET_XTAL_FREQ;
71 }
72
73 // Initialize protocol logging level
74 if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
75 ScrProtocolTraceFlag = num;
76
77 HAL_NfcInitialize ();
78
79 // Initialize appliation logging level
80 if ( GetNumValue ( NAME_APPL_TRACE_LEVEL, &num, sizeof ( num ) ) ) {
81 HAL_NfcSetTraceLevel(num);
82 }
83
84 retval = 0;
85 ALOGD ("%s: exit %d", __FUNCTION__, retval);
86 return retval;
87 }
88
89
HaiTerminateLibrary()90 int HaiTerminateLibrary ()
91 {
92 int retval = EACCES;
93 ALOGD ("%s: enter", __FUNCTION__);
94
95 HAL_NfcTerminate ();
96 gAndroidHalCallback = NULL;
97 gAndroidHalDataCallback = NULL;
98 GKI_shutdown ();
99 retval = 0;
100 ALOGD ("%s: exit %d", __FUNCTION__, retval);
101 return retval;
102 }
103
104
HaiOpen(const bcm2079x_dev_t * device,nfc_stack_callback_t * halCallbackFunc,nfc_stack_data_callback_t * halDataCallbackFunc)105 int HaiOpen (const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc, nfc_stack_data_callback_t* halDataCallbackFunc)
106 {
107 ALOGD ("%s: enter", __FUNCTION__);
108 int retval = EACCES;
109
110 gAndroidHalCallback = halCallbackFunc;
111 gAndroidHalDataCallback = halDataCallbackFunc;
112
113 SyncEventGuard guard (gOpenCompletedEvent);
114 HAL_NfcOpen (BroadcomHalCallback, BroadcomHalDataCallback);
115 gOpenCompletedEvent.wait ();
116
117 retval = 0;
118 ALOGD ("%s: exit %d", __FUNCTION__, retval);
119 return retval;
120 }
121
122
BroadcomHalCallback(UINT8 event,tHAL_NFC_STATUS status)123 void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status)
124 {
125 ALOGD ("%s: enter; event=0x%X", __FUNCTION__, event);
126 switch (event)
127 {
128 case HAL_NFC_OPEN_CPLT_EVT:
129 {
130 ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __FUNCTION__, status);
131 SyncEventGuard guard (gOpenCompletedEvent);
132 gOpenCompletedEvent.notifyOne ();
133 break;
134 }
135
136 case HAL_NFC_POST_INIT_CPLT_EVT:
137 {
138 ALOGD ("%s: HAL_NFC_POST_INIT_CPLT_EVT", __FUNCTION__);
139 SyncEventGuard guard (gPostInitCompletedEvent);
140 gPostInitCompletedEvent.notifyOne ();
141 break;
142 }
143
144 case HAL_NFC_CLOSE_CPLT_EVT:
145 {
146 ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", __FUNCTION__);
147 SyncEventGuard guard (gCloseCompletedEvent);
148 gCloseCompletedEvent.notifyOne ();
149 break;
150 }
151
152 case HAL_NFC_ERROR_EVT:
153 {
154 ALOGD ("%s: HAL_NFC_ERROR_EVT", __FUNCTION__);
155 {
156 SyncEventGuard guard (gOpenCompletedEvent);
157 gOpenCompletedEvent.notifyOne ();
158 }
159 {
160 SyncEventGuard guard (gPostInitCompletedEvent);
161 gPostInitCompletedEvent.notifyOne ();
162 }
163 {
164 SyncEventGuard guard (gCloseCompletedEvent);
165 gCloseCompletedEvent.notifyOne ();
166 }
167 break;
168 }
169 }
170 gAndroidHalCallback (event, status);
171 ALOGD ("%s: exit; event=0x%X", __FUNCTION__, event);
172 }
173
174
BroadcomHalDataCallback(UINT16 data_len,UINT8 * p_data)175 void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data)
176 {
177 ALOGD ("%s: enter; len=%u", __FUNCTION__, data_len);
178 gAndroidHalDataCallback (data_len, p_data);
179 }
180
181
HaiClose(const bcm2079x_dev_t * device)182 int HaiClose (const bcm2079x_dev_t* device)
183 {
184 ALOGD ("%s: enter", __FUNCTION__);
185 int retval = EACCES;
186
187 SyncEventGuard guard (gCloseCompletedEvent);
188 HAL_NfcClose ();
189 gCloseCompletedEvent.wait ();
190 retval = 0;
191 ALOGD ("%s: exit %d", __FUNCTION__, retval);
192 return retval;
193 }
194
195
HaiCoreInitialized(const bcm2079x_dev_t * device,uint8_t * coreInitResponseParams)196 int HaiCoreInitialized (const bcm2079x_dev_t* device, uint8_t* coreInitResponseParams)
197 {
198 ALOGD ("%s: enter", __FUNCTION__);
199 int retval = EACCES;
200
201 SyncEventGuard guard (gPostInitCompletedEvent);
202 HAL_NfcCoreInitialized (coreInitResponseParams);
203 gPostInitCompletedEvent.wait ();
204 retval = 0;
205 ALOGD ("%s: exit %d", __FUNCTION__, retval);
206 return retval;
207 }
208
209
HaiWrite(const bcm2079x_dev_t * dev,uint16_t dataLen,const uint8_t * data)210 int HaiWrite (const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data)
211 {
212 ALOGD ("%s: enter; len=%u", __FUNCTION__, dataLen);
213 int retval = EACCES;
214
215 HAL_NfcWrite (dataLen, const_cast<UINT8*> (data));
216 retval = 0;
217 ALOGD ("%s: exit %d", __FUNCTION__, retval);
218 return retval;
219 }
220
221
HaiPreDiscover(const bcm2079x_dev_t * device)222 int HaiPreDiscover (const bcm2079x_dev_t* device)
223 {
224 ALOGD ("%s: enter", __FUNCTION__);
225 int retval = EACCES;
226
227 HAL_NfcPreDiscover ();
228 retval = 0;
229 ALOGD ("%s: exit %d", __FUNCTION__, retval);
230 return retval;
231 }
232
233
HaiControlGranted(const bcm2079x_dev_t * device)234 int HaiControlGranted (const bcm2079x_dev_t* device)
235 {
236 ALOGD ("%s: enter", __FUNCTION__);
237 int retval = EACCES;
238
239 HAL_NfcControlGranted ();
240 retval = 0;
241 ALOGD ("%s: exit %d", __FUNCTION__, retval);
242 return retval;
243 }
244
245
HaiPowerCycle(const bcm2079x_dev_t * device)246 int HaiPowerCycle (const bcm2079x_dev_t* device)
247 {
248 ALOGD ("%s: enter", __FUNCTION__);
249 int retval = EACCES;
250
251 HAL_NfcPowerCycle ();
252 retval = 0;
253 ALOGD ("%s: exit %d", __FUNCTION__, retval);
254 return retval;
255 }
256