From 0f6eeff486642e26750fa364a488d25d63acd93b Mon Sep 17 00:00:00 2001 From: Mirna Date: Mon, 12 Oct 2020 11:08:33 +0200 Subject: [PATCH] Add NFC driver to third_party/libtock-drivers/ --- third_party/libtock-drivers/src/lib.rs | 1 + third_party/libtock-drivers/src/nfc.rs | 66 ++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 third_party/libtock-drivers/src/nfc.rs diff --git a/third_party/libtock-drivers/src/lib.rs b/third_party/libtock-drivers/src/lib.rs index bf62d05..e498a37 100644 --- a/third_party/libtock-drivers/src/lib.rs +++ b/third_party/libtock-drivers/src/lib.rs @@ -8,3 +8,4 @@ pub mod rng; pub mod timer; pub mod usb_ctap_hid; pub mod util; +pub mod nfc; diff --git a/third_party/libtock-drivers/src/nfc.rs b/third_party/libtock-drivers/src/nfc.rs new file mode 100644 index 0000000..ee2dda3 --- /dev/null +++ b/third_party/libtock-drivers/src/nfc.rs @@ -0,0 +1,66 @@ +use crate::util; +use core::cell::Cell; +use libtock_core::{callback, syscalls}; + +const DRIVER_NUMBER: usize = 0x30003; + +mod command_nr { + pub const TRANSMIT: usize = 1; + pub const RECEIVE: usize = 2; + pub const EMULATE: usize = 3; + pub const CONFIGURE: usize = 4; +} + +mod subscribe_nr { + pub const TRANSMIT: usize = 1; + pub const RECEIVE: usize = 2; + pub const SELECT: usize = 3; +} + +mod allow_nr { + pub const TRANSMIT: usize = 1; + pub const RECEIVE: usize = 2; +} + +pub const TX_BUFFER_SIZE: usize = 256; +pub const RX_BUFFER_SIZE: usize = 256; + +pub struct NfcTag { + tx_buffer: [u8; BUFFER_SIZE], + rx_buffer: [u8; BUFFER_SIZE], + tag_type: u8, +} + +impl NfcTag { + pub fn new() -> Console { + Console { + tx_buffer: [0; TX_BUFFER_SIZE], + tx_buffer: [0; RX_BUFFER_SIZE], + tag_type: 0, + } + } + + pub fn set_tag_type(&mut self, type: u8) { + self.tag_type = type; + } + + pub fn selected(&self) -> bool { + let is_selected = Cell::new(false); + let mut is_selected_alarm = || is_selected.set(true); + let subscription = syscalls::subscribe::( + DRIVER_NUMBER, + subscribe_nr::SELECT, + &mut is_selected_alarm, + ); + if subscription.is_err() { + return; + } + + util::yieldk_for(|| is_selected.get()); + true + } + + pub fn receive(&self) { + + } +}