blob: de4bbfdd6bed1125cb914f4b60469bc27e583d2d [file] [log] [blame]
Nick Pelly5d9927b2010-09-23 12:47:58 -07001/*
2 * Copyright (C) 2010 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/*!
18* =========================================================================== *
19* *
20* *
21* \file phHciNfc_Generic.h *
22* \brief Common HCI Header for the Generic HCI Management. *
23* *
24* *
25* Project: NFC-FRI-1.1 *
26* *
27* $Date: Mon Mar 29 17:34:47 2010 $ *
28* $Author: ing04880 $ *
29* $Revision: 1.73 $ *
30* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
31* *
32* =========================================================================== *
33*/
34
35/*@{*/
36#ifndef PHHCINFC_GENERIC_H
37#define PHHCINFC_GENERIC_H
38
39/*@}*/
40
41
42/**
43 * \name HCI
44 *
45 * File: \ref phHciNfc_Generic.h
46 *
47 */
48/*@{*/
49#define PHHCINFC_GENERIC_FILEREVISION "$Revision: 1.73 $" /**< \ingroup grp_file_attributes */
50#define PHHCINFC_GENERIC_FILEALIASES "$Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $" /**< \ingroup grp_file_attributes */
51/*@}*/
52/*
53
54################################################################################
55***************************** Header File Inclusion ****************************
56################################################################################
57*/
Nick Pelly34ff48f2011-06-27 09:01:51 -070058#define LOG_TAG "NFC-HCI"
59#include <cutils/log.h>
Nick Pelly5d9927b2010-09-23 12:47:58 -070060#include <phNfcIoctlCode.h>
61#include<phNfcInterface.h>
62#include <phHciNfc.h>
Nick Pelly5d9927b2010-09-23 12:47:58 -070063/*
64################################################################################
65****************************** Macro Definitions *******************************
66################################################################################
67*/
68
Nick Pelly5d9927b2010-09-23 12:47:58 -070069#define Trace_buffer phOsalNfc_DbgTraceBuffer
70
71/* HCI TRACE Macros */
72#if defined(HCI_TRACE)&& !defined(SILENT_HCI)
73#include <phOsalNfc.h>
74#include <stdio.h>
75extern char phOsalNfc_DbgTraceBuffer[];
76#define MAX_TRACE_BUFFER 150
77/* #define HCI_PRINT( str ) phOsalNfc_DbgTrace(str) */
78#define HCI_PRINT( str ) phOsalNfc_DbgString(str)
Steve Block1f23e482011-12-20 16:20:37 +000079#define HCI_DEBUG(...) ALOGD(__VA_ARGS__)
Nick Pelly34ff48f2011-06-27 09:01:51 -070080
81
82
83
Nick Pelly5d9927b2010-09-23 12:47:58 -070084#define HCI_PRINT_BUFFER(msg,buf,len) \
85 { \
Nick Pelly34ff48f2011-06-27 09:01:51 -070086 snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \
Nick Pelly5d9927b2010-09-23 12:47:58 -070087 phOsalNfc_DbgString(Trace_buffer); \
88 phOsalNfc_DbgTrace(buf,len); \
89 phOsalNfc_DbgString("\r"); \
90 \
91 }
92#else
93#include <phDbgTrace.h>
94#if defined(PHDBG_TRACES) && !defined(HCI_TRACE)
95#define HCI_PRINT( str ) PHDBG_INFO(str)
96#define HCI_DEBUG(str, arg)
97#define HCI_PRINT_BUFFER(msg,buf,len)
98#else
99#define HCI_PRINT( str )
Nick Pelly34ff48f2011-06-27 09:01:51 -0700100#define HCI_DEBUG(...)
Nick Pelly5d9927b2010-09-23 12:47:58 -0700101#define HCI_PRINT_BUFFER(msg,buf,len)
102#endif /* #if defined(PHDBG_TRACES) */
103/* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */
104
105#endif /* #if defined(HCI_TRACE) */
106
107#define ZERO 0x00U
108
109
110#ifdef MASK_BITS
111#define BYTE_SIZE 0x08U
112
113/* HCI GET and SET BITS Macros */
114#define MASK_BITS8(p,l) \
115 ( ( (((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE )? \
116 (~(0xFFU<<((p)+(l))) & (0xFFU<<(p))):(0U) )
117#ifdef MASK_BITS
118#define GET_BITS8(num,p,l) \
119 ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \
120 (((num)& (MASK_BITS8(p,l)))>>(p)):(0U) )
121#else
122#define GET_BITS8(num,p,l) \
123 ( ((((p)+(l))<=BYTE_SIZE))? \
124 (((num)>>(p))& (~(0xFFU<<(l)))):(0U) )
125#endif
126#define SET_BITS8(num,p,l,val) \
127 ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \
128 (((num)& (~MASK_BITS8(p,l)))|((val)<<(p))):(0U))
129
130#endif
131
132/** \ingroup grp_hci_retval
133 The Corresponding HCI Gate Not Supported.
134 */
135#define NFCSTATUS_HCI_GATE_NOT_SUPPORTED (0x71U)
136
137/** \ingroup grp_hci_retval
138 Invalid Command from the HCI Layer
139 */
140#define NFCSTATUS_INVALID_HCI_COMMAND (0x72U)
141
142/** \ingroup grp_hci_retval
143 HCI Command not supported . */
144#define NFCSTATUS_COMMAND_NOT_SUPPORTED (0x73U)
145
146/** \ingroup grp_hci_retval
147 Invalide Response from the HCI Layer
148 */
149#define NFCSTATUS_INVALID_HCI_RESPONSE (0x74U)
150
151/** \ingroup grp_hci_retval
152 The Invalid Instruction type (Neither Command/Response nor Event ).
153 */
154#define NFCSTATUS_INVALID_HCI_INSTRUCTION (0x75U)
155
156/** \ingroup grp_hci_retval
157 The Invalid Instruction type (Neither Command/Response nor Event ).
158 */
159#define NFCSTATUS_INVALID_HCI_INFORMATION (0x76U)
160
161/** \ingroup grp_hci_retval
162 The Invalid HCI Sequence.
163 */
164#define NFCSTATUS_INVALID_HCI_SEQUENCE (0x78U)
165
166
167/** \ingroup grp_hci_retval
168 The HCI Error Response with Response code.
169 */
170#define NFCSTATUS_HCI_RESPONSE(code) (code)
171
172
173/* Length of the HCP and the HCP Message Header in Bytes */
174#define HCP_HEADER_LEN 0x02U
175
176/* Length of the HCP Message Header in Bytes */
177#define HCP_MESSAGE_LEN 0x01U
178
179/* HCP Header Chaining Bit Offset */
180#define HCP_CHAINBIT_OFFSET 0x07U
181/* HCP Header Chaining Bit Length */
182#define HCP_CHAINBIT_LEN 0x01U
183
184/* Chaining Bit Values */
185#define HCP_CHAINBIT_DEFAULT 0x01U
186#define HCP_CHAINBIT_BEGIN 0x00U
187#define HCP_CHAINBIT_END HCP_CHAINBIT_DEFAULT
188
189/* HCP Header Pipe ID Offset */
190#define HCP_PIPEID_OFFSET 0x00U
191/* HCP Header Pipe ID Length */
192#define HCP_PIPEID_LEN 0x07U
193
194/* HCP Message Header Type Offset */
195#define HCP_MSG_TYPE_OFFSET 0x06U
196/* HCP Message Header Type Length */
197#define HCP_MSG_TYPE_LEN 0x02U
198
199/* HCP Message Type Values */
200#define HCP_MSG_TYPE_COMMAND 0x00U
201#define HCP_MSG_TYPE_EVENT 0x01U
202#define HCP_MSG_TYPE_RESPONSE 0x02U
203#define HCP_MSG_TYPE_RESERVED 0x03U
204
205/* HCP Message Header Instruction Offset */
206#define HCP_MSG_INSTRUCTION_OFFSET 0x00U
207/* HCP Message Header Instruction Length */
208#define HCP_MSG_INSTRUCTION_LEN 0x06U
209/* HCP Invalid Message Instruction */
210#define HCP_MSG_INSTRUCTION_INVALID 0x3FU
211
212
213/* HCP Packet Zero Length */
214#define HCP_ZERO_LEN 0x00U
215
216
217
218 /** \internal Generic HCI Commands for all the Gates */
219#define ANY_SET_PARAMETER 0x01U
220#define ANY_GET_PARAMETER 0x02U
221#define ANY_OPEN_PIPE 0x03U
222#define ANY_CLOSE_PIPE 0x04U
223#define ANY_GENERIC_CMD_RFU_B 0x05U
224#define ANY_GENERIC_CMD_RFU_E 0x0FU
225
226/*
227 * 0x05-0x0F is Reserved for Future Use
228 */
229
230/** \internal HCI Administration Com mands for the Management of the Host Network */
231
232#define ADM_CREATE_PIPE 0x10U
233#define ADM_DELETE_PIPE 0x11U
234#define ADM_NOTIFY_PIPE_CREATED 0x12U
235#define ADM_NOTIFY_PIPE_DELETED 0x13U
236#define ADM_CLEAR_ALL_PIPE 0x14U
237#define ADM_NOTIFY_ALL_PIPE_CLEARED 0x15U
238#define ADM_CMD_RFU_B 0x16U
239#define ADM_CMD_RFU_E 0x3FU
240
241#define MSG_INSTRUCTION_UNKNWON 0x3FU
242
243 /*
244 * 0x16-0x3F is Reserved for Future Use
245 */
246
247
248/** \internal HCI Generic Responses from the Gates */
249#define ANY_OK 0x00U
250#define ANY_E_NOT_CONNECTED 0x01U
251#define ANY_E_CMD_PAR_UNKNOWN 0x02U
252#define ANY_E_NOK 0x03U
253#define ANY_E_PIPES_FULL 0x04U
254#define ANY_E_REG_PAR_UNKNOWN 0x05U
255#define ANY_E_PIPE_NOT_OPENED 0x06U
256#define ANY_E_CMD_NOT_SUPPORTED 0x07U
257#define ANY_E_INHIBITED 0x08U
258#define ANY_E_TIMEOUT 0x09U
259#define ANY_E_REG_ACCESS_DENIED 0x0AU
260#define ANY_E_PIPE_ACCESS_DENIED 0x0BU
261
262/* Response Error Code for RF Reader Gate */
263#define WR_RF_ERROR 0x10U
264
265/*
266* 0x08, 0x0B-0x3F is Reserved for Future Use
267*/
268
269
270/** \internal HCI Generic Events from the Gates */
271#define EVT_HCI_END_OF_OPERATION 0x01
272#define EVT_POST_DATA 0x02
273#define EVT_HOT_PLUG 0x03
274
275
276/* Maximum Buffer Size for the HCI Data */
277#define PHHCINFC_MAX_BUFFERSIZE (PHHAL_MAX_DATASIZE + 0x50U)
278
279#define PHHCINFC_MAX_OPENPIPE 0x6FU
280#define PHHCINFC_MAX_PIPE 0x6FU
281#define PHHCINFC_MIN_PIPE 0x02U
282
283
284/* Maximum Payload Length of HCI. */
285#define PHHCINFC_MAX_PACKET_DATA 0x1CU
286#define PHHCINFC_MAX_HCP_LEN PHHCINFC_MAX_PACKET_DATA + 1
287
288
289
290/* Maximum Payload Length of HCI. */
291
292
293/*
294################################################################################
295******************** Enumeration and Structure Definition **********************
296################################################################################
297*/
298#if 1
299typedef NFCSTATUS (*pphHciNfc_Pipe_Receive_t) (
300 void *pContext,
301 void *pHwRef,
302 uint8_t *data,
303#ifdef ONE_BYTE_LEN
304 uint8_t length
305#else
306 uint16_t length
307#endif
308 );
309#else
310
311typedef pphNfcIF_Transact_t pphHciNfc_Pipe_Receive_t;
312
313#endif
314
315/** \defgroup grp_hci_nfc HCI Component
316 *
317 *
318 */
319
320typedef enum phHciNfc_HostID {
321 phHciNfc_HostControllerID = 0x00U,
322 phHciNfc_TerminalHostID = 0x01U,
323 phHciNfc_UICCHostID = 0x02U
324/*
325 phHciNfc_HostID_RFU_B = 0x03U,
326 phHciNfc_HostID_RFU_E = 0xBFU,
327 phHciNfc_HostIDProprietary_B = 0xC0U,
328 phHciNfc_HostIDProprietary_E = 0xFFU
329*/
330}phHciNfc_HostID_t;
331
332
333typedef enum phHciNfc_GateID{
334 phHciNfc_AdminGate = 0x00U,
335/*
336 phHciNfc_evGateIDProprietary_B = 0x01U,
337 phHciNfc_evGateIDProprietary_E = 0x03U,
338*/
339 phHciNfc_LoopBackGate = 0x04U,
340 phHciNfc_IdentityMgmtGate = 0x05U,
341 phHciNfc_LinkMgmtGate = 0x06U,
342/*
343 phHciNfc_GateID_RFU_B = 0x07U,
344 phHciNfc_GateID_RFU_E = 0x0FU,
345*/
346
347/* TODO: Fillin Other Gate Information */
348 /* ETSI HCI Specific RF Reader Gates */
349 phHciNfc_RFReaderAGate = 0x13,
350 phHciNfc_RFReaderBGate = 0x11,
351
352 /* Proprietary Reader Gate */
353 phHciNfc_ISO15693Gate = 0x12,
354 phHciNfc_RFReaderFGate = 0x14,
355 phHciNfc_JewelReaderGate = 0x15,
356
357 /* ETSI HCI Card RF Gates */
358 phHciNfc_CETypeBGate = 0x21,
359 phHciNfc_CETypeBPrimeGate = 0x22,
360 phHciNfc_CETypeAGate = 0x23,
361 phHciNfc_CETypeFGate = 0x24,
362
363 /* NFC-IP1 Gates */
364 phHciNfc_NFCIP1InitRFGate = 0x30,
365 phHciNfc_NFCIP1TargetRFGate = 0x31,
366
367 /* ETSI HCI Connectivity Gate */
368 phHciNfc_ConnectivityGate = 0x41,
369
370
371 /* Device Configuration Gates */
372 phHciNfc_PN544MgmtGate = 0x90,
373 phHciNfc_HostCommGate = 0x91,
374 phHciNfc_GPIOGate = 0x92,
375 phHciNfc_RFMgmtGate = 0x93,
376 phHciNfc_PollingLoopGate = 0x94,
377 phHciNfc_DownloadMgmtGate = 0x95,
378
379 /* Card Emulation Managment Gates */
380 phHciNfc_SwpMgmtGate = 0xA0,
381 phHciNfc_NfcWIMgmtGate = 0xA1,
382 phHciNfc_UnknownGate = 0xFF
383
384}phHciNfc_GateID_t;
385
386
387typedef enum phHciNfc_PipeID{
388 HCI_LINKMGMT_PIPE_ID = 0x00U,
389 HCI_ADMIN_PIPE_ID = 0x01U,
390 HCI_DYNAMIC_PIPE_ID = 0x02U,
391 HCI_RESERVED_PIPE_ID = 0x70U,
392 HCI_UNKNOWN_PIPE_ID = PHHCINFC_MAX_PIPE
393/*
394 phHciNfc_evOtherGatePipeID_B = 0x02U,
395 phHciNfc_evOtherGatePipeID_E = 0x6FU,
396 phHciNfc_evGatePipeID_RFU_B = 0x70U,
397 phHciNfc_evGatePipeID_RFU_E = 0x7FU,
398*/
399}phHciNfc_PipeID_t;
400
401
402typedef enum phHciNfc_eState {
403 hciState_Reset = 0x00U,
404 hciState_Initialise,
405 hciState_Test,
406 hciState_Config,
407 hciState_IO,
408 hciState_Select,
409 hciState_Listen,
410 hciState_Activate,
411 hciState_Reactivate,
412 hciState_Connect,
413 hciState_Transact,
414 hciState_Disconnect,
415 hciState_Presence,
416 hciState_Release,
417 hciState_Unknown
418}phHciNfc_eState_t;
419
420typedef enum phHciNfc_eMode {
421 hciMode_Reset = 0x00U,
422 hciMode_Session,
423 hciMode_Override,
424 hciMode_Test,
425 hciMode_Unknown
426}phHciNfc_eMode_t;
427
428
429typedef enum phHciNfc_eSeq{
430 /* HCI Admin Sequence */
431 ADMIN_INIT_SEQ = 0x00U,
432 ADMIN_SESSION_SEQ,
433 ADMIN_CE_SEQ,
434 ADMIN_REL_SEQ,
435 ADMIN_EVT_HOTPLUG_SEQ,
436
437 /* HCI Link Management Sequence */
438 LINK_MGMT_INIT_SEQ,
439 LINK_MGMT_REL_SEQ,
440
441 /* HCI Identity Management Sequence */
442 IDENTITY_INIT_SEQ,
443 IDENTITY_INFO_SEQ,
444 IDENTITY_REL_SEQ,
445
446 /* HCI Polling Loop Sequence */
447 PL_INIT_SEQ,
448 PL_DURATION_SEQ,
449 PL_CONFIG_PHASE_SEQ,
450 PL_TGT_DISABLE_SEQ,
451 PL_RESTART_SEQ,
452 PL_STOP_SEQ,
453 PL_REL_SEQ,
454
455 /* HCI Device Management Sequence */
456 DEV_INIT_SEQ,
Rob von Behren6dd94832011-09-16 15:05:25 -0700457 DEV_HAL_INFO_SEQ,
Nick Pelly5d9927b2010-09-23 12:47:58 -0700458 DEV_CONFIG_SEQ,
459 DEV_REL_SEQ,
460
461 /* HCI Reader Management Sequence */
462 READER_MGMT_INIT_SEQ,
463 READER_ENABLE_SEQ,
464 READER_SELECT_SEQ,
465 READER_REACTIVATE_SEQ,
466 READER_SW_AUTO_SEQ,
467 READER_PRESENCE_CHK_SEQ,
468 READER_UICC_DISPATCH_SEQ,
469 READER_DESELECT_SEQ,
470 READER_RESELECT_SEQ,
471 READER_DISABLE_SEQ,
472 READER_MGMT_REL_SEQ,
473
474 /* HCI NFC-IP1 Sequence */
475 NFCIP1_INIT_SEQ,
476 INITIATOR_SPEED_SEQ,
477 INITIATOR_GENERAL_SEQ,
478 TARGET_GENERAL_SEQ,
479 TARGET_SPEED_SEQ,
480 NFCIP1_REL_SEQ,
481
482 /* HCI Emulation Management Sequence */
483 EMULATION_INIT_SEQ,
484 EMULATION_SWP_SEQ,
485 EMULATION_CONFIG_SEQ,
486 EMULATION_REL_SEQ,
487
488 HCI_END_SEQ,
489 HCI_INVALID_SEQ
490} phHciNfc_eSeq_t;
491
492
493
494typedef enum phHciNfc_eSeqType{
495 RESET_SEQ = 0x00U,
496 INIT_SEQ,
497 UPDATE_SEQ,
498 INFO_SEQ,
499 CONFIG_SEQ,
500 REL_SEQ,
501 END_SEQ
502} phHciNfc_eSeqType_t;
503
504
505typedef enum phHciNfc_eConfigType{
506 INVALID_CFG = 0x00U,
507 POLL_LOOP_CFG,
508 SMX_WI_CFG,
509 SMX_WI_MODE,
510 UICC_SWP_CFG,
511 SWP_EVT_CFG,
512 SWP_PROTECT_CFG,
513 NFC_GENERAL_CFG,
514 NFC_TARGET_CFG,
515 NFC_CE_A_CFG,
516 NFC_CE_B_CFG
517} phHciNfc_eConfigType_t;
518
519
520typedef struct phHciNfc_HCP_Message{
521 /** \internal Identifies the Type and Kind of Instruction */
522 uint8_t msg_header;
523 /** \internal Host Controller Protocol (HCP) Packet Message Payload */
524 uint8_t payload[PHHCINFC_MAX_PACKET_DATA - 1];
525}phHciNfc_HCP_Message_t;
526
527
528typedef struct phHciNfc_HCP_Packet{
529 /** \internal Chaining Information and Pipe Identifier */
530 uint8_t hcp_header;
531 /** \internal Host Controller Protocol (HCP) Packet Message or Payload */
532 union
533 {
534 /** \internal Host Controller Protocol (HCP) Packet Message */
535 phHciNfc_HCP_Message_t message;
536 /** \internal Host Controller Protocol (HCP) Packet Payload */
537 uint8_t payload[PHHCINFC_MAX_PACKET_DATA];
538 }msg;
539}phHciNfc_HCP_Packet_t;
540
541
542
543typedef struct phHciNfc_Gate_Info{
544 /** \internal HCI Host Identifier */
545 uint8_t host_id;
546 /** \internal HCI Gate Identifier */
547 uint8_t gate_id;
548}phHciNfc_Gate_Info_t;
549
550
551typedef struct phHciNfc_Pipe_Params{
552 /** \internal HCI Source Gate Information for the pipe */
553 phHciNfc_Gate_Info_t source;
554 /** \internal HCI Destination Gate Information for the pipe */
555 phHciNfc_Gate_Info_t dest;
556 /** \internal HCI Pipe Identifier */
557 uint8_t pipe_id;
558}phHciNfc_Pipe_Params_t;
559
560
561typedef struct phHciNfc_Pipe_Info{
562 /** \internal Structure containing the created dynamic pipe information */
563 phHciNfc_Pipe_Params_t pipe;
564 /** \internal Status of the previous command sent to this pipe */
565 NFCSTATUS prev_status;
566 /** \internal previous message type Sent to this pipe */
567 uint8_t sent_msg_type;
568 /** \internal Message type Received in this pipe */
569 uint8_t recv_msg_type;
570 /** \internal previous message sent to this pipe */
571 uint8_t prev_msg;
572 /** \internal Index of the previous Set/Get Parameter command
573 * sent to this pipe */
574 uint8_t reg_index;
575 /** \internal length of Parameter of the Set/Get Parameter
576 * command sent to this pipe */
577 uint16_t param_length;
578 /** \internal Parameter of the Set/Get Parameter command
579 * sent to this pipe */
580 void *param_info;
581 /** \internal Pointer to a Pipe specific Receive Response function */
582 pphHciNfc_Pipe_Receive_t recv_resp;
583 /** \internal Pointer to a Pipe specific Receive Event function */
584 pphHciNfc_Pipe_Receive_t recv_event;
585 /** \internal Pointer to a Pipe specific Receive Command function */
586 pphHciNfc_Pipe_Receive_t recv_cmd;
587}phHciNfc_Pipe_Info_t;
588
589
590typedef struct phHciNfc_sContext{
591 /** \internal HCI Layer Pointer from the upper layer for
592 lower layer function registration */
593 phNfcLayer_sCfg_t *p_hci_layer;
594 /** \internal Pointer to the upper layer context */
595 void *p_upper_context;
596 /** \internal Pointer to the Hardware Reference Sturcture */
597 phHal_sHwReference_t *p_hw_ref;
598 /** \internal Pointer to the upper layer notification callback function */
599 pphNfcIF_Notification_CB_t p_upper_notify;
600 /** \internal Structure to store the lower interface operations */
601 phNfc_sLowerIF_t lower_interface;
602 /** \internal Execution Sequence using the HCI Context */
603 volatile phHciNfc_eSeq_t hci_seq;
604
605 /** \internal State of the HCI Context */
606 volatile phNfc_sState_t hci_state;
607
608 /** \internal Mode of HCI Initialisation */
609 phHciNfc_Init_t init_mode;
610
Rob von Behren6dd94832011-09-16 15:05:25 -0700611 /** \internal Memory Information for HCI Initialisation */
612 uint8_t hal_mem_info[NXP_HAL_MEM_INFO_SIZE];
Nick Pelly5d9927b2010-09-23 12:47:58 -0700613
614 /** \internal HCI Configuration Type */
615 phHciNfc_eConfigType_t config_type;
616 /** \internal HCI SmartMX Mode Configuration */
617 phHal_eSmartMX_Mode_t smx_mode;
618 /** \internal HCI Configuration Information */
619 void *p_config_params;
620
621 /** \internal Current RF Reader/Emulation Gate in Use */
622 phHal_eRFDevType_t host_rf_type;
623
624 /** \internal Connected Target Information */
625 phHal_sRemoteDevInformation_t *p_target_info;
626
627 /** \internal Information of all the pipes created and opened */
628 phHciNfc_Pipe_Info_t *p_pipe_list[PHHCINFC_MAX_PIPE+1];
629
630 /** \internal Tag */
631 phHciNfc_XchgInfo_t *p_xchg_info;
632
633 /** \internal Information of the HCI Gates */
634 /** \internal HCI Admin Management Gate Information */
635 void *p_admin_info;
636 /** \internal HCI Link Management Gate Information */
637 void *p_link_mgmt_info;
638 /** \internal HCI Identity Management Gate Information */
639 void *p_identity_info;
640 /** \internal HCI Polling Loop Gate Information */
641 void *p_poll_loop_info;
642 /** \internal HCI NFC Device Management Information */
643 void *p_device_mgmt_info;
644 /** \internal HCI RF Reader Gates Management Information */
645 void *p_reader_mgmt_info;
646 /** \internal HCI Card Application Gates and Emulation
647 Information */
648 void *p_emulation_mgmt_info;
649 /** \internal HCI RF Reader A Gate Information */
650 void *p_reader_a_info;
651#ifdef TYPE_B
652 /** \internal HCI RF Reader B Gate Information */
653 void *p_reader_b_info;
654#endif
655#ifdef TYPE_FELICA
656 /** \internal HCI Felica Reader Gate Information */
657 void *p_felica_info;
658#endif
659#ifdef TYPE_JEWEL
660 /** \internal HCI Jewel Reader Gate Information */
661 void *p_jewel_info;
662#endif
663#ifdef TYPE_ISO15693
664 /** \internal HCI ISO15693 Reader Gate Information */
665 void *p_iso_15693_info;
666#endif
667
668#ifdef ENABLE_P2P
669 /** \internal HCI NFC-IP1 Peer to Peer Information */
670 void *p_nfcip_info;
671#endif
672 /** \internal HCI Secure Element Management Information */
673 void *p_wi_info;
674 /** \internal HCI UICC Information */
675 void *p_uicc_info;
676 /** \internal HCI SWP Information */
677 void *p_swp_info;
678#ifdef HOST_EMULATION
679 /** \internal HCI Card Emulation A Gate Information */
680 void *p_ce_a_info;
681 /** \internal HCI Card Emulation B Gate Information */
682 void *p_ce_b_info;
683#endif
684
685 /** \internal HCI Packet Data to be sent to the lower layer */
686 phHciNfc_HCP_Packet_t tx_packet;
687 /** \internal HCI Packet Data to be received from the lower layer */
688 phHciNfc_HCP_Packet_t rx_packet;
689
690 /** \internal Previous Status (To Store the Error Status ) */
691 NFCSTATUS error_status;
692
693 /** \internal Pointer to HCI Send Buffer */
694 uint8_t send_buffer[PHHCINFC_MAX_BUFFERSIZE];
695 /** \internal Pointer to HCI Receive Buffer */
696 uint8_t recv_buffer[PHHCINFC_MAX_BUFFERSIZE];
697
698 /** \internal Total Number of bytes to be Sent */
699 volatile uint16_t tx_total;
700 /** \internal Number of bytes Remaining to be Sent */
701 volatile uint16_t tx_remain;
702 /** \internal Number of bytes sent */
703 volatile uint16_t tx_sent;
704
705 volatile uint16_t rx_index;
706
707 /** \internal Total Number of bytes received */
708 volatile uint16_t rx_total;
709 /** \internal Number of bytes received */
710 volatile uint16_t rx_recvd;
711 /** \internal Index of the received data in the
712 * response packet
713 */
714
715 /** \internal Send HCP Chaining Information */
716 volatile uint8_t tx_hcp_chaining;
717 /** \internal Send HCP Fragment Index */
718 volatile uint16_t tx_hcp_frgmnt_index;
719
720 /** \internal Receive HCP Chaining Information */
721 volatile uint8_t rx_hcp_chaining;
722 /** \internal Receive HCP Fragment Index */
723 volatile uint16_t rx_hcp_frgmnt_index;
724
725 /** \internal The Device under Test */
726 volatile uint8_t hci_mode;
727 /** \internal Wait for Response if Response is Pending */
728 volatile uint8_t response_pending;
729 /** \internal Notify the Event if Notifcation is Pending */
730 volatile uint8_t event_pending;
731
732 /** \internal Pending Release of the detected Target */
733 uint8_t target_release;
734
735}phHciNfc_sContext_t;
736
737/*
738################################################################################
739*********************** Function Prototype Declaration *************************
740################################################################################
741*/
742
743
744/**
745 *
746 * \ingroup grp_hci_nfc
747 *
748 * The phHciNfc_Receive function receives the HCI Events or Response from the
749 * corresponding peripheral device, described by the HCI Context Structure.
750 *
751 * \param[in] psContext psContext is the context of
752 * the HCI Layer.
753 * \param[in] pHwRef pHwRef is the Information of
754 * the Device Interface Link .
755 * \param[out] pdata Pointer to the response buffer that
756 * receives the response read.
757 * \param[in] length Variable that receives
758 * the number of bytes read.
759 *
760 * \retval NFCSTATUS_PENDING Data successfully read.
761 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
762 * could not be interpreted properly.
763 * \retval Other errors Other related errors
764 *
765 */
766
767extern
768NFCSTATUS
769phHciNfc_Receive(
770 void *psContext,
771 void *pHwRef,
772 uint8_t *pdata,
773#ifdef ONE_BYTE_LEN
774 uint8_t length
775#else
776 uint16_t length
777#endif
778 );
779
780/**
781 * \ingroup grp_hci_nfc
782 *
783 * The phHciNfc_Send_Complete function acknowledges the completion of the HCI
784 * Commands sent to the device.
785 *
786 * \param[in] psContext psContext is the context of
787 * the HCI Layer.
788 * \param[in] pHwRef pHwRef is the Information of
789 * the Device Interface Link .
790 * \param[in] pInfo Transaction information like
791 * status and length after the
792 * completion of the send.
793 *
794 * \retval NONE.
795 *
796 */
797
798extern
799void
800phHciNfc_Send_Complete (
801 void *psContext,
802 void *pHwRef,
803 phNfc_sTransactionInfo_t *pInfo
804 );
805
806/**
807 * \ingroup grp_hci_nfc
808 *
809 * The phHciNfc_Receive_Complete function acknowledges the completion of the HCI
810 * Event Information or Response received from the device.
811 *
812 * \param[in] psContext psContext is the context of
813 * the HCI Layer.
814 * \param[in] pHwRef pHwRef is the Information of
815 * the Device Interface Link .
816 * \param[in] pInfo Transaction information like status
817 * data and length after the completely
818 * receiving the response .
819 * \retval NONE.
820 *
821 *
822 */
823
824extern
825void
826phHciNfc_Receive_Complete (
827 void *psContext,
828 void *pHwRef,
829 phNfc_sTransactionInfo_t *pInfo
830 );
831
832/**
833 * \ingroup grp_hci_nfc
834 *
835 * The phHciNfc_Notify_Event function notifies the occurence of the HCI
836 * Event from the device.
837 *
838 * \param[in] psContext psContext is the context of
839 * the HCI Layer.
840 * \param[in] pHwRef pHwRef is the Information of
841 * the Device Interface Link .
842 * \param[in] type reason returned for the notification to
843 * the HCI.
844 * \param[in] pInfo Notification information like status
845 * data,length etc from the lower layer
846 * to the HCI Layer.
847 * \retval NONE.
848 *
849 */
850
851extern
852void
853phHciNfc_Notify_Event(
854 void *psContext,
855 void *pHwRef,
856 uint8_t type,
857 void *pInfo
858 );
859
860/**
861 * \ingroup grp_hci_nfc
862 *
863 * The phHciNfc_Tag_Notify function notifies the the upper layer
864 * with the Tag Specific Notifications .
865 *
866 * \param[in] psContext psContext is the context of
867 * the HCI Layer.
868 * \param[in] pHwRef pHwRef is the Information of
869 * the Device Interface Link .
870 * \param[in] type reason returned for the notification to
871 * the HCI.
872 * \param[in] pInfo Notification information like status
873 * data,length etc from the lower layer
874 * to the HCI Layer.
875 * \retval NONE.
876 *
877 */
878extern
879void
880phHciNfc_Tag_Notify(
881 phHciNfc_sContext_t *psHciContext,
882 void *pHwRef,
883 uint8_t type,
884 void *pInfo
885 );
886
887/**
888 * \ingroup grp_hci_nfc
889 *
890 * The phHciNfc_Tag_Notify function notifies the the upper layer
891 * with the Tag Specific Notifications .
892 *
893 * \param[in] psContext psContext is the context of
894 * the HCI Layer.
895 * \param[in] pHwRef pHwRef is the Information of
896 * the Device Interface Link .
897 * \param[in] type reason returned for the notification to
898 * the HCI.
899 * \param[in] pInfo Notification information like status
900 * data,length etc from the lower layer
901 * to the HCI Layer.
902 * \retval NONE.
903 *
904 */
905
906extern
907void
908phHciNfc_Target_Select_Notify(
909 phHciNfc_sContext_t *psHciContext,
910 void *pHwRef,
911 uint8_t type,
912 void *pInfo
913 );
914
915
916/**
917 * \ingroup grp_hci_nfc
918 *
919 * The phHciNfc_Transceive_Notify function notifies the the upper layer
920 * with the after the transceive operation.
921 *
922 * \param[in] psContext psContext is the context of
923 * the HCI Layer.
924 * \param[in] pHwRef pHwRef is the Information of
925 * the Device Interface Link .
926 * \param[in] type reason returned for the notification to
927 * the HCI.
928 * \param[in] pInfo Notification information like status
929 * data,length etc from the lower layer
930 * to the HCI Layer.
931 * \retval NONE.
932 *
933 */
934extern
935void
936phHciNfc_Transceive_Notify(
937 phHciNfc_sContext_t *psHciContext,
938 void *pHwRef,
939 uint8_t type,
940 void *pInfo
941 );
942
943/**
944 * \ingroup grp_hci_nfc
945 *
946 * The phHciNfc_Notify function calls the upper layer notification callback.
947 *
948 * \param[in] pUpperNotify pUpperNotify is the notification
949 * callback of the upper HAL Layer.
950 * \param[in] pUpperContext pUpperContext is the context of
951 * the upper HAL Layer.
952 * \param[in] pHwRef pHwRef is the Information of
953 * the Device Interface Link .
954 * \param[in] type type of the notification to
955 * the upper HAL layer.
956 * \param[in] pInfo completion information returned
957 * to the Upper HAL Layer.
958 * NFCSTATUS_SUCCESS Notification successfully completed .
959 * NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
960 * could not be interpreted properly.
961 * Other errors Errors related to the HCI or lower layers
962 *
963 * \retval NONE.
964 *
965 */
966
967extern
968void
969phHciNfc_Notify(
970 pphNfcIF_Notification_CB_t p_upper_notify,
971 void *p_upper_context,
972 void *pHwRef,
973 uint8_t type,
974 void *pInfo
975 );
976
977/**
978 * \ingroup grp_hci_nfc
979 *
980 * The phHciNfc_Release_Notify function Releases HCI and notifies
981 * the upper layer.
982 *
983 * \param[in] psHciContext psHciContext is the context of
984 * the HCI Layer.
985 * \param[in] pHwRef pHwRef is the Information of
986 * the Device Interface Link .
987 * \param[in] type reason returned for the notification to
988 * the HCI.
989 * \param[in] pInfo Notification information like status
990 * data,length etc from the lower layer
991 * to the HCI Layer.
992 * \retval NONE.
993 *
994 */
995extern
996void
997phHciNfc_Release_Notify(
998 phHciNfc_sContext_t *psHciContext,
999 void *pHwRef,
1000 uint8_t type,
1001 void *pInfo
1002 );
1003
1004
1005
1006/**
1007 * \ingroup grp_hci_nfc
1008 *
1009 * The phHciNfc_Send_Generic_Cmd function sends the HCI Generic Commands
1010 * to the device.
1011 *
1012 * \param[in] psHciContext psHciContext is the context of
1013 * the HCI Layer.
1014 * \param[in] pHwRef pHwRef is the Information of
1015 * the Device Interface Link .
1016 * \param[in] pipe_id The pipe to which the command
1017 * is being sent.
1018 * \param[in] cmd The HCI Generic command sent to a
1019 * particular pipe .
1020 *
1021 * \retval NFCSTATUS_PENDING HCI Generic Command send in progress .
1022 * \retval
1023 * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated
1024 * as required amount of memory
1025 * is not sufficient.
1026 *
1027 */
1028
1029extern
1030NFCSTATUS
1031phHciNfc_Send_Generic_Cmd (
1032 phHciNfc_sContext_t *psHciContext,
1033 void *pHwRef,
1034 uint8_t pipe_id,
1035 uint8_t cmd
1036 );
1037
1038/**
1039 * \ingroup grp_hci_nfc
1040 *
1041 * The phHciNfc_Set_Param function configures the Gate specific register
1042 * with the provided value.
1043 *
1044 * \param[in] psHciContext psHciContext is the context of
1045 * the HCI Layer.
1046 * \param[in] pHwRef pHwRef is the Information of
1047 * the Device Interface Link .
1048 * \param[in] p_pipe_info Pointer to pipe specific information.
1049 * \param[in] reg_index Index of the register to be
1050 * configured .
1051 * \param[in] p_param Value to the configured in
1052 * particular register.
1053 * \param[in] param_length Length of the parameter provided
1054 * for the configuration.
1055 *
1056 * \retval NFCSTATUS_PENDING HCI Set parameter in progress .
1057 * \retval
1058 * NFCSTATUS_INVALID_HCI_INFORMATION The Information like p_pipe_info,
1059 * p_param or param_length is invalid
1060 *
1061 */
1062
1063extern
1064NFCSTATUS
1065phHciNfc_Set_Param (
1066 phHciNfc_sContext_t *psHciContext,
1067 void *pHwRef,
1068 phHciNfc_Pipe_Info_t *p_pipe_info,
1069 uint8_t reg_index,
1070 void *p_param,
1071 uint16_t param_length
1072 );
1073
1074/**
1075 * \ingroup grp_hci_nfc
1076 *
1077 * The phHciNfc_Send_HCP function sends the HCI Host Control Packet
1078 * Frames to the device.
1079 *
1080 * \param[in] psHciContext psHciContext is the context of
1081 * the HCI Layer.
1082 * \param[in] pHwRef pHwRef is the Information of
1083 * the Device Interface Link .
1084 *
1085 * \retval NFCSTATUS_PENDING HCP Frame send pending.
1086 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
1087 * could not be interpreted properly.
1088 * \retval Other errors Other related errors
1089 *
1090 *
1091 */
1092
1093extern
1094NFCSTATUS
1095phHciNfc_Send_HCP (
1096 phHciNfc_sContext_t *psHciContext,
1097 void *pHwRef
1098 );
1099
1100
1101/**
1102 * \ingroup grp_hci_nfc
1103 *
1104 * The phHciNfc_Build_HCPFrame function initially builds the HCP Packet Frame
1105 * with the values passed in the arguments .
1106 *
1107 * \param[in] hcp_packet hcp_packet is the frame packet structure
1108 * in which the frame is populated with the
1109 * appropriate fields.
1110 * \param[in] chainbit chainbit specifies whether the following
1111 * HCP frames are chained or the frame is a
1112 * normal frame.
1113 * \param[in] pipe_id pipe_id of the pipe to which the frame has
1114 * to be sent.
1115 * \param[in] msg_type type of message sent to the pipe.
1116 * \param[in] instruction type of message instruction send to the pipe.
1117 *
1118 * \retval NONE.
1119 *
1120 */
1121
1122
1123extern
1124void
1125phHciNfc_Build_HCPFrame (
1126 phHciNfc_HCP_Packet_t *hcp_packet,
1127 uint8_t chainbit,
1128 uint8_t pipe_id,
1129 uint8_t msg_type,
1130 uint8_t instruction
1131 );
1132
1133/**
1134 * \ingroup grp_hci_nfc
1135 *
1136 * The phHciNfc_Append_HCPFrame function Appends the HCP Packet Frame
1137 * with the values passed in the arguments .
1138 *
1139 * \param[in] hcp_data hcp_data is the pointer to the HCP
1140 * payload to which the data is to be
1141 * appended.
1142 * \param[in] hcp_index hcp_index is the index from which
1143 * the data source needs to be appended.
1144 * \param[in] src_data src_data that is to be appended to the
1145 * HCP packet.
1146 * \param[in] src_len The length of the data source that is
1147 * to be appended.
1148 * \retval NONE.
1149 *
1150 */
1151
1152extern
1153void
1154 phHciNfc_Append_HCPFrame (
1155 uint8_t *hcp_data,
1156 uint16_t hcp_index,
1157 uint8_t *src_data,
1158 uint16_t src_len
1159 );
1160
1161/**
1162 * \ingroup grp_hci_nfc
1163 *
1164 * The phHciNfc_Allocate_Resource function allocates and initialises the
1165 * resource memory for the HCI layer.
1166 *
1167 * \param[in] ppBuffer ppBuffer is the pointer to which the
1168 * resource memory is allocated.
1169 * \param[in] size Variable that specifies the size of
1170 * the memory that needs to be created.
1171 *
1172 * \retval NFCSTATUS_SUCCESS The Resource Memory was allocated
1173 * successfully .
1174 * \retval
1175 * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated
1176 * as required amount of memory
1177 * is not suffient.
1178 *
1179 */
1180
1181extern
1182NFCSTATUS
1183 phHciNfc_Allocate_Resource (
1184 void **ppBuffer,
1185 uint16_t size
1186 );
1187/**
1188 * \ingroup grp_hci_nfc
1189 *
1190 * The phHciNfc_Release_Resources function releases all the resources
1191 * allocated in the HCI Layer.
1192 *
1193 * \param[in] psHciContext psHciContext is the context of
1194 * the HCI Layer.
1195 *
1196 * \retval NONE.
1197 *
1198 */
1199
1200extern
1201 void
1202 phHciNfc_Release_Resources (
1203 phHciNfc_sContext_t **ppsHciContext
1204 );
1205
1206/**
1207 * \ingroup grp_hci_nfc
1208 *
1209 * The phHciNfc_Release_Lower function initiates the release of the
1210 * lower layers.
1211 *
1212 * \param[in] psHciContext psHciContext is the context of
1213 * the HCI Layer.
1214 * \param[in] pHwRef pHwRef is the Information of
1215 * the Device Interface Link .
1216 *
1217 * \retval NONE.
1218 *
1219 */
1220
1221extern
1222void
1223phHciNfc_Release_Lower(
1224 phHciNfc_sContext_t *psHciContext,
1225 void *pHwRef
1226 );
1227
1228
1229
1230#endif
1231