nfc_hal_int.h revision 794a3220e013b6c679f2127792859e6b751ee280
1/******************************************************************************
2 *
3 *  Copyright (C) 2009-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 *  this file contains the NCI transport internal definitions and functions.
22 *
23 ******************************************************************************/
24
25#ifndef NFC_HAL_INT_H
26#define NFC_HAL_INT_H
27
28#include "nfc_hal_target.h"
29#include "gki.h"
30#include "nci_defs.h"
31#include "nfc_brcm_defs.h"
32#include "nfc_hal_api.h"
33#include "nfc_hal_int_api.h"
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/****************************************************************************
40** NFC HAL TASK transport definitions
41****************************************************************************/
42/* NFC HAL Task event masks */
43#define NFC_HAL_TASK_EVT_DATA_RDY               EVENT_MASK (APPL_EVT_0)
44#define NFC_HAL_TASK_EVT_INITIALIZE             EVENT_MASK (APPL_EVT_5)
45#define NFC_HAL_TASK_EVT_TERMINATE              EVENT_MASK (APPL_EVT_6)
46#define NFC_HAL_TASK_EVT_POWER_CYCLE            EVENT_MASK (APPL_EVT_7)
47
48#define NFC_HAL_TASK_EVT_MBOX                   (TASK_MBOX_0_EVT_MASK)
49
50/* NFC HAL Task mailbox definitions */
51#define NFC_HAL_TASK_MBOX                       (TASK_MBOX_0)
52
53/* NFC HAL Task Timer events */
54#ifndef NFC_HAL_QUICK_TIMER_EVT_MASK
55#define NFC_HAL_QUICK_TIMER_EVT_MASK            (TIMER_0_EVT_MASK)
56#endif
57
58#ifndef NFC_HAL_QUICK_TIMER_ID
59#define NFC_HAL_QUICK_TIMER_ID                  (TIMER_0)
60#endif
61
62/* NFC HAL Task Timer types */
63#define NFC_HAL_TTYPE_NCI_WAIT_RSP              0
64#define NFC_HAL_TTYPE_POWER_CYCLE               1
65
66/* NFC HAL Task Wait Response flag */
67#define NFC_HAL_WAIT_RSP_CMD                    0x10    /* wait response on an NCI command                  */
68#define NFC_HAL_WAIT_RSP_VSC                    0x20    /* wait response on an NCI vendor specific command  */
69#define NFC_HAL_WAIT_RSP_PROP                   0x40    /* wait response on a proprietary command           */
70#define NFC_HAL_WAIT_RSP_NONE                   0x00    /* not waiting for anything                         */
71
72typedef UINT8 tNFC_HAL_WAIT_RSP;
73
74typedef UINT16 tNFC_HAL_HCI_EVT;
75
76
77#define NFC_HAL_HCI_DH_TARGET_HANDLE            0xF2
78#define NFC_HAL_HCI_UICC0_TARGET_HANDLE         0xF3
79#define NFC_HAL_HCI_UICC1_TARGET_HANDLE         0xF4
80
81#define NFC_HAL_HCI_SESSION_ID_LEN              0x08
82
83/* NFC HAL transport configuration */
84typedef struct
85{
86    BOOLEAN         shared_transport;           /* TRUE if using shared HCI/NCI transport */
87    UINT8           userial_baud;
88    UINT8           userial_fc;
89} tNFC_HAL_TRANS_CFG;
90
91#ifdef TESTER
92#define NFC_HAL_TRANS_CFG_QUALIFIER               /* For Insight, ncit_cfg is runtime-configurable */
93#else
94#define NFC_HAL_TRANS_CFG_QUALIFIER   const       /* For all other platforms, ncit_cfg is constant */
95#endif
96extern NFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg;
97
98/*****************************************************************************
99* BT HCI definitions
100*****************************************************************************/
101#define BT_HDR      NFC_HDR
102
103/* Tranport message type */
104#define HCIT_TYPE_COMMAND   0x01
105#define HCIT_TYPE_EVENT     0x04
106#define HCIT_TYPE_NFC       0x10
107
108/* Vendor-Specific BT HCI definitions */
109#define HCI_SUCCESS                         0x00
110#define HCI_GRP_VENDOR_SPECIFIC             (0x3F << 10)            /* 0xFC00 */
111#define HCI_BRCM_WRITE_SLEEP_MODE           (0x0027 | HCI_GRP_VENDOR_SPECIFIC)
112#define HCI_GRP_HOST_CONT_BASEBAND_CMDS     (0x03 << 10)            /* 0x0C00 */
113#define HCI_RESET                           (0x0003 | HCI_GRP_HOST_CONT_BASEBAND_CMDS)
114#define HCI_COMMAND_COMPLETE_EVT            0x0E
115#define HCI_BRCM_WRITE_SLEEP_MODE_LENGTH    12
116#define HCI_BRCM_UPDATE_BAUD_RATE_UNENCODED_LENGTH      0x06
117#define HCIE_PREAMBLE_SIZE                  2
118
119/****************************************************************************
120** Internal constants and definitions
121****************************************************************************/
122
123/* NFC HAL receiving states */
124enum
125{
126    NFC_HAL_RCV_IDLE_ST,            /* waiting for packet type byte             */
127    NFC_HAL_RCV_NCI_MSG_ST,         /* waiting for the first byte of NCI header */
128    NFC_HAL_RCV_NCI_HDR_ST,         /* reading NCI header                       */
129    NFC_HAL_RCV_NCI_PAYLOAD_ST,     /* reading NCI payload                      */
130    NFC_HAL_RCV_BT_MSG_ST,          /* waiting for the first byte of BT header  */
131    NFC_HAL_RCV_BT_HDR_ST,          /* reading BT HCI header                    */
132    NFC_HAL_RCV_BT_PAYLOAD_ST       /* reading BT HCI payload                   */
133};
134
135/* errors during NCI packet reassembly process */
136#define NFC_HAL_NCI_RAS_TOO_BIG             0x01
137#define NFC_HAL_NCI_RAS_ERROR               0x02
138typedef UINT8 tNFC_HAL_NCI_RAS;
139
140/* NFC HAL power mode */
141enum
142{
143    NFC_HAL_POWER_MODE_FULL,            /* NFCC is full power mode      */
144    NFC_HAL_POWER_MODE_LAST
145};
146typedef UINT8 tNFC_HAL_POWER_MODE;
147
148
149/* NFC HAL event for low power mode */
150enum
151{
152    NFC_HAL_LP_TX_DATA_EVT,                 /* DH is sending data to NFCC   */
153    NFC_HAL_LP_RX_DATA_EVT,                 /* DH received data from NFCC   */
154    NFC_HAL_LP_TIMEOUT_EVT,                 /* Timeout                      */
155    NFC_HAL_LP_LAST_EVT
156};
157typedef UINT8 tNFC_HAL_LP_EVT;
158
159#define NFC_HAL_ASSERT_NFC_WAKE      0x00   /* assert NFC_WAKE      */
160#define NFC_HAL_DEASSERT_NFC_WAKE    0x01   /* deassert NFC_WAKE    */
161
162#define NFC_HAL_BT_HCI_CMD_HDR_SIZE     3   /* opcode (2) +  length (1)    */
163#define NFC_HAL_CMD_TOUT            (2000)  /* timeout for NCI CMD (in ms) */
164
165#define NFC_HAL_SAVED_HDR_SIZE          (2)
166#define NFC_HAL_SAVED_CMD_SIZE          (2)
167
168#ifndef NFC_HAL_DEBUG
169#define NFC_HAL_DEBUG  TRUE
170#endif
171
172#if (NFC_HAL_DEBUG == TRUE)
173extern const char * const nfc_hal_init_state_str[];
174#define NFC_HAL_SET_INIT_STATE(state)  NCI_TRACE_DEBUG3 ("init state: %d->%d(%s)", nfc_hal_cb.dev_cb.initializing_state, state, nfc_hal_init_state_str[state]); nfc_hal_cb.dev_cb.initializing_state = state;
175#else
176#define NFC_HAL_SET_INIT_STATE(state)  nfc_hal_cb.dev_cb.initializing_state = state;
177#endif
178
179
180/* NFC HAL - NFCC initializing state */
181enum
182{
183    NFC_HAL_INIT_STATE_IDLE,               /* Initialization is done                */
184    NFC_HAL_INIT_STATE_W4_XTAL_SET,        /* Waiting for crystal setting rsp       */
185    NFC_HAL_INIT_STATE_W4_RESET,           /* Waiting for reset rsp                 */
186    NFC_HAL_INIT_STATE_W4_BUILD_INFO,      /* Waiting for build info rsp            */
187    NFC_HAL_INIT_STATE_W4_PATCH_INFO,      /* Waiting for patch info rsp            */
188    NFC_HAL_INIT_STATE_W4_APP_COMPLETE,    /* Waiting for complete from application */
189    NFC_HAL_INIT_STATE_W4_POST_INIT_DONE,  /* Waiting for complete of post init     */
190    NFC_HAL_INIT_STATE_W4_CONTROL_DONE,    /* Waiting for control release           */
191    NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE,/* Waiting for complete of prediscover   */
192    NFC_HAL_INIT_STATE_W4_RE_INIT,         /* Waiting for reset rsp on ReInit       */
193    NFC_HAL_INIT_STATE_CLOSING             /* Shutting down                         */
194};
195typedef UINT8 tNFC_HAL_INIT_STATE;
196
197/* NFC HAL - NFCC config items during post initialization */
198enum
199{
200    NFC_HAL_DM_CONFIG_LPTD,
201    NFC_HAL_DM_CONFIG_PLL_325,
202    NFC_HAL_DM_CONFIG_START_UP,
203    NFC_HAL_DM_CONFIG_I93_DATA_RATE,
204    NFC_HAL_DM_CONFIG_FW_FSM,
205    NFC_HAL_DM_CONFIG_START_UP_VSC,
206    NFC_HAL_DM_CONFIG_NONE
207};
208typedef UINT8 tNFC_HAL_DM_CONFIG;
209
210/* callback function prototype */
211typedef struct
212{
213    UINT16  opcode;
214    UINT16  param_len;
215    UINT8   *p_param_buf;
216} tNFC_HAL_BTVSC_CPLT;
217
218typedef void (tNFC_HAL_BTVSC_CPLT_CBACK) (tNFC_HAL_BTVSC_CPLT *p1);
219
220
221/* data type for NFC_HAL_HCI_RSP_NV_READ_EVT */
222typedef struct
223{
224    NFC_HDR           hdr;
225    UINT8             block;
226    UINT16            size;
227    tHAL_NFC_STATUS   status;
228} tNFC_HAL_HCI_RSP_NV_READ_EVT;
229
230/* data type for NFC_HAL_HCI_RSP_NV_WRITE_EVT */
231typedef struct
232{
233    NFC_HDR           hdr;
234    tHAL_NFC_STATUS   status;
235} tNFC_HAL_HCI_RSP_NV_WRITE_EVT;
236
237
238/* union of all event data types */
239typedef union
240{
241    NFC_HDR                         hdr;
242    /* Internal events */
243    tNFC_HAL_HCI_RSP_NV_READ_EVT    nv_read;
244    tNFC_HAL_HCI_RSP_NV_WRITE_EVT   nv_write;
245} tNFC_HAL_HCI_EVENT_DATA;
246
247/*****************************************************************************
248** Control block for NFC HAL
249*****************************************************************************/
250
251/* Patch RAM Download Control block */
252
253/* PRM states */
254enum
255{
256    NFC_HAL_PRM_ST_IDLE,
257
258    /* Secure patch download stated */
259    NFC_HAL_PRM_ST_SPD_GET_VERSION,
260    NFC_HAL_PRM_ST_SPD_COMPARE_VERSION,
261    NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER,
262    NFC_HAL_PRM_ST_SPD_DOWNLOADING,
263    NFC_HAL_PRM_ST_SPD_AUTHENTICATING,
264    NFC_HAL_PRM_ST_SPD_AUTH_DONE
265};
266typedef UINT8 tNFC_HAL_PRM_STATE;
267
268/* Maximum number of patches (currently 2: LPM and FPM) */
269#define NFC_HAL_PRM_MAX_PATCH_COUNT    2
270#define NFC_HAL_PRM_PATCH_MASK_ALL     0xFFFFFFFF
271
272/* Structures for PRM Control Block */
273typedef struct
274{
275    UINT8               power_mode;
276    UINT16              len;
277} tNFC_HAL_PRM_PATCHDESC;
278
279typedef struct
280{
281    tNFC_HAL_PRM_STATE  state;                  /* download state */
282    UINT32              flags;                  /* internal flags */
283    UINT16              cur_patch_len_remaining;/* bytes remaining in patchfile to process     */
284    const UINT8*        p_cur_patch_data;       /* pointer to patch currently being downloaded */
285    UINT16              cur_patch_offset;       /* offset of next byte to process              */
286    UINT32              dest_ram;
287    TIMER_LIST_ENT      timer;                  /* Timer for patch download                    */
288
289    /* Secure Patch Download */
290    UINT32              spd_patch_needed_mask;  /* Mask of patches that need to be downloaded */
291    UINT32              spd_nvm_patch_mask;     /* Mask of patches currently in NVM */
292    UINT16              spd_project_id;         /* Current project_id of patch in nvm */
293    UINT16              spd_nvm_max_size;
294    UINT16              spd_patch_max_size;
295    UINT16              spd_fpm_patch_size;
296    UINT16              spd_lpm_patch_size;
297
298    UINT8               spd_patch_count;        /* Number of patches left to download */
299    UINT8               spd_cur_patch_idx;      /* Current patch being downloaded */
300    UINT16              spd_ver_major;          /* Current major version of patch in nvm */
301    UINT16              spd_ver_minor;          /* Current minor version of patch in nvm */
302    tNFC_HAL_PRM_PATCHDESC spd_patch_desc[NFC_HAL_PRM_MAX_PATCH_COUNT];
303
304    /* I2C-patch */
305    UINT8               *p_spd_patch;           /* pointer to spd patch             */
306    UINT16              spd_patch_len_remaining;/* patch length                     */
307    UINT16              spd_patch_offset;       /* offset of next byte to process   */
308
309    tNFC_HAL_PRM_FORMAT format;                 /* format of patch ram              */
310    tNFC_HAL_PRM_CBACK  *p_cback;               /* Callback for download status notifications */
311    UINT32              patchram_delay;         /* the dealy after patch */
312} tNFC_HAL_PRM_CB;
313
314/* Patch for I2C fix */
315typedef struct
316{
317    UINT8               *p_patch;               /* patch for i2c fix                */
318    UINT32              prei2c_delay;           /* the dealy after preI2C patch */
319    UINT16              len;                    /* i2c patch length                 */
320} tNFC_HAL_PRM_I2C_FIX_CB;
321
322/* Control block for NCI transport */
323typedef struct
324{
325    UINT8               nci_ctrl_size;      /* Max size for NCI messages                              */
326    UINT8               rcv_state;          /* current rx state                                       */
327    UINT16              rcv_len;            /* bytes remaining to be received in current rx state     */
328    NFC_HDR             *p_rcv_msg;         /* buffer to receive NCI message                          */
329    NFC_HDR             *p_frag_msg;        /* fragmented NCI message; waiting for last fragment      */
330    NFC_HDR             *p_pend_cmd;        /* pending NCI message; waiting for NFCC state to be free */
331    tNFC_HAL_NCI_RAS    nci_ras;            /* nci reassembly error status                            */
332    TIMER_LIST_ENT      nci_wait_rsp_timer; /* Timer for waiting for nci command response             */
333    tNFC_HAL_WAIT_RSP   nci_wait_rsp;       /* nci wait response flag                                 */
334    UINT8               last_hdr[NFC_HAL_SAVED_HDR_SIZE];/* part of last NCI command header           */
335    UINT8               last_cmd[NFC_HAL_SAVED_CMD_SIZE];/* part of last NCI command payload          */
336    void                *p_vsc_cback;       /* the callback function for last VSC command             */
337} tNFC_HAL_NCIT_CB;
338
339/* Control block for device initialization */
340typedef struct
341{
342    tNFC_HAL_INIT_STATE     initializing_state;     /* state of initializing NFCC               */
343
344    UINT32                  brcm_hw_id;             /* BRCM NFCC HW ID                          */
345    tNFC_HAL_DM_CONFIG      next_dm_config;         /* next config in post initialization       */
346    UINT8                   next_startup_vsc;       /* next start-up VSC offset in post init    */
347
348    tNFC_HAL_POWER_MODE     power_mode;             /* NFCC power mode                          */
349    UINT8                   snooze_mode;            /* current snooze mode                      */
350    UINT8                   new_snooze_mode;        /* next snooze mode after receiving cmpl    */
351    UINT8                   nfc_wake_active_mode;   /* NFC_HAL_LP_ACTIVE_LOW/HIGH               */
352    TIMER_LIST_ENT          lp_timer;               /* timer for low power mode                 */
353
354
355    tHAL_NFC_STATUS_CBACK   *p_prop_cback;          /* callback to notify complete of proprietary update */
356} tNFC_HAL_DEV_CB;
357
358/* data members for NFC_HAL-HCI */
359typedef struct
360{
361    TIMER_LIST_ENT          hci_timer;                /* Timer to avoid indefinitely waiting for response */
362    tNCI_HCI_NETWK          *p_hci_netwk_info_buf;    /* Buffer for reading HCI Network information */
363    tNCI_HCI_NETWK_DH       *p_hci_netwk_dh_info_buf; /* Buffer for reading HCI Network DH information */
364    UINT8                   hci_netwk_config_block;   /* Rsp awaiting for hci network configuration block */
365} tNFC_HAL_HCI_CB;
366
367typedef struct
368{
369    tHAL_NFC_CBACK          *p_stack_cback;     /* Callback for HAL event notification  */
370    tHAL_NFC_DATA_CBACK     *p_data_cback;      /* Callback for data event notification  */
371
372    TIMER_LIST_Q            quick_timer_queue;  /* timer list queue                 */
373    TIMER_LIST_ENT          timer;              /* timer for NCI transport task     */
374
375    tNFC_HAL_NCIT_CB        ncit_cb;            /* NCI transport */
376    tNFC_HAL_DEV_CB         dev_cb;             /* device initialization */
377
378    /* Patchram control block */
379    tNFC_HAL_PRM_CB         prm;
380    tNFC_HAL_PRM_I2C_FIX_CB prm_i2c;
381
382    /* data members for NFC_HAL-HCI */
383    tNFC_HAL_HCI_CB         hci_cb;
384
385
386    tNFC_HAL_NCI_CBACK      *p_reinit_cback;
387    UINT8                   max_rf_credits;     /* NFC Max RF data credits */
388    UINT8                   trace_level;        /* NFC HAL trace level */
389} tNFC_HAL_CB;
390
391/* Global NCI data */
392#if NFC_DYNAMIC_MEMORY == FALSE
393extern tNFC_HAL_CB   nfc_hal_cb;
394#else
395#define nfc_hal_cb (*nfc_hal_cb_ptr)
396extern tNFC_HAL_CB *nfc_hal_cb_ptr;
397#endif
398
399/****************************************************************************
400** Internal nfc functions
401****************************************************************************/
402
403/* From nfc_hal_main.c */
404UINT32 nfc_hal_main_task (UINT32 param);
405void   nfc_hal_main_init (void);
406void   nfc_hal_main_pre_init_done (tHAL_NFC_STATUS);
407void   nfc_hal_main_start_quick_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout);
408void   nfc_hal_main_stop_quick_timer (TIMER_LIST_ENT *p_tle);
409void   nfc_hal_main_send_error (tHAL_NFC_STATUS status);
410
411/* nfc_hal_nci.c */
412BOOLEAN nfc_hal_nci_receive_msg (UINT8 byte);
413BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg);
414void    nfc_hal_nci_assemble_nci_msg (void);
415void    nfc_hal_nci_add_nfc_pkt_type (NFC_HDR *p_msg);
416void    nfc_hal_nci_send_cmd (NFC_HDR *p_buf);
417void    nfc_hal_nci_cmd_timeout_cback (void *p_tle);
418
419/* nfc_hal_dm.c */
420void nfc_hal_dm_init (void);
421void nfc_hal_dm_set_xtal_freq_index (void);
422void nfc_hal_dm_send_reset_cmd (void);
423void nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg);
424void nfc_hal_dm_config_nfcc (void);
425void nfc_hal_dm_send_nci_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_NCI_CBACK *p_cback);
426void nfc_hal_dm_send_bt_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_BTVSC_CPLT_CBACK *p_cback);
427void nfc_hal_dm_set_nfc_wake (UINT8 cmd);
428void nfc_hal_dm_pre_init_nfcc (void);
429void nfc_hal_dm_shutting_down_nfcc (void);
430BOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event);
431void nfc_hal_dm_send_pend_cmd (void);
432
433/* nfc_hal_prm.c */
434void nfc_hal_prm_spd_reset_ntf (UINT8 reset_reason, UINT8 reset_type);
435void nfc_hal_prm_nci_command_complete_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data);
436void nfc_hal_prm_process_timeout (void *p_tle);
437
438/* nfc_hal_hci.c */
439void nfc_hal_hci_enable (void);
440void nfc_hal_hci_evt_hdlr (tNFC_HAL_HCI_EVENT_DATA *p_evt_data);
441void nfc_hal_hci_handle_hci_netwk_info (UINT8 *p_data);
442void nfc_hal_hci_timeout_cback (void *p_tle);
443
444
445/* Define default NCI protocol trace function (if protocol tracing is enabled) */
446#if (defined(NFC_HAL_TRACE_PROTOCOL) && (NFC_HAL_TRACE_PROTOCOL == TRUE))
447#if !defined (DISP_NCI)
448#define DISP_NCI    (DispNci)
449void DispNci (UINT8 *p, UINT16 len, BOOLEAN is_recv);
450#endif  /* DISP_NCI */
451
452/* For displaying vendor-specific HCI commands */
453void DispHciCmd (BT_HDR *p_buf);
454void DispHciEvt (BT_HDR *p_buf);
455#endif /* NFC_HAL_TRACE_PROTOCOL */
456
457#ifdef __cplusplus
458}
459#endif
460
461#endif /* NFC_HAL_INT_H */
462