M5Unit-NFC 0.1.0 git rev:93745b5
Loading...
Searching...
No Matches
nfc_layer_f.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_F_HPP
17#define M5_UNIT_NFC_NFC_LAYER_NFC_LAYER_F_HPP
18
20#include "nfc/f/nfcf.hpp"
22#include <vector>
23#include <memory>
24
25namespace m5 {
26namespace unit {
27class UnitST25R3916;
28class CapST25R3916;
29} // namespace unit
30
31namespace nfc {
32
38public:
39 struct Adapter;
50 virtual ~NFCLayerF();
51
56 virtual uint16_t maximum_fifo_depth() const override;
57
63 inline bool isActive(const m5::nfc::f::PICC& picc) const
64 {
65 return _activePICC.valid() && _activePICC == picc;
66 }
73 {
74 return _activePICC;
75 }
76
79
88 bool polling(m5::nfc::f::PICC& picc, const uint16_t system_code, const m5::nfc::f::RequestCode request_code,
89 const m5::nfc::f::TimeSlot time_slot);
90
98 bool detect(m5::nfc::f::PICC& picc, const uint32_t timeout_ms = 100U);
107 inline bool detect(std::vector<m5::nfc::f::PICC>& piccs,
108 m5::nfc::f::TimeSlot time_slot = m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms = 500U)
109 {
110 return detect(piccs, nullptr, 0, time_slot, timeout_ms);
111 }
122 inline bool detect(std::vector<m5::nfc::f::PICC>& piccs, const uint16_t private_code,
123 m5::nfc::f::TimeSlot time_slot = m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms = 500U)
124 {
125 return detect(piccs, &private_code, 1, time_slot, timeout_ms);
126 }
139 bool detect(std::vector<m5::nfc::f::PICC>& piccs, const uint16_t* private_code, const uint8_t pc_size,
140 m5::nfc::f::TimeSlot time_slot = m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms = 500U);
141
148 bool activate(const m5::nfc::f::PICC& picc);
155 inline bool reactivate(const m5::nfc::f::PICC& picc)
156 {
157 return activate(picc);
158 }
160
163
168 bool deactivate();
169
177 bool requestService(uint16_t& key_version, const uint16_t node_code);
186 bool requestService(uint16_t key_version[], const uint16_t* node_code, const uint8_t node_num);
187
195 {
196 return _activePICC.valid() && request_response_impl(_activePICC, mode);
197 }
198
206 bool requestSystemCode(uint16_t code_list[255], uint8_t& code_num);
207
213 bool dump();
220 bool dump(const m5::nfc::f::block_t block);
222
226
233 inline bool read16(uint8_t rx[16], const m5::nfc::f::block_t block,
234 const uint16_t service_code = m5::nfc::f::service_random_read)
235 {
236 return read16(rx, &block, 1, service_code);
237 }
246 bool read16(uint8_t rx[16], const m5::nfc::f::block_t* block, const uint8_t block_num,
247 const uint16_t service_code = m5::nfc::f::service_random_read);
248
258 bool read(uint8_t* rx, uint16_t& rx_len, const m5::nfc::f::block_t sblock);
259
271 inline bool read(uint8_t* rx, uint16_t& rx_len, const m5::nfc::f::block_t* block_list, const uint8_t block_num,
272 const uint16_t* service_code, const uint8_t service_num)
273 {
274 return _activePICC.valid() &&
275 read_without_encryption_impl(rx, rx_len, block_list, block_num, service_code, service_num, _activePICC);
276 }
277
287 bool write16(const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len);
296 bool write(const m5::nfc::f::block_t sblock, const uint8_t* tx, const uint16_t tx_len);
297
303 bool clearSPAD();
304
306
310
317 bool internalAuthenticate(const uint8_t ck[16], const uint16_t ckv, const uint8_t rc[16]);
325 bool externalAuthenticate(const uint8_t ck[16], const uint16_t ckv);
326
329 {
330 _authenticated = false;
331 }
332
340 bool readWithMAC16(uint8_t rx[16], const m5::nfc::f::block_t block);
341
351 bool writeWithMAC16(const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len);
353
357
362 bool ndefIsValidFormat(bool& valid);
370 bool ndefRead(m5::nfc::ndef::TLV& msg);
378 bool ndefWrite(const m5::nfc::ndef::TLV& msg);
379
386 bool writeSupportNDEF(const bool enabled);
388
389protected:
390 virtual bool read(uint8_t* rx, uint16_t& rx_len, const uint16_t saddr) override;
391 virtual bool write(const uint16_t saddr, const uint8_t* tx, const uint16_t tx_len) override;
392 inline virtual uint16_t first_user_block() const override
393 {
394 return _activePICC.firstUserBlock();
395 }
396 inline virtual uint16_t last_user_block() const override
397 {
398 return _activePICC.lastUserBlock();
399 }
400 inline virtual uint16_t user_area_size() const override
401 {
402 return _activePICC.userAreaSize();
403 }
404 inline virtual uint16_t unit_size_read() const override
405 {
406 return 16;
407 }
408 inline virtual uint16_t unit_size_write() const override
409 {
410 return 16;
411 }
412 inline virtual uint8_t maximum_read_blocks() const override
413 {
414 return _activePICC.maximumReadBlocks();
415 }
416 inline virtual uint8_t maximum_write_blocks() const override
417 {
418 return _activePICC.maximumWriteBlocks();
419 }
420
421 bool request_response_impl(const m5::nfc::f::PICC& picc, m5::nfc::f::standard::Mode& mode);
422 bool request_system_code_impl(const m5::nfc::f::PICC& picc, uint16_t code_list[255], uint8_t& code_num);
423 bool read_without_encryption_impl(uint8_t* rx, uint16_t& rx_len, const m5::nfc::f::block_t* block_list,
424 const uint8_t block_num, const uint16_t* service_code, const uint8_t service_num,
425 const m5::nfc::f::PICC& picc);
426 bool write_without_encryption_impl(const m5::nfc::f::PICC& picc, const m5::nfc::f::block_t* block_list,
427 const uint8_t block_num, const uint16_t* service_code, const uint8_t service_num,
428 const uint8_t* tx, const uint16_t tx_len);
429
430 bool dump_felica_lite();
431 bool dump_felica_lite_s();
432 bool dump_block(m5::nfc::f::block_t block);
433
434 bool internal_authenticate_lite_s(const uint8_t ck[16], const uint16_t ckv, const uint8_t rc[16],
435 const bool include_wcnt = false);
436 bool external_authenticate_lite_s(const uint8_t ck[16], const uint16_t ckv);
437
438protected:
439 m5::nfc::f::PICC _activePICC{};
440
441private:
442 std::unique_ptr<Adapter> _impl;
444 union {
445 uint8_t _sk[16]{};
446 struct {
447 uint8_t _sk1[8];
448 uint8_t _sk2[8];
449 };
450 };
451 uint8_t _rc[16]{};
452 bool _authenticated{};
453};
454
456// Impl for units
457struct NFCLayerF::Adapter {
458 virtual ~Adapter() = default;
459
460 virtual uint16_t max_fifo_depth() const = 0;
461 virtual bool transceive(uint8_t* rx, uint16_t& rx_len, const uint8_t* tx, const uint16_t tx_len,
462 const uint32_t timeout_ms) = 0;
463};
465
466} // namespace nfc
467} // namespace m5
468#endif
Common interface layer for each chip of the NFC-F reader.
Definition nfc_layer_f.hpp:37
bool read16(uint8_t rx[16], const m5::nfc::f::block_t block, const uint16_t service_code=m5::nfc::f::service_random_read)
Read the 1 block with service code.
Definition nfc_layer_f.hpp:233
bool ndefWrite(const m5::nfc::ndef::TLV &msg)
Write NDEF message TLV.
Definition nfc_layer_f.cpp:781
bool requestService(uint16_t &key_version, const uint16_t node_code)
Request service.
Definition nfc_layer_f.cpp:309
bool requestResponse(m5::nfc::f::standard::Mode &mode)
Request response.
Definition nfc_layer_f.hpp:194
bool read(uint8_t *rx, uint16_t &rx_len, const m5::nfc::f::block_t sblock)
Read any bytes from user area.
Definition nfc_layer_f.cpp:493
virtual uint16_t first_user_block() const override
First user block.
Definition nfc_layer_f.hpp:392
bool writeWithMAC16(const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len)
Write the 1 block.
Definition nfc_layer_f.cpp:682
virtual uint16_t unit_size_read() const override
Unit size for read.
Definition nfc_layer_f.hpp:404
virtual uint8_t maximum_read_blocks() const override
Maximum read blocks for NFC-F.
Definition nfc_layer_f.hpp:412
bool detect(std::vector< m5::nfc::f::PICC > &piccs, m5::nfc::f::TimeSlot time_slot=m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms=500U)
Detect PICCs.
Definition nfc_layer_f.hpp:107
virtual uint16_t maximum_fifo_depth() const override
Maximum FIFO depth in bytes.
Definition nfc_layer_f.cpp:84
bool readWithMAC16(uint8_t rx[16], const m5::nfc::f::block_t block)
Read the 1 block.
Definition nfc_layer_f.cpp:544
bool dump()
Dump all blocks.
Definition nfc_layer_f.cpp:812
virtual uint16_t unit_size_write() const override
Unit size for write.
Definition nfc_layer_f.hpp:408
bool isActive(const m5::nfc::f::PICC &picc) const
Is the specified PICC currently active?
Definition nfc_layer_f.hpp:63
virtual uint16_t user_area_size() const override
User area size (bytes)
Definition nfc_layer_f.hpp:400
bool detect(std::vector< m5::nfc::f::PICC > &piccs, const uint16_t private_code, m5::nfc::f::TimeSlot time_slot=m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms=500U)
Detect PICCs matching the specified system code.
Definition nfc_layer_f.hpp:122
bool reactivate(const m5::nfc::f::PICC &picc)
Activate a specific PICC.
Definition nfc_layer_f.hpp:155
virtual uint16_t last_user_block() const override
Last user block.
Definition nfc_layer_f.hpp:396
bool detect(m5::nfc::f::PICC &picc, const uint32_t timeout_ms=100U)
Detect single PICC.
Definition nfc_layer_f.cpp:123
bool deactivate()
Deactivate PICC.
Definition nfc_layer_f.cpp:302
bool clearSPAD()
Clear SPAD_0 - 13.
Definition nfc_layer_f.cpp:737
void clearAuthenticate()
Clear authentication state.
Definition nfc_layer_f.hpp:328
bool ndefRead(m5::nfc::ndef::TLV &msg)
Read NDEF Message TLV.
Definition nfc_layer_f.cpp:769
bool externalAuthenticate(const uint8_t ck[16], const uint16_t ckv)
External authentication.
Definition nfc_layer_f.cpp:751
bool write(const m5::nfc::f::block_t sblock, const uint8_t *tx, const uint16_t tx_len)
Write any bytes to user area.
Definition nfc_layer_f.cpp:616
virtual uint8_t maximum_write_blocks() const override
Maximum write blocks for NFC-F.
Definition nfc_layer_f.hpp:416
bool activate(const m5::nfc::f::PICC &picc)
Activate a specific PICC.
Definition nfc_layer_f.cpp:292
bool writeSupportNDEF(const bool enabled)
Write changes for NDEF Support.
Definition nfc_layer_f.cpp:787
bool ndefIsValidFormat(bool &valid)
Is the PICC data in NDEF format?
Definition nfc_layer_f.cpp:763
bool internalAuthenticate(const uint8_t ck[16], const uint16_t ckv, const uint8_t rc[16])
Internal authentication.
Definition nfc_layer_f.cpp:743
const m5::nfc::f::PICC & activatedPICC() const
Retrieve the currently activated PICC.
Definition nfc_layer_f.hpp:72
bool polling(m5::nfc::f::PICC &picc, const uint16_t system_code, const m5::nfc::f::RequestCode request_code, const m5::nfc::f::TimeSlot time_slot)
Polling.
Definition nfc_layer_f.cpp:89
bool read(uint8_t *rx, uint16_t &rx_len, const m5::nfc::f::block_t *block_list, const uint8_t block_num, const uint16_t *service_code, const uint8_t service_num)
Read the specified block list and service codes.
Definition nfc_layer_f.hpp:271
bool requestSystemCode(uint16_t code_list[255], uint8_t &code_num)
Request system code.
Definition nfc_layer_f.cpp:395
bool write16(const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len)
Write the 1 block.
Definition nfc_layer_f.cpp:606
Common interface for NFC layer.
Definition nfc_layer.hpp:26
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:2113
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-F definitions.
TimeSlot
Timeslot value for Polling.
Definition nfcf.hpp:111
Mode
Mode for Standard.
Definition nfcf.hpp:295
RequestCode
Request code for Polling.
Definition nfcf.hpp:101
PICC information for NFC-F.
Definition nfcf.hpp:490
uint16_t userAreaSize() const
Total user area size.
Definition nfcf.hpp:515
uint16_t lastUserBlock() const
Gets the last user block.
Definition nfcf.hpp:531
uint8_t maximumWriteBlocks() const
Maximum number of blocks that can be write simultaneously.
Definition nfcf.hpp:557
uint16_t firstUserBlock() const
Gets the first user block.
Definition nfcf.hpp:523
uint8_t maximumReadBlocks() const
Maximum number of blocks that can be read simultaneously.
Definition nfcf.hpp:549
bool valid() const
Valid for detection?
Definition nfcf.cpp:310
Block list element.
Definition nfcf.hpp:155