M5Unit-NFC 0.1.0 git rev:93745b5
Loading...
Searching...
No Matches
nfcb.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_UNIFIED_NFC_NFC_B_NFCB_HPP
11#define M5_UNIT_UNIFIED_NFC_NFC_B_NFCB_HPP
12
13#include "nfc/nfc.hpp"
14#include <cstdint>
15#include <string>
16#include <cstring>
17
18namespace m5 {
19namespace nfc {
24namespace b {
25
30enum class Type : uint8_t {
31 Unknown,
33};
34
39enum class Require : uint8_t {
40 Slot1,
41 Slot2,
42 Slot4,
43 Slot8,
44 Slot16,
45};
46
47constexpr uint8_t ATQB_LENGTH{11};
48
51constexpr uint8_t COMMUNICATION_SAME_SPEED{0x80};
52// Correct spelling
53constexpr uint8_t COMMUNICATION_SPEED_106K{0X00};
54constexpr uint8_t COMMUNICATION_SPEED_212K_FROM_PICC{0X10};
55constexpr uint8_t COMMUNICATION_SPEED_424K_FROM_PICC{0X20};
56constexpr uint8_t COMMUNICATION_SPEED_847K_FROM_PICC{0X40};
57constexpr uint8_t COMMUNICATION_SPEED_212K_TO_PICC{0X01};
58constexpr uint8_t COMMUNICATION_SPEED_424K_TO_PICC{0X02};
59constexpr uint8_t COMMUNICATION_SPEED_847K_TO_PICC{0X04};
60// @deprecated typo aliases; use COMMUNICATION_SPEED_*
61constexpr uint8_t COMMUNICATION_SPPED_106K{COMMUNICATION_SPEED_106K};
62constexpr uint8_t COMMUNICATION_SPPED_212K_FROM_PICC{COMMUNICATION_SPEED_212K_FROM_PICC};
63constexpr uint8_t COMMUNICATION_SPPED_424K_FROM_PICC{COMMUNICATION_SPEED_424K_FROM_PICC};
64constexpr uint8_t COMMUNICATION_SPPED_847K_FROM_PICC{COMMUNICATION_SPEED_847K_FROM_PICC};
65constexpr uint8_t COMMUNICATION_SPPED_212K_TO_PICC{COMMUNICATION_SPEED_212K_TO_PICC};
66constexpr uint8_t COMMUNICATION_SPPED_424K_TO_PICC{COMMUNICATION_SPEED_424K_TO_PICC};
67constexpr uint8_t COMMUNICATION_SPPED_847K_TO_PICC{COMMUNICATION_SPEED_847K_TO_PICC};
69
72const uint8_t FRAME_OPTION_NAD{0x02};
73const uint8_t FRAME_OPTION_CID{0x01};
75
78
83uint16_t maximum_frame_length(const uint8_t protocol[3]);
84
90inline uint8_t maximum_frame_length_bits(const uint8_t protocol[3])
91{
92 return protocol ? protocol[1] >> 4 : 0x0F;
93}
94
100inline bool supports_iso14443_4(const uint8_t protocol[3])
101{
102 return protocol ? ((protocol[1] & 0x0F) & 0x01) : false;
103}
104
110inline uint8_t get_frame_option(const uint8_t protocol[3])
111{
112 return protocol ? (protocol[2] & 0x03) : 0x00;
113}
119inline uint8_t get_fwi(const uint8_t protocol[3])
120{
121 return protocol ? ((protocol[2] >> 4) & 0x0F) : 0x0F /*RFU*/;
122}
124
129struct PICC {
130 uint8_t uid[8]{};
131 union {
132 uint8_t atqb[ATQB_LENGTH]{};
133 struct {
134 uint8_t pupi[4];
135 uint8_t application[4];
136 uint8_t protocol[3];
137 // uint8_t cid[1];
138 } __attribute__((packed));
139 } __attribute__((packed));
140 Type type{Type::Unknown};
141 uint8_t cid{};
142 uint8_t option{};
143
148 inline bool valid() const
149 {
150 return isISO14443_4();
151 }
152
157 std::string pupiAsString() const;
162 std::string typeAsString() const;
163
166
170 inline bool isISO14443_4() const
171 {
173 }
175
178
182 inline bool supportsNAD() const
183 {
184 return get_frame_option(protocol) & FRAME_OPTION_NAD;
185 }
190 inline bool supportsCID() const
191 {
192 return get_frame_option(protocol) & FRAME_OPTION_CID;
193 }
198 inline uint16_t maximumFrameLength() const
199 {
201 }
206 inline uint8_t maximumFrameLengthBits() const
207 {
209 }
214 inline uint8_t communicationSpeed() const
215 {
216 return protocol[0];
217 }
222 inline uint8_t fwi() const
223 {
224 return get_fwi(protocol);
225 }
227};
228
235inline bool operator==(const PICC& a, const PICC& b)
236{
237 return std::memcmp(a.atqb, b.atqb, sizeof(a.atqb)) == 0;
238}
245inline bool operator!=(const PICC& a, const PICC& b)
246{
247 return !(a == b);
248}
249
254enum class Command : uint8_t {
255 // ISO/IEC 14443B
256 REQ_WUPB = 0x05,
257 ATTRIB = 0x1D,
258 HLTB = 0x50,
259 // ISO/IEC 14443-4
260 DESELECT = 0xC2,
261 DESELECT_WITH_CID = 0xCA,
262};
263
266constexpr uint32_t TIMEOUT_REQ_WUP_B{5};
267constexpr uint32_t TIMEOUT_ATTRIB{50};
268constexpr uint32_t TIMEOUT_HLTB{5};
269constexpr uint32_t TIMEOUT_DESELECT{5};
271
272} // namespace b
273} // namespace nfc
274} // namespace m5
275#endif
NFC-A definitions.
NFC-B definitions.
Top level namespace of M5Stack.
NFC related definitions.
NFC definitions.
uint16_t maximum_frame_length(const uint8_t protocol[3])
Get maximum frame length from protocol bytes.
Definition nfcb.cpp:36
uint8_t get_frame_option(const uint8_t protocol[3])
Gets the frame option bits.
Definition nfcb.hpp:110
Type
Type of the PICC.
Definition nfcb.hpp:30
@ Unclassified
Unclassified.
bool supports_iso14443_4(const uint8_t protocol[3])
Supports ISO/IEC 14443-4?
Definition nfcb.hpp:100
constexpr uint8_t ATQB_LENGTH
ATQB length pupi(4) + application(4) + protocol(3)
Definition nfcb.hpp:47
Require
Number of slots required in the request/wakeup.
Definition nfcb.hpp:39
uint8_t get_fwi(const uint8_t protocol[3])
Gets the FWI.
Definition nfcb.hpp:119
uint8_t maximum_frame_length_bits(const uint8_t protocol[3])
Get maximum frame length code from protocol bytes.
Definition nfcb.hpp:90
Command
ISO/IEC 14443 Type B command (Layer 3 / activation)
Definition nfcb.hpp:254
@ HLTB
Halt Type B (rarely used)
@ ATTRIB
Attribute (activate ISO-DEP)
@ REQ_WUPB
Request/Wakeup Type B.
@ DESELECT_WITH_CID
DESELECT with CID.
PICC for NFC-B.
Definition nfcb.hpp:129
uint8_t atqb[ATQB_LENGTH]
ATQB.
Definition nfcb.hpp:132
std::string typeAsString() const
Gets the type string.
Definition nfcb.cpp:55
uint8_t fwi() const
Gets FWI.
Definition nfcb.hpp:222
uint8_t cid
CID;.
Definition nfcb.hpp:141
std::string pupiAsString() const
Gets the pupi string.
Definition nfcb.cpp:45
uint8_t application[4]
Application Data.
Definition nfcb.hpp:135
bool valid() const
Valid?
Definition nfcb.hpp:148
uint16_t maximumFrameLength() const
Gets maximum frame length.
Definition nfcb.hpp:198
bool isISO14443_4() const
ISO14443-4?
Definition nfcb.hpp:170
uint8_t maximumFrameLengthBits() const
Gets maximum frame length bits.
Definition nfcb.hpp:206
bool supportsNAD() const
Supports NAD?
Definition nfcb.hpp:182
uint8_t protocol[3]
Protocol information.
Definition nfcb.hpp:136
Type type
Type.
Definition nfcb.hpp:140
uint8_t pupi[4]
Pseudo-Unique PICC Identifier.
Definition nfcb.hpp:134
bool supportsCID() const
Supports CID?
Definition nfcb.hpp:190
uint8_t communicationSpeed() const
Gets communication speed flags.
Definition nfcb.hpp:214