M5Unit-NFC 0.0.3 git rev:59f5362
Loading...
Searching...
No Matches
nfc_layer_b.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_B_HPP
17#define M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_B_HPP
18
20#include "nfc/b/nfcb.hpp"
21#include "nfc/isoDEP/isoDEP.hpp"
23#include <vector>
24#include <memory>
25
26namespace m5 {
27
28namespace unit {
29class UnitST25R3916;
30class CapST25R3916;
31class UnitWS1850S;
32} // namespace unit
33namespace nfc {
34
40public:
41 struct Adapter;
44 explicit NFCLayerB(m5::unit::UnitWS1850S& u);
45
46 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
47 const uint32_t timeout_ms) override;
48 virtual bool transmit(const uint8_t* tx, const uint16_t tx_len, const uint32_t timeout_ms) override;
49 virtual bool receive(uint8_t* rx, uint16_t& rx_len, const uint32_t timeout_ms) override;
50 virtual m5::nfc::isodep::IsoDEP* isoDEP() override
51 {
52 return &_isoDEP;
53 }
54 virtual uint16_t maximum_fifo_depth() const override;
55
61 inline bool isActive(const m5::nfc::b::PICC& picc) const
62 {
63 return _activePICC.valid() && _activePICC == picc;
64 }
71 {
72 return _activePICC;
73 }
74
77
87 inline bool request(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi = 0x00,
88 const m5::nfc::b::Require slots = m5::nfc::b::Require::Slot1,
89 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B)
90 {
91 return request_wakeup(atqb, atqb_len, afi, slots, false, timeout_ms);
92 }
103 inline bool wakeup(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi = 0x00,
104 const m5::nfc::b::Require slots = m5::nfc::b::Require::Slot1,
105 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B)
106 {
107 return request_wakeup(atqb, atqb_len, afi, slots, true, timeout_ms);
108 }
109
118 bool detect(m5::nfc::b::PICC& picc, const uint8_t afi = 0x00, const uint32_t timeout_ms = 50U,
119 const uint32_t req_timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
129 bool detect(std::vector<m5::nfc::b::PICC>& piccs, const uint8_t afi = 0x00, const uint8_t max_piccs = 4,
130 const uint32_t timeout_ms = 1000U, const uint32_t req_timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
131
134 bool select(m5::nfc::b::PICC& picc, const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_ATTRIB);
135#if 0
136 bool activate(m5::nfc::b::PICC& picc);
137 bool reactivate(const m5::nfc::b::PICC& picc);
138 inline bool reactivate()
139 {
140 return reactivate(_activePICC);
141 }
142#endif
143
145
148 bool hlt(const uint8_t pupi[4], const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_HLTB);
149 bool deselect(const uint8_t pupi[4], const uint8_t cid = 0xFF,
150 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_DESELECT);
151 bool deactivate();
153
154protected:
155 bool request_wakeup(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi, const m5::nfc::b::Require slots,
156 const bool wakeup, const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
157
158 virtual bool read(uint8_t* rx, uint16_t& rx_len, const uint16_t saddr) override
159 {
160 return false;
161 }
162 virtual bool write(const uint16_t saddr, const uint8_t* tx, const uint16_t tx_len) override
163 {
164 return false;
165 }
166 inline virtual uint16_t first_user_block() const override
167 {
168 return 0;
169 }
170 inline virtual uint16_t last_user_block() const override
171 {
172 return 0;
173 }
174 inline virtual uint16_t user_area_size() const
175 {
176 return 0;
177 }
178 inline virtual uint16_t unit_size_read() const override
179 {
180 return 0;
181 }
182 inline virtual uint16_t unit_size_write() const override
183 {
184 return 0;
185 }
186
187protected:
188 m5::nfc::b::PICC _activePICC{};
191
192private:
193 std::unique_ptr<Adapter> _impl;
194};
195
197// Impl for units
198struct NFCLayerB::Adapter {
199 virtual ~Adapter() = default;
200
201 virtual uint16_t max_fifo_depth() const = 0;
202
203 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
204 const uint32_t timeout_ms) = 0;
205 virtual bool transmit(const uint8_t* tx, const uint16_t tx_len, const uint32_t timeout_ms) = 0;
206 virtual bool receive(uint8_t* rx, uint16_t& rx_len, const uint32_t timeout_ms) = 0;
207};
209
210} // namespace nfc
211} // namespace m5
212
213#endif
Common interface layer for each chip of the NFC-B reader.
Definition nfc_layer_b.hpp:39
bool isActive(const m5::nfc::b::PICC &picc) const
Is the specified PICC currently active?
Definition nfc_layer_b.hpp:61
virtual bool transceive(uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms) override
Transceive (RF command)
Definition nfc_layer_b.cpp:70
virtual uint16_t unit_size_read() const override
Unit size for read.
Definition nfc_layer_b.hpp:178
bool wakeup(uint8_t *atqb, uint16_t &atqb_len, const uint8_t afi=0x00, const m5::nfc::b::Require slots=m5::nfc::b::Require::Slot1, const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_REQ_WUP_B)
Send WUPB to wake a PICC from IDLE or HALT.
Definition nfc_layer_b.hpp:103
virtual bool receive(uint8_t *rx, uint16_t &rx_len, const uint32_t timeout_ms) override
Receive only.
Definition nfc_layer_b.cpp:81
virtual uint16_t maximum_fifo_depth() const override
Maximum FIFO depth.
Definition nfc_layer_b.cpp:65
virtual uint16_t last_user_block() const override
Last user block.
Definition nfc_layer_b.hpp:170
virtual bool transmit(const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms) override
Transmit only.
Definition nfc_layer_b.cpp:76
virtual bool read(uint8_t *rx, uint16_t &rx_len, const uint16_t saddr) override
Read NDEF (block)
Definition nfc_layer_b.hpp:158
virtual bool write(const uint16_t saddr, const uint8_t *tx, const uint16_t tx_len) override
Write NDEF (block)
Definition nfc_layer_b.hpp:162
const m5::nfc::b::PICC & activatedPICC() const
Retrieve the currently activated PICC.
Definition nfc_layer_b.hpp:70
virtual uint16_t user_area_size() const
User area size (bytes)
Definition nfc_layer_b.hpp:174
bool select(m5::nfc::b::PICC &picc, const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_ATTRIB)
Send REQB to discover a PICC in IDLE.
Definition nfc_layer_b.cpp:128
bool detect(m5::nfc::b::PICC &picc, const uint8_t afi=0x00, const uint32_t timeout_ms=50U, const uint32_t req_timeout_ms=m5::nfc::b::TIMEOUT_REQ_WUP_B)
Detect single idle PICC.
Definition nfc_layer_b.cpp:86
virtual m5::nfc::isodep::IsoDEP * isoDEP() override
ISO-DEP interface (nullptr if not supported)
Definition nfc_layer_b.hpp:50
bool request(uint8_t *atqb, uint16_t &atqb_len, const uint8_t afi=0x00, const m5::nfc::b::Require slots=m5::nfc::b::Require::Slot1, const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_REQ_WUP_B)
Send REQB to discover a PICC in IDLE.
Definition nfc_layer_b.hpp:87
virtual uint16_t unit_size_write() const override
Unit size for write.
Definition nfc_layer_b.hpp:182
virtual uint16_t first_user_block() const override
First user block.
Definition nfc_layer_b.hpp:166
Common interface for NFC layer.
Definition nfc_layer.hpp:26
ISO Data Exchange Protocol.
Definition isoDEP.hpp:190
NDEF operations layer.
Definition ndef_layer.hpp:35
ST25R3916 unit in CapCC1101 (SPI)
Definition unit_ST25R3916.hpp:2062
ST25R3916 Unit.
Definition unit_ST25R3916.hpp:38
ISO Data Exchange Protocol.
Top level namespace of M5stack.
NFC related definitions.
Unit-related namespace.
Common layer for NDEF related.
Common layer for NFC related units.
NFC-B definitions.
Require
Number of slots required in the request/wakeup.
Definition nfcb.hpp:39
PICC for NFC-B.
Definition nfcb.hpp:99
bool valid() const
Valid?
Definition nfcb.hpp:115