NCI2.0 Support for registering additional power states for protocol and technology routing.
Bug: 69876039
Test: In NCI2.0 mode, Perform HCE in screen on lock;
Test: Perform CE off host in screen on lock, off lock and screen off unlock.
Change-Id: I9b628eb18e54d82257eef5944411eb343aaa2724
(cherry picked from commit fb3ba9fea56a724daea636caa9d152ad30a6288a)
diff --git a/src/include/nci_defs.h b/src/include/nci_defs.h
index 9cf7c52..67a9afb 100644
--- a/src/include/nci_defs.h
+++ b/src/include/nci_defs.h
@@ -395,10 +395,15 @@
#define NCI_ROUTE_PWR_STATE_SWITCH_OFF 0x02
/* The device's battery is removed */
#define NCI_ROUTE_PWR_STATE_BATT_OFF 0x04
-/* The device is in screen off Unlock mode */
-/* The device is in screen on lock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK 0x10
-/* The device is in screen off lock mode */
+/* The device is screen off Unlock mode */
+#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 : 0x00)
/* Hardware / Registration Identification */
#define NCI_NFCEE_TAG_HW_ID 0x00
diff --git a/src/nfa/ee/nfa_ee_act.cc b/src/nfa/ee/nfa_ee_act.cc
index 4fd489e..a9d5cd6 100644
--- a/src/nfa/ee/nfa_ee_act.cc
+++ b/src/nfa/ee/nfa_ee_act.cc
@@ -158,8 +158,17 @@
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) &&
+ (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+ 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) {
- /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (techonogy) */
+ /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (technology) */
p_cb->size_mask += 5;
}
}
@@ -173,6 +182,15 @@
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 & NCI_ROUTE_PWR_STATE_ON) &&
+ (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+ 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();
+ }
if (power_cfg) {
/* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (protocol) */
p_cb->size_mask += 5;
@@ -290,6 +308,15 @@
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) &&
+ (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+ 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]);
@@ -327,8 +354,15 @@
/* Enable screen on lock power state for ISO-DEP protocol to
enable HCE screen lock */
- if (NFC_GetNCIVersion() == NCI_VERSION_2_0)
- power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK;
+ if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+ (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+ 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;
}
@@ -833,11 +867,18 @@
tNFA_TECHNOLOGY_MASK old_tech_switch_on = p_cb->tech_switch_on;
tNFA_TECHNOLOGY_MASK old_tech_switch_off = p_cb->tech_switch_off;
tNFA_TECHNOLOGY_MASK old_tech_battery_off = p_cb->tech_battery_off;
+ tNFA_TECHNOLOGY_MASK old_tech_screen_lock = p_cb->tech_screen_lock;
+ tNFA_TECHNOLOGY_MASK old_tech_screen_off = p_cb->tech_screen_off;
+ tNFA_TECHNOLOGY_MASK old_tech_screen_off_lock = p_cb->tech_screen_off_lock;
uint8_t old_size_mask = p_cb->size_mask;
if ((p_cb->tech_switch_on == p_data->set_tech.technologies_switch_on) &&
(p_cb->tech_switch_off == p_data->set_tech.technologies_switch_off) &&
- (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off)) {
+ (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off) &&
+ (p_cb->tech_screen_lock == p_data->set_tech.technologies_screen_lock) &&
+ (p_cb->tech_screen_off == p_data->set_tech.technologies_screen_off) &&
+ (p_cb->tech_screen_off_lock ==
+ p_data->set_tech.technologies_screen_off_lock)) {
/* nothing to change */
evt_data.status = NFA_STATUS_OK;
nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_TECH_CFG_EVT, &evt_data);
@@ -847,6 +888,9 @@
p_cb->tech_switch_on = p_data->set_tech.technologies_switch_on;
p_cb->tech_switch_off = p_data->set_tech.technologies_switch_off;
p_cb->tech_battery_off = p_data->set_tech.technologies_battery_off;
+ p_cb->tech_screen_lock = p_data->set_tech.technologies_screen_lock;
+ p_cb->tech_screen_off = p_data->set_tech.technologies_screen_off;
+ p_cb->tech_screen_off_lock = p_data->set_tech.technologies_screen_off_lock;
nfa_ee_update_route_size(p_cb);
if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
LOG(ERROR) << StringPrintf("nfa_ee_api_set_tech_cfg Exceed LMRT size");
@@ -854,10 +898,15 @@
p_cb->tech_switch_on = old_tech_switch_on;
p_cb->tech_switch_off = old_tech_switch_off;
p_cb->tech_battery_off = old_tech_battery_off;
+ p_cb->tech_screen_lock = old_tech_screen_lock;
+ p_cb->tech_screen_off = old_tech_screen_off;
+ p_cb->tech_screen_off_lock = old_tech_screen_off_lock;
p_cb->size_mask = old_size_mask;
} else {
p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_TECH;
- if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off) {
+ if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off |
+ p_cb->tech_screen_lock | p_cb->tech_screen_off |
+ p_cb->tech_screen_off_lock) {
/* if any technology in any power mode is configured, mark this entry as
* configured */
nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
@@ -884,11 +933,18 @@
tNFA_PROTOCOL_MASK old_proto_switch_on = p_cb->proto_switch_on;
tNFA_PROTOCOL_MASK old_proto_switch_off = p_cb->proto_switch_off;
tNFA_PROTOCOL_MASK old_proto_battery_off = p_cb->proto_battery_off;
+ tNFA_PROTOCOL_MASK old_proto_screen_lock = p_cb->proto_screen_lock;
+ tNFA_PROTOCOL_MASK old_proto_screen_off = p_cb->proto_screen_off;
+ tNFA_PROTOCOL_MASK old_proto_screen_off_lock = p_cb->proto_screen_off_lock;
uint8_t old_size_mask = p_cb->size_mask;
if ((p_cb->proto_switch_on == p_data->set_proto.protocols_switch_on) &&
(p_cb->proto_switch_off == p_data->set_proto.protocols_switch_off) &&
- (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off)) {
+ (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off) &&
+ (p_cb->proto_screen_lock == p_data->set_proto.protocols_screen_lock) &&
+ (p_cb->proto_screen_off == p_data->set_proto.protocols_screen_off) &&
+ (p_cb->proto_screen_off_lock ==
+ p_data->set_proto.protocols_screen_off_lock)) {
/* nothing to change */
evt_data.status = NFA_STATUS_OK;
nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_PROTO_CFG_EVT, &evt_data);
@@ -898,6 +954,9 @@
p_cb->proto_switch_on = p_data->set_proto.protocols_switch_on;
p_cb->proto_switch_off = p_data->set_proto.protocols_switch_off;
p_cb->proto_battery_off = p_data->set_proto.protocols_battery_off;
+ p_cb->proto_screen_lock = p_data->set_proto.protocols_screen_lock;
+ p_cb->proto_screen_off = p_data->set_proto.protocols_screen_off;
+ p_cb->proto_screen_off_lock = p_data->set_proto.protocols_screen_off_lock;
nfa_ee_update_route_size(p_cb);
if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
LOG(ERROR) << StringPrintf("nfa_ee_api_set_proto_cfg Exceed LMRT size");
@@ -905,11 +964,15 @@
p_cb->proto_switch_on = old_proto_switch_on;
p_cb->proto_switch_off = old_proto_switch_off;
p_cb->proto_battery_off = old_proto_battery_off;
+ p_cb->proto_screen_lock = old_proto_screen_lock;
+ p_cb->proto_screen_off = old_proto_screen_off;
+ p_cb->proto_screen_off_lock = old_proto_screen_off_lock;
p_cb->size_mask = old_size_mask;
} else {
p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_PROTO;
if (p_cb->proto_switch_on | p_cb->proto_switch_off |
- p_cb->proto_battery_off) {
+ p_cb->proto_battery_off | p_cb->proto_screen_lock |
+ p_cb->proto_screen_off | p_cb->proto_screen_off_lock) {
/* if any protocol in any power mode is configured, mark this entry as
* configured */
nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
diff --git a/src/nfa/ee/nfa_ee_api.cc b/src/nfa/ee/nfa_ee_api.cc
index 0de659e..af99a7d 100644
--- a/src/nfa/ee/nfa_ee_api.cc
+++ b/src/nfa/ee/nfa_ee_api.cc
@@ -291,7 +291,10 @@
tNFA_STATUS NFA_EeSetDefaultTechRouting(
tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
tNFA_TECHNOLOGY_MASK technologies_switch_off,
- tNFA_TECHNOLOGY_MASK technologies_battery_off) {
+ tNFA_TECHNOLOGY_MASK technologies_battery_off,
+ tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+ tNFA_TECHNOLOGY_MASK technologies_screen_off,
+ tNFA_TECHNOLOGY_MASK technologies_screen_off_lock) {
tNFA_EE_API_SET_TECH_CFG* p_msg;
tNFA_STATUS status = NFA_STATUS_FAILED;
uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
@@ -299,9 +302,10 @@
DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
""
- "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x>",
+ "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
ee_handle, technologies_switch_on, technologies_switch_off,
- technologies_battery_off);
+ technologies_battery_off, technologies_screen_lock,
+ technologies_screen_off, technologies_screen_off_lock);
p_cb = nfa_ee_find_ecb(nfcee_id);
if (p_cb == NULL) {
@@ -317,6 +321,9 @@
p_msg->technologies_switch_on = technologies_switch_on;
p_msg->technologies_switch_off = technologies_switch_off;
p_msg->technologies_battery_off = technologies_battery_off;
+ p_msg->technologies_screen_lock = technologies_screen_lock;
+ p_msg->technologies_screen_off = technologies_screen_off;
+ p_msg->technologies_screen_off_lock = technologies_screen_off_lock;
nfa_sys_sendmsg(p_msg);
@@ -351,16 +358,20 @@
tNFA_STATUS NFA_EeSetDefaultProtoRouting(
tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
tNFA_PROTOCOL_MASK protocols_switch_off,
- tNFA_PROTOCOL_MASK protocols_battery_off) {
+ tNFA_PROTOCOL_MASK protocols_battery_off,
+ tNFA_PROTOCOL_MASK protocols_screen_lock,
+ tNFA_PROTOCOL_MASK protocols_screen_off,
+ tNFA_PROTOCOL_MASK protocols_screen_off_lock) {
tNFA_EE_API_SET_PROTO_CFG* p_msg;
tNFA_STATUS status = NFA_STATUS_FAILED;
uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
tNFA_EE_ECB* p_cb;
DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
- "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x>",
+ "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
ee_handle, protocols_switch_on, protocols_switch_off,
- protocols_battery_off);
+ protocols_battery_off, protocols_screen_lock, protocols_screen_off,
+ protocols_screen_off_lock);
p_cb = nfa_ee_find_ecb(nfcee_id);
if (p_cb == NULL) {
@@ -376,6 +387,9 @@
p_msg->protocols_switch_on = protocols_switch_on;
p_msg->protocols_switch_off = protocols_switch_off;
p_msg->protocols_battery_off = protocols_battery_off;
+ p_msg->protocols_screen_lock = protocols_screen_lock;
+ p_msg->protocols_screen_off = protocols_screen_off;
+ p_msg->protocols_screen_off_lock = protocols_screen_off_lock;
nfa_sys_sendmsg(p_msg);
diff --git a/src/nfa/include/nfa_ee_api.h b/src/nfa/include/nfa_ee_api.h
index 7df0df4..78d0fe7 100644
--- a/src/nfa/include/nfa_ee_api.h
+++ b/src/nfa/include/nfa_ee_api.h
@@ -306,7 +306,10 @@
extern tNFA_STATUS NFA_EeSetDefaultTechRouting(
tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
tNFA_TECHNOLOGY_MASK technologies_switch_off,
- tNFA_TECHNOLOGY_MASK technologies_battery_off);
+ tNFA_TECHNOLOGY_MASK technologies_battery_off,
+ tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+ tNFA_TECHNOLOGY_MASK technologies_screen_off,
+ tNFA_TECHNOLOGY_MASK technologies_screen_off_lock);
/*******************************************************************************
**
@@ -332,7 +335,10 @@
extern tNFA_STATUS NFA_EeSetDefaultProtoRouting(
tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
tNFA_PROTOCOL_MASK protocols_switch_off,
- tNFA_PROTOCOL_MASK protocols_battery_off);
+ tNFA_PROTOCOL_MASK protocols_battery_off,
+ tNFA_PROTOCOL_MASK technologies_screen_lock,
+ tNFA_PROTOCOL_MASK technologies_screen_off,
+ tNFA_PROTOCOL_MASK technologies_screen_off_lock);
/*******************************************************************************
**
diff --git a/src/nfa/include/nfa_ee_int.h b/src/nfa/include/nfa_ee_int.h
index c700027..2cd0507 100644
--- a/src/nfa/include/nfa_ee_int.h
+++ b/src/nfa/include/nfa_ee_int.h
@@ -149,12 +149,24 @@
tech_switch_off; /* default routing - technologies switch_off */
tNFA_TECHNOLOGY_MASK
tech_battery_off; /* default routing - technologies battery_off*/
+ tNFA_TECHNOLOGY_MASK
+ tech_screen_lock; /* default routing - technologies screen_lock*/
+ tNFA_TECHNOLOGY_MASK
+ tech_screen_off; /* default routing - technologies screen_off*/
+ tNFA_TECHNOLOGY_MASK
+ tech_screen_off_lock; /* default routing - technologies screen_off_lock*/
tNFA_PROTOCOL_MASK
proto_switch_on; /* default routing - protocols switch_on */
tNFA_PROTOCOL_MASK
proto_switch_off; /* default routing - protocols switch_off */
tNFA_PROTOCOL_MASK
proto_battery_off; /* default routing - protocols battery_off */
+ tNFA_PROTOCOL_MASK
+ proto_screen_lock; /* default routing - protocols screen_lock */
+ tNFA_PROTOCOL_MASK
+ proto_screen_off; /* default routing - protocols screen_off */
+ tNFA_PROTOCOL_MASK
+ proto_screen_off_lock; /* default routing - protocols screen_off_lock */
tNFA_EE_CONN_ST conn_st; /* connection status */
uint8_t conn_id; /* connection id */
tNFA_EE_CBACK* p_ee_cback; /* the callback function */
@@ -235,6 +247,9 @@
tNFA_TECHNOLOGY_MASK technologies_switch_on;
tNFA_TECHNOLOGY_MASK technologies_switch_off;
tNFA_TECHNOLOGY_MASK technologies_battery_off;
+ tNFA_TECHNOLOGY_MASK technologies_screen_lock;
+ tNFA_TECHNOLOGY_MASK technologies_screen_off;
+ tNFA_TECHNOLOGY_MASK technologies_screen_off_lock;
} tNFA_EE_API_SET_TECH_CFG;
/* data type for NFA_EE_API_SET_PROTO_CFG_EVT */
@@ -245,6 +260,9 @@
tNFA_PROTOCOL_MASK protocols_switch_on;
tNFA_PROTOCOL_MASK protocols_switch_off;
tNFA_PROTOCOL_MASK protocols_battery_off;
+ tNFA_PROTOCOL_MASK protocols_screen_lock;
+ tNFA_PROTOCOL_MASK protocols_screen_off;
+ tNFA_PROTOCOL_MASK protocols_screen_off_lock;
} tNFA_EE_API_SET_PROTO_CFG;
/* data type for NFA_EE_API_ADD_AID_EVT */