summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Lassey <lassey@google.com>2023-12-01 21:48:36 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-12-01 21:48:36 +0000
commit51e25307ce480f7c6f7af46bfe0b363627cb7830 (patch)
tree541885317142be029bf8003443b03c440e23dee3
parenta6e97aa3186004ba8caefc302dd52e7b7c9dbaa5 (diff)
parentbe33ab51d414823f8e45743176d8202f6f536e53 (diff)
downloadnfc-51e25307ce480f7c6f7af46bfe0b363627cb7830.tar.gz
Implement receiving and responding to observe mode NCI command am: 79ffc142ff am: fb8956c2ca am: be33ab51d4
Original change: https://android-review.googlesource.com/c/platform/system/nfc/+/2853409 Change-Id: I18796bf5a1dcaa57d86146713f25814f8d281e66 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--tools/casimir/src/controller.rs41
-rw-r--r--tools/casimir/src/nci_packets.pdl34
2 files changed, 71 insertions, 4 deletions
diff --git a/tools/casimir/src/controller.rs b/tools/casimir/src/controller.rs
index 03d47d83..53efb3fb 100644
--- a/tools/casimir/src/controller.rs
+++ b/tools/casimir/src/controller.rs
@@ -85,6 +85,14 @@ pub enum RfMode {
Listen,
}
+// Whether Observe Mode is Enabled or Disabled.
+#[derive(Clone, Copy, Debug)]
+#[allow(missing_docs)]
+pub enum ObserveModeState {
+ Enable,
+ Disable,
+}
+
/// Poll responses received in the context of RF discovery in active
/// Listen mode.
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -104,6 +112,7 @@ pub struct State {
pub discover_map: Vec<nci::MappingConfiguration>,
pub rf_state: RfState,
pub rf_poll_responses: Vec<RfPollResponse>,
+ pub observe_mode: ObserveModeState,
}
/// State of an NFCC instance.
@@ -180,6 +189,7 @@ impl Controller {
discover_configuration: vec![],
rf_state: RfState::Idle,
rf_poll_responses: vec![],
+ observe_mode: ObserveModeState::Disable,
}),
}
}
@@ -696,10 +706,23 @@ impl Controller {
Ok(())
}
+ async fn android_observe_mode(&self, cmd: nci::AndroidObserveModeCmd) -> Result<()> {
+ let mut state = self.state.lock().await;
+ state.observe_mode = match cmd.get_observe_mode_enable() {
+ nci::ObserveModeEnable::Enable => ObserveModeState::Enable,
+ nci::ObserveModeEnable::Disable => ObserveModeState::Disable,
+ };
+ println!("+ observe_mode: {:?}", state.observe_mode);
+ self.send_control(nci::AndroidObserveModeRspBuilder { status: nci::Status::Ok }).await?;
+ Ok(())
+ }
+
async fn receive_command(&self, packet: nci::ControlPacket) -> Result<()> {
+ use nci::AndroidPacketChild::*;
use nci::ControlPacketChild::*;
use nci::CorePacketChild::*;
use nci::NfceePacketChild::*;
+ use nci::ProprietaryPacketChild::*;
use nci::RfPacketChild::*;
match packet.specialize() {
@@ -726,6 +749,15 @@ impl Controller {
NfceeDiscoverCommand(cmd) => self.nfcee_discover(cmd).await,
_ => unimplemented!("unsupported nfcee oid {:?}", packet.get_oid()),
},
+ ProprietaryPacket(packet) => match packet.specialize() {
+ AndroidPacket(packet) => match packet.specialize() {
+ AndroidObserveModeCmd(cmd) => self.android_observe_mode(cmd).await,
+ _ => {
+ unimplemented!("unsupported android oid {:?}", packet.get_android_sub_oid())
+ }
+ },
+ _ => unimplemented!("unsupported proprietary oid {:?}", packet.get_oid()),
+ },
_ => unimplemented!("unsupported gid {:?}", packet.get_gid()),
}
}
@@ -820,8 +852,9 @@ impl Controller {
| (nci::RfTechnologyAndMode::NfcFPassiveListenMode, rf::Technology::NfcF)
)
}) {
- match technology {
- rf::Technology::NfcA => {
+ match (state.observe_mode, technology) {
+ (ObserveModeState::Enable, _) => (),
+ (ObserveModeState::Disable, rf::Technology::NfcA) => {
// Configured for T4AT tag emulation.
let int_protocol = 0x01;
self.send_rf(rf::NfcAPollResponseBuilder {
@@ -833,8 +866,8 @@ impl Controller {
})
.await?
}
- rf::Technology::NfcB => todo!(),
- rf::Technology::NfcF => todo!(),
+ (ObserveModeState::Disable, rf::Technology::NfcB) => todo!(),
+ (ObserveModeState::Disable, rf::Technology::NfcF) => todo!(),
_ => (),
}
}
diff --git a/tools/casimir/src/nci_packets.pdl b/tools/casimir/src/nci_packets.pdl
index e8615a36..f6442d82 100644
--- a/tools/casimir/src/nci_packets.pdl
+++ b/tools/casimir/src/nci_packets.pdl
@@ -21,6 +21,7 @@ enum GroupId : 4 {
NFCEE_MANAGEMENT = 0x2,
NFCC_MANAGEMENT = 0x3,
TEST_MANAGEMENT = 0x4,
+ PROPRIETARY = 0xF,
}
enum CoreOpcodeId : 6 {
@@ -67,6 +68,14 @@ enum NfceeOpcodeId : 6 {
RFU = 0x4..0x3f,
}
+enum ProprietaryOpcodeId : 6 {
+ ANDROID = 0xC,
+}
+
+enum AndroidSubOpcodeId : 8 {
+ OBSERVE_MODE = 0x2,
+}
+
enum Status : 8 {
OK = 0x00,
REJECTED = 0x01,
@@ -718,3 +727,28 @@ packet NfceeDiscoverResponse : NfceePacket (mt = RESPONSE, oid = DISCOVER) {
status : Status,
number_of_nfcees : 8,
}
+
+packet ProprietaryPacket : ControlPacket (gid = PROPRIETARY) {
+ oid : ProprietaryOpcodeId,
+ _reserved_ : 2,
+ _reserved_ : 8,
+ _payload_,
+}
+
+packet AndroidPacket : ProprietaryPacket (oid = ANDROID) {
+ android_sub_oid: AndroidSubOpcodeId,
+ _payload_,
+}
+
+enum ObserveModeEnable : 8 {
+ DISABLE = 0x0,
+ ENABLE = 0x1,
+}
+
+packet AndroidObserveModeCmd : AndroidPacket(mt = COMMAND, android_sub_oid = OBSERVE_MODE) {
+ observe_mode_enable: ObserveModeEnable,
+}
+
+packet AndroidObserveModeRsp : AndroidPacket(mt = RESPONSE, android_sub_oid = OBSERVE_MODE) {
+ status: Status,
+}