diff options
| author | Evan Chu <evanchu@broadcom.com> | 2013-11-13 15:30:16 -0500 |
|---|---|---|
| committer | Martijn Coenen <maco@google.com> | 2014-05-19 13:28:24 -0700 |
| commit | a24be4f06674b2707b57904deaa0dff5a95823bd (patch) | |
| tree | 827ab876d14aef121f4bfa398f5a538a0bdd1221 /halimpl/bcm2079x/hal | |
| parent | e9629bad30a9f478b336ab46b8e6e02f7f87af46 (diff) | |
| download | android_hardware_broadcom_nfc-a24be4f06674b2707b57904deaa0dff5a95823bd.tar.gz android_hardware_broadcom_nfc-a24be4f06674b2707b57904deaa0dff5a95823bd.tar.bz2 android_hardware_broadcom_nfc-a24be4f06674b2707b57904deaa0dff5a95823bd.zip | |
Upgrade stack to NFA_PI_1.03.66+
Take code from NFCA_MI_430.10.00.07.
Additional changes include:
* Adjust copyright.
* Clean up stack and HAL diagnostic tracing.
* Fix ce_t4t_data_cback() in src/nfc/tags/ce_t4t.c in order to let HCE payment to work.
* Reduce compilation warnings.
Change-Id: I7b174229029d4a4955ff7750623e78c9a8c856f6
Diffstat (limited to 'halimpl/bcm2079x/hal')
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_dm.c | 38 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c | 8 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_hci.c | 266 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c | 3 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_main.c | 11 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_nci.c | 20 | ||||
| -rw-r--r-- | halimpl/bcm2079x/hal/hal/nfc_hal_prm.c | 12 |
7 files changed, 236 insertions, 122 deletions
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c index 46ef04b..ad02144 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_dm.c @@ -73,18 +73,6 @@ const UINT8 nfc_hal_dm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] = }; #define NCI_PATCH_INFO_VERSION_LEN 16 /* Length of patch version string in PATCH_INFO */ -/* Version string for BCM20791B3 */ -const UINT8 NFC_HAL_DM_BCM20791B3_STR[] = "20791B3"; -#define NFC_HAL_DM_BCM20791B3_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B3_STR)-1) - -/* Version string for BCM20791B4 */ -const UINT8 NFC_HAL_DM_BCM20791B4_STR[] = "20791B4"; -#define NFC_HAL_DM_BCM20791B4_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B4_STR)-1) - -/* Version string for BCM43341B0 */ -const UINT8 NFC_HAL_DM_BCM43341B0_STR[] = "43341B0"; -#define NFC_HAL_DM_BCM43341B0_STR_LEN (sizeof (NFC_HAL_DM_BCM43341B0_STR)-1) - /***************************************************************************** ** Extern function prototypes *****************************************************************************/ @@ -576,25 +564,7 @@ void nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg) STREAM_TO_ARRAY (chipverstr, p, chipverlen); - if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B3_STR, chipverstr, NFC_HAL_DM_BCM20791B3_STR_LEN) == 0)) - { - /* BCM2079B3 FW - eSE restarted for patch download */ - nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; - nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = TRUE; - } - else if ( ((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B4_STR, chipverstr, NFC_HAL_DM_BCM20791B4_STR_LEN) == 0)) - ||((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) && (memcmp (NFC_HAL_DM_BCM43341B0_STR, chipverstr, NFC_HAL_DM_BCM43341B0_STR_LEN) == 0)) ) - { - /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */ - nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; - nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; - } - else - { - /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */ - nfc_hal_cb.hci_cb.hci_fw_workaround = FALSE; - nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; - } + nfc_hal_hci_handle_build_info (chipverlen, chipverstr); /* if NFCC needs to set Xtal frequency before getting patch version */ if (nfc_hal_dm_get_xtal_index (nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq) < NFC_HAL_XTAL_INDEX_MAX) @@ -988,7 +958,6 @@ void nfc_hal_dm_shutting_down_nfcc (void) } nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE; - nfc_hal_cb.hci_cb.hcp_conn_id = 0; nfc_hal_cb.dev_cb.power_mode = NFC_HAL_POWER_MODE_FULL; nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE; @@ -997,7 +966,10 @@ void nfc_hal_dm_shutting_down_nfcc (void) nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer); nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer); nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer); +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) + nfc_hal_cb.hci_cb.hcp_conn_id = 0; nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer); +#endif nfc_hal_main_stop_quick_timer (&nfc_hal_cb.timer); } @@ -1019,7 +991,9 @@ void nfc_hal_dm_init (void) nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback; +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback; +#endif nfc_hal_cb.pre_discover_done = FALSE; diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c b/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c index defc610..420a538 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_dm_cfg.c @@ -148,10 +148,14 @@ tNFC_HAL_CFG nfc_hal_cfg = ** then set it to short to optimize bootup time because NFCC cannot send RESET NTF. ** Otherwise, it depends on NVM type and size of patchram. */ - (UINT16) NFC_HAL_NFCC_ENABLE_TIMEOUT, /* max time to wait for RESET NTF after setting Xtal frequency + (UINT16) NFC_HAL_NFCC_ENABLE_TIMEOUT /* max time to wait for RESET NTF after setting Xtal frequency ** It depends on NVM type and size of patchram. */ - (HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST) /* Set bit(s) for supported UICC(s) */ +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) + , + TRUE, /* set nfc_hal_first_boot to TRUE, if platform enables NFC for the first time after bootup */ + (HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST | HAL_NFC_HCI_UICC2_HOST) /* Set bit(s) for supported UICC(s) */ +#endif }; tNFC_HAL_CFG *p_nfc_hal_cfg= (tNFC_HAL_CFG *) &nfc_hal_cfg; diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c index 0a754d1..6b573d5 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_hci.c @@ -23,13 +23,17 @@ * ******************************************************************************/ #include "gki.h" +#include "nfc_hal_target.h" #include "nfc_hal_api.h" #include "nfc_hal_int.h" + +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) + #include "nfc_hal_nv_ci.h" #include "nfc_hal_nv_co.h" #include <string.h> -#include "nfc_hal_nv_co.h" + #ifndef NFC_HAL_HCI_NV_READ_TIMEOUT #define NFC_HAL_HCI_NV_READ_TIMEOUT 1000 @@ -46,6 +50,21 @@ #define NFC_HAL_HCI_PIPE_VALID_MASK 0x80 +#define NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL 0xFF +#define NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL 0xFE + +/* Version string for BCM20791B3 */ +const UINT8 NFC_HAL_DM_BCM20791B3_STR[] = "20791B3"; +#define NFC_HAL_DM_BCM20791B3_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B3_STR)-1) + +/* Version string for BCM20791B4 */ +const UINT8 NFC_HAL_DM_BCM20791B4_STR[] = "20791B4"; +#define NFC_HAL_DM_BCM20791B4_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B4_STR)-1) + +/* Version string for BCM43341B0 */ +const UINT8 NFC_HAL_DM_BCM43341B0_STR[] = "43341B0"; +#define NFC_HAL_DM_BCM43341B0_STR_LEN (sizeof (NFC_HAL_DM_BCM43341B0_STR)-1) + extern tNFC_HAL_CFG *p_nfc_hal_cfg; /**************************************************************************** ** Internal function prototypes @@ -72,10 +91,10 @@ void nfc_hal_hci_evt_hdlr (tNFC_HAL_HCI_EVENT_DATA *p_evt_data) switch (p_evt_data->hdr.event) { case NFC_HAL_HCI_RSP_NV_READ_EVT: - if ( (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf && (p_evt_data->nv_read.block == HC_F3_NV_BLOCK || p_evt_data->nv_read.block == HC_F4_NV_BLOCK)) + if ( (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf && (p_evt_data->nv_read.block == HC_F3_NV_BLOCK || p_evt_data->nv_read.block == HC_F4_NV_BLOCK || p_evt_data->nv_read.block == HC_F5_NV_BLOCK)) ||(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf && p_evt_data->nv_read.block == HC_F2_NV_BLOCK) ) { - nfc_hal_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status, p_evt_data->nv_read.size); + nfc_hal_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status, p_evt_data->nv_read.size); } else { @@ -131,7 +150,8 @@ void nfc_hal_hci_enable (void) } if ( (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST) - ||((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) && ((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))) ) + ||((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) && ((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))) + ||(p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST) ) { if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_NETWK_INFO_SIZE)) == NULL) { @@ -165,6 +185,40 @@ void nfc_hal_hci_enable (void) /******************************************************************************* ** +** Function nfc_hal_hci_handle_build_info +** +** Description handle build info evt +** +** Returns void +** +*******************************************************************************/ +void nfc_hal_hci_handle_build_info (UINT8 chipverlen, UINT8 *p_chipverstr) +{ + HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_build_info ()"); + + if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B3_STR, p_chipverstr, NFC_HAL_DM_BCM20791B3_STR_LEN) == 0)) + { + /* BCM2079B3 FW - eSE restarted for patch download */ + nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; + nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = TRUE; + } + else if ( ((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B4_STR, p_chipverstr, NFC_HAL_DM_BCM20791B4_STR_LEN) == 0)) + ||((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) && (memcmp (NFC_HAL_DM_BCM43341B0_STR, p_chipverstr, NFC_HAL_DM_BCM43341B0_STR_LEN) == 0)) ) + { + /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */ + nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; + nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; + } + else + { + /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */ + nfc_hal_cb.hci_cb.hci_fw_workaround = FALSE; + nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; + } +} + +/******************************************************************************* +** ** Function nfc_hal_hci_handle_hci_netwk_info ** ** Description Handler function for HCI Network Notification @@ -176,8 +230,9 @@ void nfc_hal_hci_handle_hci_netwk_info (UINT8 *p_data) { UINT8 *p = p_data; UINT16 data_len; - UINT8 target_handle; - UINT8 hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN]; + UINT8 target_handle = 0; + UINT8 hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN]; + UINT8 block = 0; HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hci_netwk_info ()"); @@ -188,46 +243,46 @@ void nfc_hal_hci_handle_hci_netwk_info (UINT8 *p_data) target_handle = *(UINT8 *) p; if (target_handle == NFC_HAL_HCI_DH_TARGET_HANDLE) + { + /* Correct the session id assigned by DH */ + *(p+1) = nfc_hal_cb.hci_cb.dh_session_id[0]; nfc_hal_nv_co_write (p, data_len, HC_F2_NV_BLOCK); + return; + } - else if (target_handle == NFC_HAL_HCI_UICC0_TARGET_HANDLE) + if (target_handle == NFC_HAL_HCI_UICC0_TARGET_HANDLE) { - if ( (!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) ) - { - /* HCI Network notification received for UICC 0, Update nv data */ - nfc_hal_nv_co_write (p, data_len,HC_F3_NV_BLOCK); - } - else - { - HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, Reset nv file: 0x%02x", p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]); - hci_netwk_cmd[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE; - memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); - nfc_hal_nv_co_write (hci_netwk_cmd, 1, HC_F3_NV_BLOCK); - } + block = HC_F3_NV_BLOCK; } else if (target_handle == NFC_HAL_HCI_UICC1_TARGET_HANDLE) { - if ( (!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) - ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) ) - { - /* HCI Network notification received for UICC 1, Update nv data */ - nfc_hal_nv_co_write (p, data_len,HC_F4_NV_BLOCK); - } - else - { - HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, Reset nv file: 0x%02x", p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]); - hci_netwk_cmd[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE; - /* Reset Session ID */ - memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); - nfc_hal_nv_co_write (hci_netwk_cmd, 1, HC_F4_NV_BLOCK); - } + block = HC_F4_NV_BLOCK; + } + else if (target_handle == NFC_HAL_HCI_UICC2_TARGET_HANDLE) + { + block = HC_F5_NV_BLOCK; + } + else + { + HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Invalid Target handle: 0x%02x", target_handle); + return; + } + + if ( (!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd) + ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) + ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) + ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) + ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) ) + { + /* HCI Network notification received for UICC0/UICC1/UICC2, Update nv data */ + nfc_hal_nv_co_write (p, data_len, block); + } + else + { + HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, Reset nv file: 0x%02x", p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]); + hci_netwk_cmd[0] = target_handle; + memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); + nfc_hal_nv_co_write (hci_netwk_cmd, 1, block); } } @@ -298,13 +353,6 @@ BOOLEAN nfc_hal_hci_handle_hcp_pkt_to_hc (UINT8 *p_data) HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_to_hc ()"); - if ( (!nfc_hal_cb.hci_cb.hci_fw_workaround) - ||(nfc_hal_cb.nvm_cb.nvm_type != NCI_SPD_NVM_TYPE_UICC) ) - { - /* Do nothing, just forward the stack hcp packet to host controller */ - return FALSE; - } - chaining_bit = ((*p_data) >> 0x07) & 0x01; pipe = (*p_data++) & 0x7F; @@ -316,21 +364,46 @@ BOOLEAN nfc_hal_hci_handle_hcp_pkt_to_hc (UINT8 *p_data) if (type == NFC_HAL_HCI_COMMAND_TYPE) { inst = (*p_data++ & 0x3F); - if (inst == NFC_HAL_HCI_ANY_SET_PARAMETER) + if (inst == NFC_HAL_HCI_ANY_GET_PARAMETER) { index = *(p_data++); - if (index == NFC_HAL_HCI_WHITELIST_INDEX) + if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) { - /* Set flag to fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task after - * response from host controller to set whitelist cmd + /* Set flag to modify session id[0] on response + * from host controller to set session id cmd */ - nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = TRUE; + nfc_hal_cb.hci_cb.update_session_id = TRUE; + } + } + else if (inst == NFC_HAL_HCI_ANY_SET_PARAMETER) + { + index = *(p_data++); + if (index == NFC_HAL_HCI_WHITELIST_INDEX) + { + if ( (nfc_hal_cb.hci_cb.hci_fw_workaround) + &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC) ) + { + /* Set flag to fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task after + * response from host controller to set whitelist cmd + */ + nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = TRUE; + } + } + else if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) + { + nfc_hal_cb.hci_cb.dh_session_id[0] = *p_data; + if (p_nfc_hal_cfg->nfc_hal_first_boot) + *p_data = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL; + else + *p_data = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL; } } } else if (type == NFC_HAL_HCI_RESPONSE_TYPE) { - if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) + if ( (nfc_hal_cb.hci_cb.hci_fw_workaround) + &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC) + &&(nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) ) { /* Got response to the fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd sent by HAL to nfc task */ nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = FALSE; @@ -360,12 +433,10 @@ void nfc_hal_hci_handle_hcp_pkt_from_hc (UINT8 *p_data) UINT8 inst; UINT8 hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN]; UINT8 source_host; + UINT8 block = 0; HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_from_hc ()"); - if (!nfc_hal_cb.hci_cb.hci_fw_workaround) - return; - chaining_bit = ((*p_data) >> 0x07) & 0x01; pipe = (*p_data++) & 0x7F; @@ -376,35 +447,54 @@ void nfc_hal_hci_handle_hcp_pkt_from_hc (UINT8 *p_data) if (type == NFC_HAL_HCI_COMMAND_TYPE) { + if (!nfc_hal_cb.hci_cb.hci_fw_workaround) + return; + inst = (*p_data++ & 0x3F); if (inst == NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED) { - STREAM_TO_UINT8 (source_host, p_data); HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Received ADM_NOTIFY_ALL_PIPE_CLEARED command for UICC: 0x%02x", source_host); if (source_host == NFC_HAL_HCI_HOST_ID_UICC0) { + block = HC_F3_NV_BLOCK; hci_netwk_cmd[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE; - /* Reset Session ID */ - memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); - nfc_hal_nv_co_write (hci_netwk_cmd, 1, HC_F3_NV_BLOCK); - HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv file for block: 0x%02x", HC_F3_NV_BLOCK); } else if (source_host == NFC_HAL_HCI_HOST_ID_UICC1) { + block = HC_F4_NV_BLOCK; hci_netwk_cmd[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE; + } + else if (source_host == NFC_HAL_HCI_HOST_ID_UICC2) + { + block = HC_F5_NV_BLOCK; + hci_netwk_cmd[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE; + } + + if (source_host >= NFC_HAL_HCI_HOST_ID_UICC0) + { /* Reset Session ID */ memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); - nfc_hal_nv_co_write (hci_netwk_cmd, 1, HC_F4_NV_BLOCK); - HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv file for block: 0x%02x", HC_F4_NV_BLOCK); + nfc_hal_nv_co_write (hci_netwk_cmd, 1, block); + HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv file for block: 0x%02x", block); } } } else if (type == NFC_HAL_HCI_RESPONSE_TYPE) { - if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) + if (nfc_hal_cb.hci_cb.update_session_id) + { + nfc_hal_cb.hci_cb.update_session_id = FALSE; + inst = (*p_data++ & 0x3F); + if (inst == NFC_HAL_HCI_ANY_OK) + { + /* Correct the session id assigned by DH */ + *p_data = nfc_hal_cb.hci_cb.dh_session_id[0]; + } + } + else if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) { /* NVM Type is UICC and got response from host controller * to Set whitelist command. Now fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to @@ -439,6 +529,7 @@ void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 siz { case HC_F3_NV_BLOCK: case HC_F4_NV_BLOCK: + case HC_F5_NV_BLOCK: if ( (status != HAL_NFC_STATUS_OK) ||(size > NFC_HAL_HCI_NETWK_INFO_SIZE) ||(size < NFC_HAL_HCI_MIN_NETWK_INFO_SIZE) @@ -446,7 +537,13 @@ void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 siz { HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block); memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); - nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = (block == HC_F3_NV_BLOCK) ? NFC_HAL_HCI_UICC0_TARGET_HANDLE : NFC_HAL_HCI_UICC1_TARGET_HANDLE; + if (block == HC_F3_NV_BLOCK) + nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE; + else if (block == HC_F4_NV_BLOCK) + nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE; + else + nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE; + memset (&nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); size = NFC_HAL_HCI_NETWK_INFO_SIZE; } @@ -455,15 +552,21 @@ void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 siz break; case HC_F2_NV_BLOCK: + nfc_hal_cb.hci_cb.dh_session_id[0] = nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1]; + if (p_nfc_hal_cfg->nfc_hal_first_boot) + nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL; + else + nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL; if ( (status != HAL_NFC_STATUS_OK) ||(size > NFC_HAL_HCI_DH_NETWK_INFO_SIZE) ||(size < NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE) ) { HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block); - memset (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, 0, NFC_HAL_HCI_DH_NETWK_INFO_SIZE); nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[0] = NFC_HAL_HCI_DH_TARGET_HANDLE; - memset (&nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); + nfc_hal_cb.hci_cb.dh_session_id[0] = 0xFF; + memset (&nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[2], 0xFF, (NFC_HAL_HCI_SESSION_ID_LEN - 1)); + memset ((nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_SESSION_ID_LEN + 1), 0, (NFC_HAL_HCI_DH_NETWK_INFO_SIZE - NFC_HAL_HCI_SESSION_ID_LEN - 1)); size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE; p_hci_netwk_info = (UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE; } @@ -486,15 +589,15 @@ void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 siz return; } - p = p_hci_netwk_info; - /* Send HCI Network ntf command using nv data */ - NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_PROP); - NCI_MSG_BLD_HDR1 (p, NCI_MSG_HCI_NETWK); - UINT8_TO_STREAM (p, (UINT8) size); + p = p_hci_netwk_info; + /* Send HCI Network ntf command using nv data */ + NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_PROP); + NCI_MSG_BLD_HDR1 (p, NCI_MSG_HCI_NETWK); + UINT8_TO_STREAM (p, (UINT8) size); - nfc_hal_dm_send_nci_cmd (p_hci_netwk_info, (UINT16) (NCI_MSG_HDR_SIZE + size), nfc_hal_hci_vsc_cback); + nfc_hal_dm_send_nci_cmd (p_hci_netwk_info, (UINT16) (NCI_MSG_HDR_SIZE + size), nfc_hal_hci_vsc_cback); - nfc_hal_cb.hci_cb.hci_netwk_config_block = block; + nfc_hal_cb.hci_cb.hci_netwk_config_block = block; } /******************************************************************************* @@ -606,6 +709,18 @@ void nfc_hal_hci_set_next_hci_netwk_config (UINT8 block) HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F4 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type); case HC_F4_NV_BLOCK: + if ( (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST) + &&(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) ) + { + /* Send command to read nvram data for 0xF5 */ + memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); + nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F5_NV_BLOCK); + nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT); + break; + } + HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F5 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type); + + case HC_F5_NV_BLOCK: if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_DH_NETWK_INFO_SIZE)) == NULL) { HAL_TRACE_ERROR0 ("nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer for reading hci network info from nvram"); @@ -665,6 +780,7 @@ static void nfc_hal_hci_vsc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT { case HC_F3_NV_BLOCK: case HC_F4_NV_BLOCK: + case HC_F5_NV_BLOCK: case HC_F2_NV_BLOCK: nfc_hal_hci_set_next_hci_netwk_config (nfc_hal_cb.hci_cb.hci_netwk_config_block); break; @@ -697,3 +813,5 @@ void nfc_hal_hci_timeout_cback (void *p_tle) } } +#endif + diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c index 4ec5f5d..49236f9 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_hci_ci.c @@ -26,6 +26,8 @@ #include "gki.h" #include "nfc_hal_api.h" #include "nfc_hal_int.h" + +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) #include "nfc_hal_nv_ci.h" #include "nfc_hal_nv_co.h" @@ -88,3 +90,4 @@ void nfc_hal_nv_ci_write (tNFC_HAL_NV_CO_STATUS status) } } +#endif diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c b/halimpl/bcm2079x/hal/hal/nfc_hal_main.c index 10be44d..d7fc5d5 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_main.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_main.c @@ -502,9 +502,12 @@ static void nfc_hal_send_credit_ntf_for_cid (UINT8 cid) *******************************************************************************/ static void nfc_hal_main_send_message (NFC_HDR *p_msg) { - UINT8 *ps, *pp, cid, pbf; - UINT16 len = p_msg->len; +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) + UINT8 cid, pbf; UINT16 data_len; +#endif + UINT8 *ps, *pp; + UINT16 len = p_msg->len; #ifdef DISP_NCI UINT8 delta; #endif @@ -530,6 +533,8 @@ static void nfc_hal_main_send_message (NFC_HDR *p_msg) delta = p_msg->len - len; DISP_NCI (ps + delta, (UINT16) (p_msg->len - delta), FALSE); #endif + +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) if (nfc_hal_cb.hci_cb.hcp_conn_id) { NCI_DATA_PRS_HDR(pp, pbf, cid, data_len); @@ -545,6 +550,8 @@ static void nfc_hal_main_send_message (NFC_HDR *p_msg) } } +#endif + /* check low power mode state */ if (nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT)) { diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c b/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c index 21d0458..f3547d3 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_nci.c @@ -316,7 +316,8 @@ static BOOLEAN nfc_hal_nci_receive_bt_msg (tNFC_HAL_NCIT_CB *p_cb, UINT8 byte) p_cb->rcv_len = byte; /* Verify that buffer is big enough to fit message */ - if ((sizeof (NFC_HDR) + HCIE_PREAMBLE_SIZE + byte) > GKI_get_buf_size (p_cb->p_rcv_msg)) + if ((p_cb->p_rcv_msg) && + ((sizeof (NFC_HDR) + HCIE_PREAMBLE_SIZE + byte) > GKI_get_buf_size (p_cb->p_rcv_msg)) ) { /* Message cannot fit into buffer */ GKI_freebuf (p_cb->p_rcv_msg); @@ -523,10 +524,13 @@ BOOLEAN nfc_hal_nci_receive_msg (UINT8 byte) *******************************************************************************/ BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg) { - UINT8 *p, *pp, cid; + UINT8 *p, *pp; UINT8 mt, pbf, gid, op_code; UINT8 payload_len; +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) + UINT8 cid; UINT16 data_len; +#endif HAL_TRACE_DEBUG0 ("nfc_hal_nci_preproc_rx_nci_msg()"); @@ -545,6 +549,7 @@ BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg) NCI_MSG_PRS_HDR1 (p, op_code); payload_len = *p++; +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) if (mt == NCI_MT_DATA) { if (nfc_hal_cb.hci_cb.hcp_conn_id) @@ -568,7 +573,9 @@ BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg) } } } - else if (gid == NCI_GID_RF_MANAGE) + else +#endif + if (gid == NCI_GID_RF_MANAGE) { if (mt == NCI_MT_NTF) { @@ -587,6 +594,7 @@ BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg) } } } +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) else if (gid == NCI_GID_CORE) { if (mt == NCI_MT_RSP) @@ -604,6 +612,7 @@ BOOLEAN nfc_hal_nci_preproc_rx_nci_msg (NFC_HDR *p_msg) } } } +#endif } if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) @@ -649,6 +658,7 @@ void nfc_hal_nci_add_nfc_pkt_type (NFC_HDR *p_msg) } } +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) /******************************************************************************* ** ** Function nci_brcm_check_cmd_create_hcp_connection @@ -698,6 +708,8 @@ static void nci_brcm_check_cmd_create_hcp_connection (NFC_HDR *p_msg) } } +#endif + /******************************************************************************* ** ** Function nfc_hal_nci_send_cmd @@ -718,9 +730,11 @@ void nfc_hal_nci_send_cmd (NFC_HDR *p_buf) UINT8 nci_ctrl_size = nfc_hal_cb.ncit_cb.nci_ctrl_size; UINT8 delta = 0; +#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) if ( (nfc_hal_cb.hci_cb.hcp_conn_id == 0) &&(nfc_hal_cb.nvm_cb.nvm_type != NCI_SPD_NVM_TYPE_NONE) ) nci_brcm_check_cmd_create_hcp_connection ((NFC_HDR*) p_buf); +#endif /* check low power mode state */ continue_to_process = nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT); diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c b/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c index ee9cea7..7c22a79 100644 --- a/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c +++ b/halimpl/bcm2079x/hal/hal/nfc_hal_prm.c @@ -380,7 +380,7 @@ void nfc_hal_prm_spd_check_version (void) /********************************************************************* * Version check of patchfile against NVM - ******************************************************************** + *********************************************************************/ /* Download the patchfile if no patches in NVM */ if ((nfc_hal_cb.nvm_cb.project_id == 0) || !(nfc_hal_cb.nvm_cb.flags & NFC_HAL_NVM_FLAGS_PATCH_PRESENT)) { @@ -402,7 +402,7 @@ void nfc_hal_prm_spd_check_version (void) /* Skip download if version of patchfile is equal to version in NVM */ /* and patches of the power modes are the same as the good patches in NVM */ else if ( (nfc_hal_cb.nvm_cb.ver_major == patchfile_ver_major) - &&(nfc_hal_cb.nvm_cb.ver_minor == patchfile_ver_minor) + &&(nfc_hal_cb.nvm_cb.ver_minor == patchfile_ver_minor) &&((nvm_patch_present_mask | patchfile_patch_present_mask) == nvm_patch_present_mask) ) /* if the NVM patch include all the patched in file */ { HAL_TRACE_DEBUG2 ("Patch download skipped. NVM patch (version %i.%i) is the same than the patchfile ", @@ -598,15 +598,9 @@ void nfc_hal_prm_nci_command_complete_cback (tNFC_HAL_NCI_EVT event, UINT16 data if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SIGNATURE_SENT) { /* Wait for authentication complete (SECURE_PATCH_DOWNLOAD NTF), including time to commit to NVM (for BCM43341B0) */ - int auth_delay = NFC_HAL_PRM_SPD_TOUT; - if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_BCM20791B3)) - { - /* XXX maco only wait 30 seconds for B4+ revisions to avoid watchdog timeouts */ - auth_delay = NFC_HAL_PRM_COMMIT_DELAY; - } nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTHENTICATING; nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, - (auth_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000); + (NFC_HAL_PRM_COMMIT_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000); return; } /* Download next segment */ |
