M5Unit-NFC 0.1.1 git rev:9bb1360
Loading...
Searching...
No Matches
nfc_layer_v.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
16#ifndef M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_V_HPP
17#define M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_V_HPP
18
20#include "nfc/v/nfcv.hpp"
22#include <vector>
23#include <memory>
24
25namespace m5 {
26namespace unit {
27class UnitST25R3916;
28class CapST25R3916;
29} // namespace unit
30namespace nfc {
31
37public:
38 struct Adapter;
49 virtual ~NFCLayerV();
50
55 virtual uint16_t maximum_fifo_depth() const override;
56
62 inline bool isActive(const m5::nfc::v::PICC& picc) const
63 {
64 return _activePICC.valid() && _activePICC == picc;
65 }
72 {
73 return _activePICC;
74 }
75
81 {
82 return _modulation;
83 }
89 {
90 _modulation = mode;
91 }
92
95
102 bool detect(m5::nfc::v::PICC& picc, const uint32_t timeout_ms = 50U);
110 bool detect(std::vector<m5::nfc::v::PICC>& piccs, const uint32_t timeout_ms = 1000U);
111
119 bool activate(const m5::nfc::v::PICC& picc);
120
126 bool reactivate(const m5::nfc::v::PICC& picc);
131 inline bool reactivate()
132 {
133 return reactivate(_activePICC);
134 }
136
139
145 bool deactivate();
154 bool readBlock(uint8_t rx[32], const uint16_t block);
164 bool writeBlock(const uint16_t block, const uint8_t* tx, const uint8_t tx_len);
173 virtual bool read(uint8_t* rx, uint16_t& rx_len, const uint16_t sblock) override;
183 virtual bool write(const uint16_t sblock, const uint8_t* tx, const uint16_t tx_len) override;
184
189 bool dump();
195 bool dump(const uint16_t block);
197
201
206 bool ndefIsValidFormat(bool& valid);
226 bool ndefRead(m5::nfc::ndef::TLV& msg);
235 bool ndefWrite(const m5::nfc::ndef::TLV& msg);
237
238protected:
239 bool dump_all();
240 bool dump_block(const uint16_t block);
241
242 bool detect_single(m5::nfc::v::PICC& picc);
243 bool get_system_information(m5::nfc::v::PICC& picc);
244 bool get_system_information_ext(m5::nfc::v::PICC& picc);
245 void probe_memory_layout(m5::nfc::v::PICC& picc);
246 bool probe_read_block(const m5::nfc::v::PICC& picc, const uint16_t block, uint8_t* rx, uint16_t& rx_len);
247 bool read_block_ext(uint8_t rx[32], const m5::nfc::v::PICC& picc, const uint16_t block);
248 bool write_block_ext(const m5::nfc::v::PICC& picc, const uint16_t block, const uint8_t* tx, const uint8_t tx_len);
249 bool reset_to_ready(const m5::nfc::v::PICC* picc);
250 bool stay_quiet(const m5::nfc::v::PICC& picc);
251
252 virtual uint16_t first_user_block() const override
253 {
254 return _activePICC.firstUserBlock();
255 }
256 virtual uint16_t last_user_block() const override
257 {
258 return _activePICC.lastUserBlock();
259 }
260 inline virtual uint16_t user_area_size() const override
261 {
262 return _activePICC.userAreaSize();
263 }
264 inline virtual uint16_t unit_size_read() const override
265 {
266 return _activePICC.block_size;
267 }
268 inline virtual uint16_t unit_size_write() const override
269 {
270 return _activePICC.block_size;
271 }
272
273protected:
274 m5::nfc::v::PICC _activePICC{};
275
276private:
277 std::unique_ptr<Adapter> _impl;
279 m5::nfc::v::ModulationMode _modulation{m5::nfc::v::ModulationMode::OneOf4};
280};
281
283// Impl for units
284struct NFCLayerV::Adapter {
285 virtual ~Adapter() = default;
286 virtual uint16_t max_fifo_depth() const = 0;
287
288 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
289 const uint32_t timeout_ms, const m5::nfc::v::ModulationMode mode) = 0;
290 virtual bool transmit(const uint8_t* tx, const uint16_t tx_len, const uint32_t timeout_ms,
291 const m5::nfc::v::ModulationMode mode) = 0;
292 virtual bool receive(uint8_t* rx, uint16_t& rx_len, const uint32_t timeout_ms) = 0;
293};
295
296} // namespace nfc
297} // namespace m5
298#endif
Common interface for NFC layer.
Definition nfc_layer.hpp:26
Common interface layer for each chip of the NFC-V reader.
Definition nfc_layer_v.hpp:36
virtual uint16_t last_user_block() const override
Last user block.
Definition nfc_layer_v.hpp:256
bool ndefWrite(const m5::nfc::ndef::TLV &msg)
Write NDEF message.
Definition nfc_layer_v.cpp:465
bool detect(m5::nfc::v::PICC &picc, const uint32_t timeout_ms=50U)
Detect single ready PICC.
Definition nfc_layer_v.cpp:88
bool ndefIsValidFormat(bool &valid)
Is the PICC data in NDEF format?
Definition nfc_layer_v.cpp:438
virtual uint16_t user_area_size() const override
User area size (bytes)
Definition nfc_layer_v.hpp:260
virtual uint16_t unit_size_write() const override
Unit size for write.
Definition nfc_layer_v.hpp:268
virtual bool read(uint8_t *rx, uint16_t &rx_len, const uint16_t sblock) override
Read any bytes from user area.
Definition nfc_layer_v.cpp:315
bool ndefReadCapabilityContainer(m5::nfc::ndef::type5::CapabilityContainer &cc)
Read Type5 Capability Container.
Definition nfc_layer_v.cpp:443
bool deactivate()
Send Reset to ready to the currently selected PICC (deactivate)
Definition nfc_layer_v.cpp:207
bool ndefRead(m5::nfc::ndef::TLV &msg)
Read NDEF Message TLV.
Definition nfc_layer_v.cpp:453
virtual uint16_t first_user_block() const override
First user block.
Definition nfc_layer_v.hpp:252
bool writeBlock(const uint16_t block, const uint8_t *tx, const uint8_t tx_len)
Write single block.
Definition nfc_layer_v.cpp:354
bool dump()
Dump all blocks.
Definition nfc_layer_v.cpp:752
bool readBlock(uint8_t rx[32], const uint16_t block)
Read single block.
Definition nfc_layer_v.cpp:217
bool activate(const m5::nfc::v::PICC &picc)
Activate a specific PICC.
Definition nfc_layer_v.cpp:175
bool ndefWriteCapabilityContainer(const m5::nfc::ndef::type5::CapabilityContainer &cc)
Write Type5 Capability Container.
Definition nfc_layer_v.cpp:448
virtual bool write(const uint16_t sblock, const uint8_t *tx, const uint16_t tx_len) override
Write any bytes to user area.
Definition nfc_layer_v.cpp:403
void setModulationMode(const m5::nfc::v::ModulationMode mode)
Set current modulation mode.
Definition nfc_layer_v.hpp:88
virtual uint16_t maximum_fifo_depth() const override
Maximum FIFO depth in bytes.
Definition nfc_layer_v.cpp:83
virtual uint16_t unit_size_read() const override
Unit size for read.
Definition nfc_layer_v.hpp:264
bool reactivate()
Reactivate the currently activated PICC.
Definition nfc_layer_v.hpp:131
const m5::nfc::v::PICC & activatedPICC() const
Retrieve the currently activated PICC.
Definition nfc_layer_v.hpp:71
m5::nfc::v::ModulationMode modulationMode() const
Get current modulation mode.
Definition nfc_layer_v.hpp:80
bool isActive(const m5::nfc::v::PICC &picc) const
Is the specified PICC currently active?
Definition nfc_layer_v.hpp:62
NDEF operations layer.
Definition ndef_layer.hpp:35
NDEF TLV container.
Definition ndef_tlv.hpp:27
ST25R3916 unit in CapCC1101 (SPI)
Definition unit_ST25R3916.hpp:2150
ST25R3916 Unit.
Definition unit_ST25R3916.hpp:39
Top level namespace of M5Stack.
NFC related definitions.
Unit-related namespace.
Common layer for NDEF related.
Common layer for NFC related units.
NFC-V definitions.
ModulationMode
Definition nfcv.hpp:73
Capability container for Type5.
Definition ndef.hpp:500
PICC for NFC-V.
Definition nfcv.hpp:92
uint16_t userAreaSize() const
Total user area size.
Definition nfcv.hpp:156
uint16_t lastUserBlock() const
Gets the last user block.
Definition nfcv.hpp:181
bool valid() const
Valid?
Definition nfcv.hpp:115
uint16_t firstUserBlock() const
Gets the first user block.
Definition nfcv.hpp:173
uint8_t block_size
Byte size of 1 block.
Definition nfcv.hpp:98