M5Unit-NFC 0.1.0 git rev:93745b5
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;
56 explicit NFCLayerB(m5::unit::UnitWS1850S& u);
57 virtual ~NFCLayerB();
58
68 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
69 const uint32_t timeout_ms) override;
77 virtual bool transmit(const uint8_t* tx, const uint16_t tx_len, const uint32_t timeout_ms) override;
85 virtual bool receive(uint8_t* rx, uint16_t& rx_len, const uint32_t timeout_ms) override;
90 virtual m5::nfc::isodep::IsoDEP* isoDEP() override
91 {
92 return &_isoDEP;
93 }
98 virtual uint16_t maximum_fifo_depth() const override;
99
105 inline bool isActive(const m5::nfc::b::PICC& picc) const
106 {
107 return _activePICC.valid() && _activePICC == picc;
108 }
115 {
116 return _activePICC;
117 }
118
121
132 inline bool request(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi = 0x00,
133 const m5::nfc::b::Require slots = m5::nfc::b::Require::Slot1,
134 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B)
135 {
136 return request_wakeup(atqb, atqb_len, afi, slots, false, timeout_ms);
137 }
149 inline bool wakeup(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi = 0x00,
150 const m5::nfc::b::Require slots = m5::nfc::b::Require::Slot1,
151 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B)
152 {
153 return request_wakeup(atqb, atqb_len, afi, slots, true, timeout_ms);
154 }
155
165 bool detect(m5::nfc::b::PICC& picc, const uint8_t afi = 0x00, const uint32_t timeout_ms = 50U,
166 const uint32_t req_timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
177 bool detect(std::vector<m5::nfc::b::PICC>& piccs, const uint8_t afi = 0x00, const uint8_t max_piccs = 4,
178 const uint32_t timeout_ms = 1000U, const uint32_t req_timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
179
186 bool select(m5::nfc::b::PICC& picc, const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_ATTRIB);
187#if 0
188 bool activate(m5::nfc::b::PICC& picc);
189 bool reactivate(const m5::nfc::b::PICC& picc);
190 inline bool reactivate()
191 {
192 return reactivate(_activePICC);
193 }
194#endif
195
197
200
206 bool hlt(const uint8_t pupi[4], const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_HLTB);
214 bool deselect(const uint8_t pupi[4], const uint8_t cid = 0xFF,
215 const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_DESELECT);
220 bool deactivate();
222
223protected:
224 bool request_wakeup(uint8_t* atqb, uint16_t& atqb_len, const uint8_t afi, const m5::nfc::b::Require slots,
225 const bool wakeup, const uint32_t timeout_ms = m5::nfc::b::TIMEOUT_REQ_WUP_B);
226
227 virtual bool read(uint8_t* rx, uint16_t& rx_len, const uint16_t saddr) override
228 {
229 return false;
230 }
231 virtual bool write(const uint16_t saddr, const uint8_t* tx, const uint16_t tx_len) override
232 {
233 return false;
234 }
235 inline virtual uint16_t first_user_block() const override
236 {
237 return 0;
238 }
239 inline virtual uint16_t last_user_block() const override
240 {
241 return 0;
242 }
243 inline virtual uint16_t user_area_size() const override
244 {
245 return 0;
246 }
247 inline virtual uint16_t unit_size_read() const override
248 {
249 return 0;
250 }
251 inline virtual uint16_t unit_size_write() const override
252 {
253 return 0;
254 }
255
256protected:
257 m5::nfc::b::PICC _activePICC{};
260
261private:
262 std::unique_ptr<Adapter> _impl;
263};
264
266// Impl for units
267struct NFCLayerB::Adapter {
268 virtual ~Adapter() = default;
269
270 virtual uint16_t max_fifo_depth() const = 0;
271
272 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
273 const uint32_t timeout_ms) = 0;
274 virtual bool transmit(const uint8_t* tx, const uint16_t tx_len, const uint32_t timeout_ms) = 0;
275 virtual bool receive(uint8_t* rx, uint16_t& rx_len, const uint32_t timeout_ms) = 0;
276};
278
279} // namespace nfc
280} // namespace m5
281
282#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:105
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 (NFC-B)
Definition nfc_layer_b.cpp:72
virtual uint16_t unit_size_read() const override
Unit size for read.
Definition nfc_layer_b.hpp:247
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:149
virtual bool receive(uint8_t *rx, uint16_t &rx_len, const uint32_t timeout_ms) override
Receive (NFC-B)
Definition nfc_layer_b.cpp:83
virtual uint16_t maximum_fifo_depth() const override
Maximum FIFO depth in bytes.
Definition nfc_layer_b.cpp:67
virtual uint16_t last_user_block() const override
Last user block.
Definition nfc_layer_b.hpp:239
virtual bool transmit(const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms) override
Transmit (NFC-B)
Definition nfc_layer_b.cpp:78
virtual bool read(uint8_t *rx, uint16_t &rx_len, const uint16_t saddr) override
Read NDEF (block)
Definition nfc_layer_b.hpp:227
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:231
const m5::nfc::b::PICC & activatedPICC() const
Retrieve the currently activated PICC.
Definition nfc_layer_b.hpp:114
bool select(m5::nfc::b::PICC &picc, const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_ATTRIB)
Send ATTRIB to activate the PICC.
Definition nfc_layer_b.cpp:130
NFCLayerB(m5::unit::UnitWS1850S &u)
Constructor with UnitWS1850S (M5Unit-RFID)
bool hlt(const uint8_t pupi[4], const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_HLTB)
Halt (HLTB) the specified PICC.
Definition nfc_layer_b.cpp:174
bool deactivate()
Deactivate the currently active PICC.
Definition nfc_layer_b.cpp:213
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:88
virtual m5::nfc::isodep::IsoDEP * isoDEP() override
Get ISO-DEP context.
Definition nfc_layer_b.hpp:90
bool deselect(const uint8_t pupi[4], const uint8_t cid=0xFF, const uint32_t timeout_ms=m5::nfc::b::TIMEOUT_DESELECT)
Deselect (S(DESELECT)) the specified PICC.
Definition nfc_layer_b.cpp:190
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:132
virtual uint16_t user_area_size() const override
User area size (bytes)
Definition nfc_layer_b.hpp:243
virtual uint16_t unit_size_write() const override
Unit size for write.
Definition nfc_layer_b.hpp:251
virtual uint16_t first_user_block() const override
First user block.
Definition nfc_layer_b.hpp:235
Common interface for NFC layer.
Definition nfc_layer.hpp:26
ISO Data Exchange Protocol.
Definition isoDEP.hpp:240
NDEF operations layer.
Definition ndef_layer.hpp:35
ST25R3916 unit in CapCC1101 (SPI)
Definition unit_ST25R3916.hpp:2113
ST25R3916 Unit.
Definition unit_ST25R3916.hpp:39
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:129
bool valid() const
Valid?
Definition nfcb.hpp:148