10#ifndef M5_UNIT_UNIFIED_NFC_NFC_ISODEP_ISODEP_HPP
11#define M5_UNIT_UNIFIED_NFC_NFC_ISODEP_ISODEP_HPP
17class NFCLayerInterface;
25uint32_t
fwi_to_ms(
const uint8_t fwi,
const float fc);
27constexpr uint16_t MAX_FRAME_SIZE{256};
31inline bool is_i_block(uint8_t pcb)
33 return (pcb & 0xC0) == 0x00;
36inline bool is_r_block(uint8_t pcb)
38 return (pcb & 0xC0) == 0x80;
41inline bool is_s_block(uint8_t pcb)
43 return (pcb & 0xC0) == 0xC0;
46inline bool i_has_more(uint8_t pcb)
48 return (pcb & 0x10) != 0;
51inline uint8_t i_bn(uint8_t pcb)
53 return (pcb >> 0) & 0x01;
56inline bool is_s_wtx(uint8_t pcb)
58 return (pcb & 0xC0) == 0xC0 && (pcb & 0x30) == 0x30;
61inline bool is_valid_rblock(uint8_t pcb)
64 return ((pcb & 0xC0) == 0x80) && ((pcb & 0x26) == 0x22);
67inline bool r_is_nak(uint8_t pcb)
69 return (pcb & 0x10) != 0;
72inline bool r_is_ack(uint8_t pcb)
74 return !r_is_nak(pcb);
77inline uint8_t get_wtxm(uint8_t inf)
82inline bool is_valid_wtxm(uint8_t wtxm)
84 return (wtxm >= 1) && (wtxm <= 59);
87inline uint32_t mul_clamp_u32(uint32_t
a, uint32_t
b, uint32_t maxv)
96 return (
v > maxv) ? maxv :
v;
100inline uint8_t make_i_pcb(uint8_t bn,
bool more,
bool has_cid,
bool has_nad)
105 pcb |= more ? 0x10 : 0x00;
106 pcb |= has_cid ? 0x08 : 0x00;
107 pcb |= has_nad ? 0x04 : 0x00;
112inline uint8_t make_r_ack(uint8_t bn,
bool has_cid)
117 pcb |= has_cid ? 0x08 : 0x00;
122inline uint8_t make_s_wtx_ack(
bool has_cid)
125 pcb |= has_cid ? 0x08 : 0x00;
134 static constexpr uint16_t table[] = {16, 24, 32, 40, 48, 64, 96, 128, 256};
135 return (fsci < (
sizeof(table) /
sizeof(table[0]))) ? table[fsci] : 0;
144 uint16_t pcd_max_frame_tx{};
145 uint16_t pcd_max_frame_rx{};
146 uint32_t fwt_ms{100};
147 uint32_t wtx_max_ms{5000};
155 uint8_t max_retries{2};
158 inline uint16_t max_frame_cap_tx()
const
160 const auto max_frame = std::min<uint16_t>(pcd_max_frame_tx, fsc);
161 return (max_frame > (overhead() + 2)) ? (max_frame - overhead() - 2) : 0;
163 inline uint16_t max_frame_size_rx()
const
165 return std::min<uint16_t>(pcd_max_frame_rx, fsc);
167 inline uint16_t fsc_inf_cap()
const
169 return (fsc > overhead()) ?
static_cast<uint16_t
>(fsc - overhead()) : 0;
171 inline uint16_t overhead()
const
173 return 1 + (use_cid ? 1 : 0) + (use_nad ? 1 : 0);
203 inline void config(
const config_t& cfg)
210 bool transceiveINF(uint8_t* rx_inf, uint16_t& rx_inf_len,
const uint8_t* tx_inf,
const uint16_t tx_inf_len,
213 bool transceiveAPDU(uint8_t* rx, uint16_t& rx_len,
const uint8_t* cmd,
const uint16_t cmd_len);
215 bool transceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len,
const uint32_t timeout_ms);
220 uint8_t _block_num{};
Common interface for NFC layer.
Definition nfc_layer.hpp:26
ISO Data Exchange Protocol.
Definition isoDEP.hpp:190
bool transceive(uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms)
Transceive normal.
Definition isoDEP.cpp:522
bool transceiveINF(uint8_t *rx_inf, uint16_t &rx_inf_len, const uint8_t *tx_inf, const uint16_t tx_inf_len, RxInfo *info=nullptr)
Transceive INF.
Definition isoDEP.cpp:111
bool transceiveAPDU(uint8_t *rx, uint16_t &rx_len, const uint8_t *cmd, const uint16_t cmd_len)
Transceive APDU.
Definition isoDEP.cpp:430
uint32_t fwi_to_ms(const uint8_t fwi, const float fc)
Calculate waiting time(ms) by fwi and fc.
Definition isoDEP.cpp:92
uint16_t fsci_to_fsc(const uint8_t fsci)
Convert FSCI to FSC (ISO/IEC 14443-4)
Definition isoDEP.hpp:132
Top level namespace of M5stack.
RX information.
Definition isoDEP.hpp:181
ISO-DEP configuration.
Definition isoDEP.hpp:142