diff options
author | Brad Lassey <lassey@google.com> | 2023-12-01 21:48:36 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-12-01 21:48:36 +0000 |
commit | 51e25307ce480f7c6f7af46bfe0b363627cb7830 (patch) | |
tree | 541885317142be029bf8003443b03c440e23dee3 | |
parent | a6e97aa3186004ba8caefc302dd52e7b7c9dbaa5 (diff) | |
parent | be33ab51d414823f8e45743176d8202f6f536e53 (diff) | |
download | nfc-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.rs | 41 | ||||
-rw-r--r-- | tools/casimir/src/nci_packets.pdl | 34 |
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, +} |