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