Dario Nieuwenhuis 0740b235ac nrf: Add NFCT driver.
Co-Authored-By: turbocool3r <turbocool3r@gmail.com>
Co-Authored-By: ferris <ferris@devdroplets.com>
2024-11-20 23:29:22 +01:00

80 lines
2.1 KiB
Rust

#![no_std]
#![no_main]
use defmt::*;
use embassy_executor::Spawner;
use embassy_nrf::config::HfclkSource;
use embassy_nrf::nfct::{Config as NfcConfig, NfcId, NfcT};
use embassy_nrf::{bind_interrupts, nfct};
use {defmt_rtt as _, embassy_nrf as _, panic_probe as _};
bind_interrupts!(struct Irqs {
NFCT => nfct::InterruptHandler;
});
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let mut config = embassy_nrf::config::Config::default();
config.hfclk_source = HfclkSource::ExternalXtal;
let p = embassy_nrf::init(config);
dbg!("Setting up...");
let config = NfcConfig {
nfcid1: NfcId::DoubleSize([0x04, 0x68, 0x95, 0x71, 0xFA, 0x5C, 0x64]),
sdd_pat: nfct::SddPat::SDD00100,
plat_conf: 0b0000,
protocol: nfct::SelResProtocol::Type4A,
};
let mut nfc = NfcT::new(p.NFCT, Irqs, &config);
let mut buf = [0u8; 256];
loop {
info!("activating");
nfc.activate().await;
loop {
info!("rxing");
let n = match nfc.receive(&mut buf).await {
Ok(n) => n,
Err(e) => {
error!("rx error {}", e);
break;
}
};
let req = &buf[..n];
info!("received frame {:02x}", req);
let mut deselect = false;
let resp = match req {
[0xe0, ..] => {
info!("Got RATS, tx'ing ATS");
&[0x06, 0x77, 0x77, 0x81, 0x02, 0x80][..]
}
[0xc2] => {
info!("Got deselect!");
deselect = true;
&[0xc2]
}
_ => {
info!("Got unknown command!");
&[0xFF]
}
};
match nfc.transmit(resp).await {
Ok(()) => {}
Err(e) => {
error!("tx error {}", e);
break;
}
}
if deselect {
break;
}
}
}
}