PN80T power state related changes.
(cherry picked from commit 4a087ab0825e4d25ea2b51e711da504ea3fda851)
Change-Id: Ie1068e963c88cb651db9e92bef367d2577b357ce
diff --git a/halimpl/pn54x/libnfc-nxp-PN81T_example.conf b/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
index 4df5951..1677416 100644
--- a/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
+++ b/halimpl/pn54x/libnfc-nxp-PN81T_example.conf
@@ -197,8 +197,8 @@
# bit pos 0 = Switch On
# bit pos 1 = Switch Off
# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
+# bit pos 3 = Screen On lock
+# bit pos 4 = Screen off unlock
DEFAULT_AID_PWR_STATE=0x19
###############################################################################
@@ -207,8 +207,8 @@
# bit pos 0 = Switch On
# bit pos 1 = Switch Off
# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
+# bit pos 3 = Screen On lock
+# bit pos 4 = Screen off unlock
DEFAULT_DESFIRE_PWR_STATE=0x1B
###############################################################################
@@ -217,8 +217,8 @@
# bit pos 0 = Switch On
# bit pos 1 = Switch Off
# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
+# bit pos 3 = Screen On lock
+# bit pos 4 = Screen off unlock
DEFAULT_MIFARE_CLT_PWR_STATE=0x1B
###############################################################################
@@ -227,8 +227,8 @@
# bit pos 0 = Switch On
# bit pos 1 = Switch Off
# bit pos 2 = Battery Off
-# bit pos 3 = Screen Lock
-# bit pos 4 = Screen Off
+# bit pos 3 = Screen On lock
+# bit pos 4 = Screen off unlock
DEFAULT_FELICA_CLT_PWR_STATE=0x1B
###############################################################################
diff --git a/src/hal/include/nci_defs.h b/src/hal/include/nci_defs.h
index bfc7a2e..0e9ba18 100644
--- a/src/hal/include/nci_defs.h
+++ b/src/hal/include/nci_defs.h
@@ -544,11 +544,11 @@
#define NCI_ROUTE_PWR_STATE_BATT_OFF 0x04
#if (NXP_EXTNS == TRUE)
/* The device is screen off Unlock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK() ((NFC_GetNCIVersion() == NCI_VERSION_2_0)?0x08:0x00)
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK() ((NFC_GetNCIVersion() == NCI_VERSION_2_0)?0x08:0x80)
/* The device is screen on lock mode */
#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK() ((NFC_GetNCIVersion() == NCI_VERSION_2_0)?0x10:0x40)
/* The device is screen off lock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK() ((NFC_GetNCIVersion() == NCI_VERSION_2_0)?0x20:0x80)
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK() ((NFC_GetNCIVersion() == NCI_VERSION_2_0)?0x20:0x00)
#endif
/* Hardware / Registration Identification */
#define NCI_NFCEE_TAG_HW_ID 0x00
diff --git a/src/nfa/ee/nfa_ee_act.c b/src/nfa/ee/nfa_ee_act.c
index c449d63..31ee1ba 100644
--- a/src/nfa/ee/nfa_ee_act.c
+++ b/src/nfa/ee/nfa_ee_act.c
@@ -330,6 +330,220 @@
return lmrt_size;
}
+static void nfa_ee_add_tech_route_to_ecb(tNFA_EE_ECB* p_cb, uint8_t* pp,
+ uint8_t* p, uint8_t* ps,
+ int* p_cur_offset) {
+ uint8_t num_tlv = *ps;
+
+ /* add the Technology based routing */
+ for (int xx = 0; xx < NFA_EE_NUM_TECH; xx++) {
+ uint8_t power_cfg = 0;
+ if (p_cb->tech_switch_on & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_ON;
+ if (p_cb->tech_switch_off & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
+ if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+ if (power_cfg & NCI_ROUTE_PWR_STATE_ON) {
+ if (p_cb->tech_screen_lock & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+ if (p_cb->tech_screen_off & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+ if (p_cb->tech_screen_off_lock & nfa_ee_tech_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+ }
+ if (power_cfg) {
+ add_route_tech_proto_tlv(&pp, NFC_ROUTE_TAG_TECH, p_cb->nfcee_id,
+ power_cfg, nfa_ee_tech_list[xx]);
+ num_tlv++;
+ if (power_cfg != NCI_ROUTE_PWR_STATE_ON)
+ nfa_ee_cb.ee_cfged |= NFA_EE_CFGED_OFF_ROUTING;
+ }
+ }
+
+ /* update the num_tlv and current offset */
+ uint8_t entry_size = (uint8_t)(pp - p);
+ *p_cur_offset += entry_size;
+ *ps = num_tlv;
+}
+
+static void nfa_ee_add_proto_route_to_ecb(tNFA_EE_ECB* p_cb, uint8_t* pp,
+ uint8_t* p, uint8_t* ps,
+ int* p_cur_offset) {
+ uint8_t num_tlv = *ps;
+
+ /* add the Protocol based routing */
+ for (int xx = 0; xx < NFA_EE_NUM_PROTO; xx++) {
+ uint8_t power_cfg = 0, proto_tag = 0;
+ if (p_cb->proto_switch_on & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_ON;
+ if (p_cb->proto_switch_off & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
+ if (p_cb->proto_battery_off & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+ if (power_cfg) {
+ /* Applying Route Block for ISO DEP Protocol, so that AIDs
+ * which are not in the routing table can also be blocked */
+ if (nfa_ee_proto_mask_list[xx] == NFA_PROTOCOL_MASK_ISO_DEP||nfa_ee_proto_mask_list[xx] == NFC_PROTOCOL_MASK_ISO7816) {
+ proto_tag = NFC_ROUTE_TAG_PROTO | nfa_ee_cb.route_block_control;
+
+ /* Enable screen on lock power state for ISO-DEP protocol to
+ enable HCE screen lock */
+ if (p_cb->nfcee_id == NFC_DH_ID)
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+ else
+ {
+ if (p_cb->proto_screen_lock & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+ if (p_cb->proto_screen_off & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+ if (p_cb->proto_screen_off_lock & nfa_ee_proto_mask_list[xx])
+ power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+ }
+ } else {
+ proto_tag = NFC_ROUTE_TAG_PROTO;
+ }
+
+ add_route_tech_proto_tlv(&pp, proto_tag, p_cb->nfcee_id, power_cfg,
+ nfa_ee_proto_list[xx]);
+ num_tlv++;
+ if (power_cfg != NCI_ROUTE_PWR_STATE_ON)
+ nfa_ee_cb.ee_cfged |= NFA_EE_CFGED_OFF_ROUTING;
+ }
+ }
+
+ /* add NFC-DEP routing to HOST */
+ if (p_cb->nfcee_id == NFC_DH_ID) {
+ add_route_tech_proto_tlv(&pp, NFC_ROUTE_TAG_PROTO, NFC_DH_ID,
+ NCI_ROUTE_PWR_STATE_ON, NFC_PROTOCOL_NFC_DEP);
+
+ num_tlv++;
+ NFA_TRACE_DEBUG1("%s - NFC DEP added for DH!!!", __func__);
+ }
+ /* update the num_tlv and current offset */
+ uint8_t entry_size = (uint8_t)(pp - p);
+ *p_cur_offset += entry_size;
+ *ps = num_tlv;
+}
+
+static void nfa_ee_add_aid_route_to_ecb(tNFA_EE_ECB* p_cb, uint8_t* pp,
+ uint8_t* p, uint8_t* ps,
+ int* p_cur_offset, int* p_max_len) {
+ uint8_t num_tlv = *ps;
+
+ /* add the AID routing */
+ if (p_cb->aid_entries) {
+ int start_offset = 0;
+ for (int xx = 0; xx < p_cb->aid_entries; xx++) {
+ /* remember the beginning of this AID routing entry, just in case we
+ * need to put it in next command */
+ uint8_t route_qual = 0;
+ uint8_t* p_start = pp;
+ /* add one AID entry */
+ if (p_cb->aid_rt_info[xx] & NFA_EE_AE_ROUTE) {
+ num_tlv++;
+ uint8_t* pa = &p_cb->aid_cfg[start_offset];
+
+ NFA_TRACE_DEBUG2("%s - p_cb->aid_info%x", __func__,
+ p_cb->aid_info[xx]);
+ if (p_cb->aid_info[xx] & NCI_ROUTE_QUAL_LONG_SELECT) {
+ NFA_TRACE_DEBUG2("%s - %x", __func__,
+ p_cb->aid_info[xx] & NCI_ROUTE_QUAL_LONG_SELECT);
+ route_qual |= NCI_ROUTE_QUAL_LONG_SELECT;
+ }
+ if (p_cb->aid_info[xx] & NCI_ROUTE_QUAL_SHORT_SELECT) {
+ NFA_TRACE_DEBUG2("%s - %x", __func__,
+ p_cb->aid_info[xx] & NCI_ROUTE_QUAL_SHORT_SELECT);
+ route_qual |= NCI_ROUTE_QUAL_SHORT_SELECT;
+ }
+
+ uint8_t tag =
+ NFC_ROUTE_TAG_AID | nfa_ee_cb.route_block_control | route_qual;;
+
+ add_route_aid_tlv(&pp, pa, p_cb->aid_rt_loc[xx], p_cb->aid_pwr_cfg[xx], tag);
+ }
+ start_offset += p_cb->aid_len[xx];
+ uint8_t new_size = (uint8_t)(pp - p_start);
+ nfa_ee_check_set_routing(new_size, p_max_len, ps, p_cur_offset);
+ if (*ps == 0) {
+ /* just sent routing command, update local */
+ *ps = 1;
+ num_tlv = *ps;
+ *p_cur_offset = new_size;
+ pp = ps + 1;
+ p = pp;
+ memcpy(p, p_start, new_size);
+ pp += new_size;
+ } else {
+ /* add the new entry */
+ *ps = num_tlv;
+ *p_cur_offset += new_size;
+ }
+ }
+ } else {
+ NFA_TRACE_DEBUG1("%s - No AID entries available", __func__);
+ }
+}
+static void nfa_ee_add_apdu_route_to_ecb(tNFA_EE_ECB* p_cb, uint8_t* pp,
+ uint8_t* p, uint8_t* ps,
+ int* p_cur_offset, int* p_max_len) {
+ uint8_t num_tlv = *ps, len;
+ uint16_t tlv_size;
+ tlv_size = (uint8_t)*p_cur_offset;
+ int start_offset, xx;
+ uint8_t *pa;
+ uint8_t* p_start;
+ uint8_t new_size;
+ uint8_t max_tlv;
+
+ /* add the AID routing */
+ if (p_cb->apdu_pattern_entries) {
+ start_offset = 0;
+ for (xx = 0; xx < p_cb->apdu_pattern_entries; xx++) {
+ p_start = pp;
+ /* add one APDU entry */
+ if (p_cb->apdu_rt_info[xx] & NFA_EE_AE_ROUTE) {
+ num_tlv++;
+ pa = &p_cb->apdu_cfg[start_offset];
+ pa++; /* EMV tag */
+ len = *pa++; /* apdu_len */
+ *pp++ = NFC_ROUTE_TAG_APDU;
+ *pp++ = len + 2;
+ *pp++ = (p_cb->apdu_rt_info[xx] >> NFA_EE_APDU_ROUTE_MASK);
+ NFA_TRACE_DEBUG1("nfa_ee_route_add_one_ecb_by_route_order p_cb->apdu_rt_info[xx] %x", p_cb->apdu_rt_info[xx]);
+ *pp++ = p_cb->apdu_pwr_cfg[xx];
+ /* copy the APDU */
+ memcpy(pp, pa, len);
+ pp += len;
+ }
+ start_offset += p_cb->apdu_len[xx];
+ new_size = (uint8_t)(pp - p_start);
+ NFA_TRACE_DEBUG1("nfa_ee_route_add_one_ecb_by_route_order --before num_tlv:- %d", num_tlv);
+ NFA_TRACE_DEBUG1("nfa_ee_route_add_one_ecb_by_route_order --before new_size:- %d",new_size);
+ nfa_ee_check_set_routing(new_size, p_max_len, ps, p_cur_offset);
+ if (*ps == 0) {
+ /* just sent routing command, update local */
+ *ps = 1;
+ num_tlv = *ps;
+ *p_cur_offset = new_size;
+ pp = ps + 1;
+ p = pp;
+ tlv_size = (uint8_t)*p_cur_offset;
+ max_tlv = (uint8_t)((*p_max_len > NFA_EE_ROUT_MAX_TLV_SIZE)
+ ? NFA_EE_ROUT_MAX_TLV_SIZE
+ : *p_max_len);
+ memcpy(p, p_start, new_size);
+ pp += new_size;
+ } else {
+ /* add the new entry */
+ *ps = num_tlv;
+ *p_cur_offset += new_size;
+ }
+ }
+ NFA_TRACE_DEBUG1("nfa_ee_route_add_one_ecb_by_route_order --num_tlv:- %d", num_tlv);
+ NFA_TRACE_DEBUG1("nfa_ee_route_add_one_ecb_by_route_order --new_size:- %d",new_size);
+ }
+}
/*******************************************************************************
**
** Function nfa_ee_conn_cback