diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml
index 6baf2b5..9bd757b 100644
--- a/.idea/dictionaries/project.xml
+++ b/.idea/dictionaries/project.xml
@@ -5,6 +5,7 @@
felica
gpst
trng
+ wcnt
\ No newline at end of file
diff --git a/pn532/src/commands.rs b/pn532/src/commands.rs
deleted file mode 100644
index 8a0670e..0000000
--- a/pn532/src/commands.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-//! Command and protocol constants for the PN532.
-
-// PN532 commands.
-pub const PN532_COMMAND_DIAGNOSE: u8 = 0x00;
-pub const PN532_COMMAND_GETFIRMWAREVERSION: u8 = 0x02;
-pub const PN532_COMMAND_GETGENERALSTATUS: u8 = 0x04;
-pub const PN532_COMMAND_READREGISTER: u8 = 0x06;
-pub const PN532_COMMAND_WRITEREGISTER: u8 = 0x08;
-pub const PN532_COMMAND_READGPIO: u8 = 0x0C;
-pub const PN532_COMMAND_WRITEGPIO: u8 = 0x0E;
-pub const PN532_COMMAND_SETSERIALBAUDRATE: u8 = 0x10;
-pub const PN532_COMMAND_SETPARAMETERS: u8 = 0x12;
-pub const PN532_COMMAND_SAMCONFIGURATION: u8 = 0x14;
-pub const PN532_COMMAND_POWERDOWN: u8 = 0x16;
-pub const PN532_COMMAND_RFCONFIGURATION: u8 = 0x32;
-pub const PN532_COMMAND_RFREGULATIONTEST: u8 = 0x58;
-pub const PN532_COMMAND_INJUMPFORDEP: u8 = 0x56;
-pub const PN532_COMMAND_INJUMPFORPSL: u8 = 0x46;
-pub const PN532_COMMAND_INLISTPASSIVETARGET: u8 = 0x4A;
-pub const PN532_COMMAND_INATR: u8 = 0x50;
-pub const PN532_COMMAND_INPSL: u8 = 0x4E;
-pub const PN532_COMMAND_INDATAEXCHANGE: u8 = 0x40;
-pub const PN532_COMMAND_INCOMMUNICATETHRU: u8 = 0x42;
-pub const PN532_COMMAND_INDESELECT: u8 = 0x44;
-pub const PN532_COMMAND_INRELEASE: u8 = 0x52;
-pub const PN532_COMMAND_INSELECT: u8 = 0x54;
-pub const PN532_COMMAND_INAUTOPOLL: u8 = 0x60;
-pub const PN532_COMMAND_TGINITASTARGET: u8 = 0x8C;
-pub const PN532_COMMAND_TGSETGENERALBYTES: u8 = 0x92;
-pub const PN532_COMMAND_TGGETDATA: u8 = 0x86;
-pub const PN532_COMMAND_TGSETDATA: u8 = 0x8E;
-pub const PN532_COMMAND_TGSETMETADATA: u8 = 0x94;
-pub const PN532_COMMAND_TGGETINITIATORCOMMAND: u8 = 0x88;
-pub const PN532_COMMAND_TGRESPONSETOINITIATOR: u8 = 0x90;
-pub const PN532_COMMAND_TGGETTARGETSTATUS: u8 = 0x8A;
-
-pub const PN532_RESPONSE_INDATAEXCHANGE: u8 = 0x41;
-pub const PN532_RESPONSE_INLISTPASSIVETARGET: u8 = 0x4B;
-
-pub const PN532_MIFARE_ISO14443A: u8 = 0x00;
-
-// Mifare commands.
-pub const MIFARE_CMD_AUTH_A: u8 = 0x60;
-pub const MIFARE_CMD_AUTH_B: u8 = 0x61;
-pub const MIFARE_CMD_READ: u8 = 0x30;
-pub const MIFARE_CMD_WRITE: u8 = 0xA0;
-pub const MIFARE_CMD_WRITE_ULTRALIGHT: u8 = 0xA2;
-pub const MIFARE_CMD_TRANSFER: u8 = 0xB0;
-pub const MIFARE_CMD_DECREMENT: u8 = 0xC0;
-pub const MIFARE_CMD_INCREMENT: u8 = 0xC1;
-pub const MIFARE_CMD_STORE: u8 = 0xC2;
-
-// FeliCa commands.
-pub const FELICA_CMD_POLLING: u8 = 0x00;
-pub const FELICA_CMD_REQUEST_SERVICE: u8 = 0x02;
-pub const FELICA_CMD_REQUEST_RESPONSE: u8 = 0x04;
-pub const FELICA_CMD_READ_WITHOUT_ENCRYPTION: u8 = 0x06;
-pub const FELICA_CMD_WRITE_WITHOUT_ENCRYPTION: u8 = 0x08;
-pub const FELICA_CMD_REQUEST_SYSTEM_CODE: u8 = 0x0C;
-
-/// NDEF URI record identifier codes (see NFC Forum "URI Record Type Definition").
-pub mod ndef {
- pub const NONE: u8 = 0x00;
- pub const HTTP_WWWDOT: u8 = 0x01;
- pub const HTTPS_WWWDOT: u8 = 0x02;
- pub const HTTP: u8 = 0x03;
- pub const HTTPS: u8 = 0x04;
- pub const TEL: u8 = 0x05;
- pub const MAILTO: u8 = 0x06;
- pub const FTP_ANONAT: u8 = 0x07;
- pub const FTP_FTPDOT: u8 = 0x08;
- pub const FTPS: u8 = 0x09;
- pub const SFTP: u8 = 0x0A;
- pub const SMB: u8 = 0x0B;
- pub const NFS: u8 = 0x0C;
- pub const FTP: u8 = 0x0D;
- pub const DAV: u8 = 0x0E;
- pub const NEWS: u8 = 0x0F;
- pub const TELNET: u8 = 0x10;
- pub const IMAP: u8 = 0x11;
- pub const RTSP: u8 = 0x12;
- pub const URN: u8 = 0x13;
- pub const POP: u8 = 0x14;
- pub const SIP: u8 = 0x15;
- pub const SIPS: u8 = 0x16;
- pub const TFTP: u8 = 0x17;
- pub const BTSPP: u8 = 0x18;
- pub const BTL2CAP: u8 = 0x19;
- pub const BTGOEP: u8 = 0x1A;
- pub const TCPOBEX: u8 = 0x1B;
- pub const IRDAOBEX: u8 = 0x1C;
- pub const FILE: u8 = 0x1D;
- pub const URN_EPC_ID: u8 = 0x1E;
- pub const URN_EPC_TAG: u8 = 0x1F;
- pub const URN_EPC_PAT: u8 = 0x20;
- pub const URN_EPC_RAW: u8 = 0x21;
- pub const URN_EPC: u8 = 0x22;
- pub const URN_NFC: u8 = 0x23;
-}
-
-// GPIO.
-pub const PN532_GPIO_VALIDATIONBIT: u8 = 0x80;
-pub const PN532_GPIO_P30: u8 = 0;
-pub const PN532_GPIO_P31: u8 = 1;
-pub const PN532_GPIO_P32: u8 = 2;
-pub const PN532_GPIO_P33: u8 = 3;
-pub const PN532_GPIO_P34: u8 = 4;
-pub const PN532_GPIO_P35: u8 = 5;
-
-pub const FELICA_READ_MAX_SERVICE_NUM: usize = 3;
-pub const FELICA_READ_MAX_BLOCK_NUM: usize = 3;
-
-pub const FELICA_WRITE_MAX_SERVICE_NUM: usize = 3;
-pub const FELICA_WRITE_MAX_BLOCK_NUM: usize = 3;
-
-pub const FELICA_REQ_SERVICE_MAX_NODE_NUM: usize = 32;
-
-// Frame protocol constants.
-pub const PN532_PREAMBLE: u8 = 0x00;
-pub const PN532_STARTCODE1: u8 = 0x00;
-pub const PN532_STARTCODE2: u8 = 0xFF;
-pub const PN532_POSTAMBLE: u8 = 0x00;
-
-pub const PN532_HOST_TO_PN532: u8 = 0xD4;
-pub const PN532_PN532_TO_HOST: u8 = 0xD5;
-
-pub const PN532_ACK_WAIT_TIME_MS: u16 = 10;
-
-/// The fixed 7-bit I2C address of the PN532 (0x48 >> 1).
-pub const PN532_I2C_ADDRESS: u8 = 0x48 >> 1;
-
-/// Passive target baud rates supported by [`crate::Pn532::read_passive_target_id`].
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-#[repr(u8)]
-pub enum BaudRate {
- ISO14443A106kbps = 0x00,
- Felica212kbps = 0x01,
- Felica424kbps = 0x02,
- ISO14443B106kbps = 0x03,
- InnovisionJewel106kbps = 0x04,
-}
-
-impl From for u8 {
- fn from(value: BaudRate) -> Self {
- value as u8
- }
-}
diff --git a/pn532/src/commands/mifare.rs b/pn532/src/commands/mifare.rs
new file mode 100644
index 0000000..06600b4
--- /dev/null
+++ b/pn532/src/commands/mifare.rs
@@ -0,0 +1,10 @@
+// Mifare commands.
+pub const MIFARE_CMD_AUTH_A: u8 = 0x60;
+pub const MIFARE_CMD_AUTH_B: u8 = 0x61;
+pub const MIFARE_CMD_READ: u8 = 0x30;
+pub const MIFARE_CMD_WRITE: u8 = 0xA0;
+pub const MIFARE_CMD_WRITE_ULTRALIGHT: u8 = 0xA2;
+pub const MIFARE_CMD_TRANSFER: u8 = 0xB0;
+pub const MIFARE_CMD_DECREMENT: u8 = 0xC0;
+pub const MIFARE_CMD_INCREMENT: u8 = 0xC1;
+pub const MIFARE_CMD_STORE: u8 = 0xC2;
\ No newline at end of file
diff --git a/pn532/src/commands/mod.rs b/pn532/src/commands/mod.rs
new file mode 100644
index 0000000..cabc43a
--- /dev/null
+++ b/pn532/src/commands/mod.rs
@@ -0,0 +1,51 @@
+//! Command and protocol constants for the PN532.
+
+pub mod ndef;
+#[cfg(feature = "mifare-classic")]
+pub mod mifare;
+pub mod pn532;
+
+// PN532 commands.
+
+pub const PN532_RESPONSE_INDATAEXCHANGE: u8 = 0x41;
+pub const PN532_RESPONSE_INLISTPASSIVETARGET: u8 = 0x4B;
+pub const PN532_MIFARE_ISO14443A: u8 = 0x00;
+
+// FeliCa commands.
+pub const FELICA_CMD_POLLING: u8 = 0x00;
+pub const FELICA_CMD_REQUEST_SERVICE: u8 = 0x02;
+pub const FELICA_CMD_REQUEST_RESPONSE: u8 = 0x04;
+pub const FELICA_CMD_READ_WITHOUT_ENCRYPTION: u8 = 0x06;
+pub const FELICA_CMD_WRITE_WITHOUT_ENCRYPTION: u8 = 0x08;
+pub const FELICA_CMD_REQUEST_SYSTEM_CODE: u8 = 0x0C;
+
+// GPIO.
+pub const PN532_GPIO_VALIDATIONBIT: u8 = 0x80;
+pub const PN532_GPIO_P30: u8 = 0;
+pub const PN532_GPIO_P31: u8 = 1;
+pub const PN532_GPIO_P32: u8 = 2;
+pub const PN532_GPIO_P33: u8 = 3;
+pub const PN532_GPIO_P34: u8 = 4;
+pub const PN532_GPIO_P35: u8 = 5;
+
+pub const FELICA_READ_MAX_SERVICE_NUM: usize = 3;
+pub const FELICA_READ_MAX_BLOCK_NUM: usize = 3;
+
+pub const FELICA_WRITE_MAX_SERVICE_NUM: usize = 3;
+pub const FELICA_WRITE_MAX_BLOCK_NUM: usize = 3;
+
+pub const FELICA_REQ_SERVICE_MAX_NODE_NUM: usize = 32;
+
+// Frame protocol constants.
+pub const PN532_PREAMBLE: u8 = 0x00;
+pub const PN532_STARTCODE1: u8 = 0x00;
+pub const PN532_STARTCODE2: u8 = 0xFF;
+pub const PN532_POSTAMBLE: u8 = 0x00;
+
+pub const PN532_HOST_TO_PN532: u8 = 0xD4;
+pub const PN532_PN532_TO_HOST: u8 = 0xD5;
+
+pub const PN532_ACK_WAIT_TIME_MS: u16 = 10;
+
+/// The fixed 7-bit I2C address of the PN532 (0x48 >> 1).
+pub const PN532_I2C_ADDRESS: u8 = 0x48 >> 1;
diff --git a/pn532/src/commands/ndef.rs b/pn532/src/commands/ndef.rs
new file mode 100644
index 0000000..727c471
--- /dev/null
+++ b/pn532/src/commands/ndef.rs
@@ -0,0 +1,38 @@
+///! NDEF URI record identifier codes (see NFC Forum "URI Record Type Definition").
+
+pub const NONE: u8 = 0x00;
+pub const HTTP_WWWDOT: u8 = 0x01;
+pub const HTTPS_WWWDOT: u8 = 0x02;
+pub const HTTP: u8 = 0x03;
+pub const HTTPS: u8 = 0x04;
+pub const TEL: u8 = 0x05;
+pub const MAILTO: u8 = 0x06;
+pub const FTP_ANONAT: u8 = 0x07;
+pub const FTP_FTPDOT: u8 = 0x08;
+pub const FTPS: u8 = 0x09;
+pub const SFTP: u8 = 0x0A;
+pub const SMB: u8 = 0x0B;
+pub const NFS: u8 = 0x0C;
+pub const FTP: u8 = 0x0D;
+pub const DAV: u8 = 0x0E;
+pub const NEWS: u8 = 0x0F;
+pub const TELNET: u8 = 0x10;
+pub const IMAP: u8 = 0x11;
+pub const RTSP: u8 = 0x12;
+pub const URN: u8 = 0x13;
+pub const POP: u8 = 0x14;
+pub const SIP: u8 = 0x15;
+pub const SIPS: u8 = 0x16;
+pub const TFTP: u8 = 0x17;
+pub const BTSPP: u8 = 0x18;
+pub const BTL2CAP: u8 = 0x19;
+pub const BTGOEP: u8 = 0x1A;
+pub const TCPOBEX: u8 = 0x1B;
+pub const IRDAOBEX: u8 = 0x1C;
+pub const FILE: u8 = 0x1D;
+pub const URN_EPC_ID: u8 = 0x1E;
+pub const URN_EPC_TAG: u8 = 0x1F;
+pub const URN_EPC_PAT: u8 = 0x20;
+pub const URN_EPC_RAW: u8 = 0x21;
+pub const URN_EPC: u8 = 0x22;
+pub const URN_NFC: u8 = 0x23;
\ No newline at end of file
diff --git a/pn532/src/commands/pn532.rs b/pn532/src/commands/pn532.rs
new file mode 100644
index 0000000..5c5ea94
--- /dev/null
+++ b/pn532/src/commands/pn532.rs
@@ -0,0 +1,32 @@
+pub const DIAGNOSE: u8 = 0x00;
+pub const GETFIRMWAREVERSION: u8 = 0x02;
+pub const GETGENERALSTATUS: u8 = 0x04;
+pub const READREGISTER: u8 = 0x06;
+pub const WRITEREGISTER: u8 = 0x08;
+pub const READGPIO: u8 = 0x0C;
+pub const WRITEGPIO: u8 = 0x0E;
+pub const SETSERIALBAUDRATE: u8 = 0x10;
+pub const SETPARAMETERS: u8 = 0x12;
+pub const SAMCONFIGURATION: u8 = 0x14;
+pub const POWERDOWN: u8 = 0x16;
+pub const RFCONFIGURATION: u8 = 0x32;
+pub const RFREGULATIONTEST: u8 = 0x58;
+pub const INJUMPFORDEP: u8 = 0x56;
+pub const INJUMPFORPSL: u8 = 0x46;
+pub const INLISTPASSIVETARGET: u8 = 0x4A;
+pub const INATR: u8 = 0x50;
+pub const INPSL: u8 = 0x4E;
+pub const INDATAEXCHANGE: u8 = 0x40;
+pub const INCOMMUNICATETHRU: u8 = 0x42;
+pub const INDESELECT: u8 = 0x44;
+pub const INRELEASE: u8 = 0x52;
+pub const INSELECT: u8 = 0x54;
+pub const INAUTOPOLL: u8 = 0x60;
+pub const TGINITASTARGET: u8 = 0x8C;
+pub const TGSETGENERALBYTES: u8 = 0x92;
+pub const TGGETDATA: u8 = 0x86;
+pub const TGSETDATA: u8 = 0x8E;
+pub const TGSETMETADATA: u8 = 0x94;
+pub const TGGETINITIATORCOMMAND: u8 = 0x88;
+pub const TGRESPONSETOINITIATOR: u8 = 0x90;
+pub const TGGETTARGETSTATUS: u8 = 0x8A;
diff --git a/pn532/src/driver.rs b/pn532/src/driver.rs
index ff48a07..dd99bd7 100644
--- a/pn532/src/driver.rs
+++ b/pn532/src/driver.rs
@@ -88,7 +88,7 @@ impl Pn532 {
/// Read the PN532 firmware version and ID.
pub fn get_firmware_version(&mut self) -> Result> {
- self.buffer[0] = PN532_COMMAND_GETFIRMWAREVERSION;
+ self.buffer[0] = pn532::GETFIRMWAREVERSION;
self.send(1)?;
let len = self.read()?;
if len < 4 {
@@ -104,7 +104,7 @@ impl Pn532 {
/// Read a 16-bit PN532 register.
pub fn read_register(&mut self, reg: u16) -> Result> {
- self.buffer[0] = PN532_COMMAND_READREGISTER;
+ self.buffer[0] = pn532::READREGISTER;
self.buffer[1] = (reg >> 8) as u8;
self.buffer[2] = reg as u8;
self.send(3)?;
@@ -117,7 +117,7 @@ impl Pn532 {
/// Write to a 16-bit PN532 register.
pub fn write_register(&mut self, reg: u16, val: u8) -> Result<(), Error> {
- self.buffer[0] = PN532_COMMAND_WRITEREGISTER;
+ self.buffer[0] = pn532::WRITEREGISTER;
self.buffer[1] = (reg >> 8) as u8;
self.buffer[2] = reg as u8;
self.buffer[3] = val;
@@ -129,7 +129,7 @@ impl Pn532 {
/// Set the PN532's GPIO pins (see the PN532 user manual for valid pins).
pub fn write_gpio(&mut self, pinstate: u8) -> Result<(), Error> {
let pinstate = pinstate | (1 << PN532_GPIO_P32) | (1 << PN532_GPIO_P34);
- self.buffer[0] = PN532_COMMAND_WRITEGPIO;
+ self.buffer[0] = pn532::WRITEGPIO;
self.buffer[1] = PN532_GPIO_VALIDATIONBIT | pinstate;
self.buffer[2] = 0x00;
self.send(3)?;
@@ -142,7 +142,7 @@ impl Pn532 {
/// Read the state of the PN532's GPIO pins.
pub fn read_gpio(&mut self) -> Result> {
- self.buffer[0] = PN532_COMMAND_READGPIO;
+ self.buffer[0] = pn532::READGPIO;
self.send(1)?;
self.read()?;
Ok(self.buffer[0])
@@ -150,7 +150,7 @@ impl Pn532 {
/// Configure the SAM (Secure Access Module) in normal mode.
pub fn sam_config(&mut self) -> Result<(), Error> {
- self.buffer[0] = PN532_COMMAND_SAMCONFIGURATION;
+ self.buffer[0] = pn532::SAMCONFIGURATION;
self.buffer[1] = 0x01; // normal mode
self.buffer[2] = 0x14; // timeout 50 ms * 20 = 1 second
self.buffer[3] = 0x01; // use IRQ pin
@@ -164,7 +164,7 @@ impl Pn532 {
&mut self,
max_retries: u8,
) -> Result<(), Error> {
- self.buffer[0] = PN532_COMMAND_RFCONFIGURATION;
+ self.buffer[0] = pn532::RFCONFIGURATION;
self.buffer[1] = 5;
self.buffer[2] = 0xFF;
self.buffer[3] = 0x01;
@@ -180,7 +180,7 @@ impl Pn532 {
auto_rfca: u8,
rf_on_off: u8,
) -> Result<(), Error> {
- self.buffer[0] = PN532_COMMAND_RFCONFIGURATION;
+ self.buffer[0] = pn532::RFCONFIGURATION;
self.buffer[1] = 1;
self.buffer[2] = 0x00 | auto_rfca | rf_on_off;
self.send(3)?;
@@ -201,7 +201,7 @@ impl Pn532 {
/// Release the card.
pub fn release(&mut self) -> Result<(), Error> {
- self.buffer[0] = PN532_COMMAND_INRELEASE;
+ self.buffer[0] = pn532::INRELEASE;
self.buffer[1] = 0x00;
self.send(2)?;
diff --git a/pn532/src/error.rs b/pn532/src/error.rs
index 50f35e9..b497cf6 100644
--- a/pn532/src/error.rs
+++ b/pn532/src/error.rs
@@ -1,6 +1,6 @@
use core::fmt::Debug;
use bitfields::bitflag;
-use crate::felica;
+use crate::protocol::felica;
/// Driver-level error type, generic over the transport (I2C) error.
#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
diff --git a/pn532/src/lib.rs b/pn532/src/lib.rs
index 390fbbb..4e304ac 100644
--- a/pn532/src/lib.rs
+++ b/pn532/src/lib.rs
@@ -47,15 +47,11 @@ extern crate alloc;
pub mod commands;
pub mod error;
-#[cfg(feature = "felica")]
-pub mod felica;
pub mod interface;
pub(crate) mod driver;
pub mod tg;
-#[cfg(feature = "mifare-classic")]
-pub mod mifare;
-#[cfg(feature = "iso14443a")]
-pub mod iso14443a;
+pub mod types;
+pub mod protocol;
pub use commands::*;
pub use driver::*;
@@ -64,7 +60,7 @@ pub use interface::*;
#[cfg(feature = "defmt")]
#[allow(unused_imports)]
-use defmt::{error, warn, info, debug, trace};
+use defmt::{debug, error, info, trace, warn};
#[cfg(not(feature = "defmt"))]
#[macro_export]
diff --git a/pn532/src/felica/error.rs b/pn532/src/protocol/felica/error.rs
similarity index 100%
rename from pn532/src/felica/error.rs
rename to pn532/src/protocol/felica/error.rs
diff --git a/pn532/src/felica/felica_lite_s/mod.rs b/pn532/src/protocol/felica/felica_lite_s/auth.rs
similarity index 69%
rename from pn532/src/felica/felica_lite_s/mod.rs
rename to pn532/src/protocol/felica/felica_lite_s/auth.rs
index 2881444..edd3f83 100644
--- a/pn532/src/felica/felica_lite_s/mod.rs
+++ b/pn532/src/protocol/felica/felica_lite_s/auth.rs
@@ -1,53 +1,13 @@
-pub mod issuance;
-
use des::cipher::{Block, BlockCipherEncrypt, Key, KeyInit};
use des::TdesEde2;
use rand_core::Rng;
use crate::{Interface, Pn532};
-use crate::felica::error::Error;
-use crate::felica::types::{AsBlock, CardSession, FelicaLiteSBlock, FelicaLiteSServiceCode};
-use crate::felica::types::felica_lite_s::auth::{AuthSession, CardKey, MacInput, RandomChallenge, SessionKeys};
+use crate::types::felica::{CardSession, FelicaLiteSBlock, FelicaLiteSServiceCode};
+use crate::types::felica::felica_lite_s::auth::{AuthSession, CardKey, MacInput, RandomChallenge, SessionKeys};
impl Pn532 {
- pub fn try_authenticate(&mut self, rng: &mut impl Rng, card: &CardSession, key: &CardKey)
- -> Result