M5Unit-NFC 0.0.3 git rev:59f5362
Loading...
Searching...
No Matches
m5::nfc::NFCLayerF Class Reference

Common interface layer for each chip of the NFC-F reader. More...

#include <nfc_layer_f.hpp>

Inheritance diagram for m5::nfc::NFCLayerF:
m5::nfc::NFCLayerInterface

Public Member Functions

 NFCLayerF (m5::unit::UnitST25R3916 &u)
 
 NFCLayerF (m5::unit::CapST25R3916 &u)
 
virtual uint16_t maximum_fifo_depth () const override
 Maximum FIFO depth.
 
bool isActive (const m5::nfc::f::PICC &picc) const
 Is the specified PICC currently active?
 
const m5::nfc::f::PICCactivatedPICC () const
 Retrieve the currently activated PICC.
 
Detection and activation
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.
 
bool detect (m5::nfc::f::PICC &picc, const uint32_t timeout_ms=100U)
 Detect single PICC.
 
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.
 
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.
 
bool detect (std::vector< m5::nfc::f::PICC > &piccs, const uint16_t *private_code, const uint8_t pc_size, m5::nfc::f::TimeSlot time_slot=m5::nfc::f::TimeSlot::Slot16, const uint32_t timeout_ms=500U)
 Detect PICCs matching the specified system code.
 
bool activate (const m5::nfc::f::PICC &picc)
 Activate a specific PICC.
 
bool reactivate (const m5::nfc::f::PICC &picc)
 Activate a specific PICC.
 
For activated PICC
bool deactivate ()
 Deactivate PICC.
 
bool requestService (uint16_t &key_version, const uint16_t node_code)
 Request service.
 
bool requestService (uint16_t key_version[], const uint16_t *node_code, const uint8_t node_num)
 Request service.
 
bool requestResponse (m5::nfc::f::standard::Mode &mode)
 Request response.
 
bool requestSystemCode (uint16_t code_list[255], uint8_t &code_num)
 Request system code.
 
bool dump ()
 Dump all blocks.
 
bool dump (const m5::nfc::f::block_t block)
 Dump 1 block.
 
Read/Write without encryption
Note
For activated PICC
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.
 
bool read16 (uint8_t rx[16], const m5::nfc::f::block_t *block, const uint8_t block_num, const uint16_t service_code=m5::nfc::f::service_random_read)
 Read the 1 block with service codes.
 
bool read (uint8_t *rx, uint16_t &rx_len, const m5::nfc::f::block_t sblock)
 Read any bytes from user area.
 
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.
 
bool write16 (const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len)
 Write the 1 block.
 
bool write (const m5::nfc::f::block_t sblock, const uint8_t *tx, const uint16_t tx_len)
 Write any bytes to user area.
 
bool clearSPAD ()
 Clear SPAD_0 - 13.
 
Read/Write with MAC
Note
For activated PICC
bool internalAuthenticate (const uint8_t ck[16], const uint16_t ckv, const uint8_t rc[16])
 Internal authentication.
 
bool externalAuthenticate (const uint8_t ck[16], const uint16_t ckv)
 External authentication.
 
void clearAuthenticate ()
 Internal authentication.
 
bool readWithMAC16 (uint8_t rx[16], const m5::nfc::f::block_t block)
 Read the 1 block.
 
bool writeWithMAC16 (const m5::nfc::f::block_t block, const uint8_t tx[16], const uint16_t tx_len)
 Write the 1 block.
 
NDEF
Note
For activated PICC
bool ndefIsValidFormat (bool &valid)
 Is the PICC data in NDEF format?
 
bool ndefRead (m5::nfc::ndef::TLV &msg)
 Read NDEF Message TLV.
 
bool ndefWrite (const m5::nfc::ndef::TLV &msg)
 Write NDEF message TLV.
 
bool writeSupportNDEF (const bool enabled)
 Write changes for NDEF Support.
 
- Public Member Functions inherited from m5::nfc::NFCLayerInterface
virtual m5::nfc::NFCForumTag supportsNFCTag () const
 activePICC's NDEF type
 
virtual file_system_feature_t supportsFilesystem () const
 activePICC's File system
 
virtual m5::nfc::isodep::IsoDEPisoDEP ()
 ISO-DEP interface (nullptr if not supported)
 
virtual bool transceive (uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms)
 Transceive (RF command)
 
virtual bool transmit (const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms)
 Transmit only.
 
virtual bool receive (uint8_t *rx, uint16_t &rx_len, const uint32_t timeout_ms)
 Receive only.
 

Protected Member Functions

virtual bool read (uint8_t *rx, uint16_t &rx_len, const uint16_t saddr) override
 Read NDEF (block)
 
virtual bool write (const uint16_t saddr, const uint8_t *tx, const uint16_t tx_len) override
 Write NDEF (block)
 
virtual uint16_t first_user_block () const override
 First user block.
 
virtual uint16_t last_user_block () const override
 Last user block.
 
virtual uint16_t user_area_size () const
 User area size (bytes)
 
virtual uint16_t unit_size_read () const override
 Unit size for read.
 
virtual uint16_t unit_size_write () const override
 Unit size for write.
 
virtual uint8_t maximum_read_blocks () const override
 Maximum read blocks for NFC-F.
 
virtual uint8_t maximum_write_blocks () const override
 Maximum write blocks for NFC-F.
 
bool request_response_impl (const m5::nfc::f::PICC &picc, m5::nfc::f::standard::Mode &mode)
 
bool read_without_encryption_impl (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, const m5::nfc::f::PICC &picc)
 
bool write_without_encryption_impl (const m5::nfc::f::PICC &picc, const m5::nfc::f::block_t *block_list, const uint8_t block_num, const uint16_t *service_code, const uint8_t service_num, const uint8_t *tx, const uint16_t tx_len)
 
bool dump_felica_lite ()
 
bool dump_felica_lite_s ()
 
bool dump_block (m5::nfc::f::block_t block)
 
bool internal_authenticate_lite_s (const uint8_t ck[16], const uint16_t ckv, const uint8_t rc[16], const bool include_wcnt=false)
 
bool external_authenticate_lite_s (const uint8_t ck[16], const uint16_t ckv)
 

Protected Attributes

m5::nfc::f::PICC _activePICC {}
 

Detailed Description

Common interface layer for each chip of the NFC-F reader.

Member Function Documentation

◆ activate()

bool m5::nfc::NFCLayerF::activate ( const m5::nfc::f::PICC & picc)

Activate a specific PICC.

Parameters
piccPICC
Returns
True if successful
Note
For compatibility with other NFCLayer components

◆ activatedPICC()

const m5::nfc::f::PICC & m5::nfc::NFCLayerF::activatedPICC ( ) const
inline

Retrieve the currently activated PICC.

Returns
Active PICC
Note
Returns an empty PICC if no PICC is selected (no ACTIVE state)

◆ clearAuthenticate()

void m5::nfc::NFCLayerF::clearAuthenticate ( )
inline

Internal authentication.

Parameters
ckCard key
ckvCard key version
rcRandom challenge
Returns
True if successful

◆ clearSPAD()

bool m5::nfc::NFCLayerF::clearSPAD ( )

Clear SPAD_0 - 13.

Returns
True if successful
Precondition
Each area can be written to without authentication

◆ deactivate()

bool m5::nfc::NFCLayerF::deactivate ( )

Deactivate PICC.

Returns
True if successful
Note
For compatibility with other NFCLayer components

◆ detect() [1/4]

bool m5::nfc::NFCLayerF::detect ( m5::nfc::f::PICC & picc,
const uint32_t timeout_ms = 100U )

Detect single PICC.

Parameters
[out]piccDetected PICC
timeout_msPolling time budget in milliseconds
Returns
True if detected
Warning
Misclassification may occur depending on the distance between the reader and the PICC

◆ detect() [2/4]

bool m5::nfc::NFCLayerF::detect ( std::vector< m5::nfc::f::PICC > & piccs,
const uint16_t * private_code,
const uint8_t pc_size,
m5::nfc::f::TimeSlot time_slot = m5::nfc::f::TimeSlot::Slot16,
const uint32_t timeout_ms = 500U )

Detect PICCs matching the specified system code.

Parameters
[out]piccsDetected PICCs
private_codePrivate system code array
pc_sizeprivate_code size
time_slotMaximum number of slots that can be responded
timeout_msPolling time budget in milliseconds
Returns
True if detected
Note
If a private code is specified, PICC that does not meet the conditions will not be detected
private codes are OR matching
Warning
Misclassification may occur depending on the distance between the reader and the PICC

◆ detect() [3/4]

bool m5::nfc::NFCLayerF::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 )
inline

Detect PICCs matching the specified system code.

Parameters
[out]piccsDetected PICCs
private_codePrivate system code
time_slotMaximum number of slots that can be responded
timeout_msPolling time budget in milliseconds
Returns
True if detected
Note
If a private code is specified, PICC that does not meet the conditions will not be detected
Warning
Misclassification may occur depending on the distance between the reader and the PICC

◆ detect() [4/4]

bool m5::nfc::NFCLayerF::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 )
inline

Detect PICCs.

Parameters
[out]piccsDetected PICCs
time_slotMaximum number of slots that can be responded
timeout_msPolling time budget in milliseconds
Returns
True if detected
Warning
Misclassification may occur depending on the distance between the reader and the PICC

◆ dump() [1/2]

bool m5::nfc::NFCLayerF::dump ( )

Dump all blocks.

Returns
True if successful
Note
Only the sections that can be read without encryption

◆ dump() [2/2]

bool m5::nfc::NFCLayerF::dump ( const m5::nfc::f::block_t block)

Dump 1 block.

Parameters
blockblock list element
Returns
True if successful
Note
Only the sections that can be read without encryption

◆ externalAuthenticate()

bool m5::nfc::NFCLayerF::externalAuthenticate ( const uint8_t ck[16],
const uint16_t ckv )

External authentication.

Parameters
wcntWCNT value
Returns
True if successful
Precondition
internalAuthenticate

◆ first_user_block()

virtual uint16_t m5::nfc::NFCLayerF::first_user_block ( ) const
inlineoverrideprotectedvirtual

First user block.

Implements m5::nfc::NFCLayerInterface.

◆ internalAuthenticate()

bool m5::nfc::NFCLayerF::internalAuthenticate ( const uint8_t ck[16],
const uint16_t ckv,
const uint8_t rc[16] )

Internal authentication.

Parameters
ckCard key
ckvCard key version
rcRandom challenge
Returns
True if successful

◆ isActive()

bool m5::nfc::NFCLayerF::isActive ( const m5::nfc::f::PICC & picc) const
inline

Is the specified PICC currently active?

Parameters
piccPICC to check
Returns
True if this PICC is the one currently selected (ACTIVE state)

◆ last_user_block()

virtual uint16_t m5::nfc::NFCLayerF::last_user_block ( ) const
inlineoverrideprotectedvirtual

Last user block.

Implements m5::nfc::NFCLayerInterface.

◆ maximum_fifo_depth()

uint16_t m5::nfc::NFCLayerF::maximum_fifo_depth ( ) const
overridevirtual

Maximum FIFO depth.

Implements m5::nfc::NFCLayerInterface.

◆ maximum_read_blocks()

virtual uint8_t m5::nfc::NFCLayerF::maximum_read_blocks ( ) const
inlineoverrideprotectedvirtual

Maximum read blocks for NFC-F.

Reimplemented from m5::nfc::NFCLayerInterface.

◆ maximum_write_blocks()

virtual uint8_t m5::nfc::NFCLayerF::maximum_write_blocks ( ) const
inlineoverrideprotectedvirtual

Maximum write blocks for NFC-F.

Reimplemented from m5::nfc::NFCLayerInterface.

◆ ndefIsValidFormat()

bool m5::nfc::NFCLayerF::ndefIsValidFormat ( bool & valid)

Is the PICC data in NDEF format?

Parameters
[out]validTrue if NDEF format
Returns
True if successful

◆ ndefRead()

bool m5::nfc::NFCLayerF::ndefRead ( m5::nfc::ndef::TLV & msg)

Read NDEF Message TLV.

Parameters
[out]msgMessage If it does not exist, a Null TLV is returned
Returns
True if successful
Note
If multiple messages of the same type exist, return the first one
Warning
Only PICC cards supporting NDEF are valid

◆ ndefWrite()

bool m5::nfc::NFCLayerF::ndefWrite ( const m5::nfc::ndef::TLV & msg)

Write NDEF message TLV.

Parameters
msgMessage TLV
Returns
True if successful
Warning
Existing record will be overwritten
Only PICC cards supporting NDEF are valid

◆ polling()

bool m5::nfc::NFCLayerF::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.

Parameters
[out]PICCdetected PICC
system_codeSystem code
request_codeRequest code
time_slotMaximum number of slots that can be responded
Returns
True if successful
Note
SENSF_REQ

◆ reactivate()

bool m5::nfc::NFCLayerF::reactivate ( const m5::nfc::f::PICC & picc)
inline

Activate a specific PICC.

Parameters
piccPICC
Returns
True if successful
Note
For compatibility with other NFCLayer components

◆ read() [1/3]

bool m5::nfc::NFCLayerF::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 )
inline

Read the specified block list and service codes.

Parameters
[out]rxBuffer (At least 16 * block_num)
[in/out]rx_len in:buffer size, out:actual read size
blockTarget block array
block_numNumber of block
service_codeService code array
service_numNumber of service code
Returns
True if successful
Warning
rx in 16-byte units

◆ read() [2/3]

bool m5::nfc::NFCLayerF::read ( uint8_t * rx,
uint16_t & rx_len,
const m5::nfc::f::block_t sblock )

Read any bytes from user area.

Continue reading only the user area from the first block of the user area until rx_len is satisfied

Parameters
[out]rxBuffer
[in/out]rx_len in:buffer size, out:actual read size
sblockBlock to start reading
Returns
True if successful
Warning
rx in 16-byte units

◆ read() [3/3]

bool m5::nfc::NFCLayerF::read ( uint8_t * rx,
uint16_t & rx_len,
const uint16_t saddr )
overrideprotectedvirtual

Read NDEF (block)

Implements m5::nfc::NFCLayerInterface.

◆ read16() [1/2]

bool m5::nfc::NFCLayerF::read16 ( uint8_t rx[16],
const m5::nfc::f::block_t * block,
const uint8_t block_num,
const uint16_t service_code = m5::nfc::f::service_random_read )

Read the 1 block with service codes.

Parameters
[out]rxOutput buffer
blockTarget block array
block_numNumber of block
service_codeService code
Returns
True if successful
Parameters
service_codeService code

◆ read16() [2/2]

bool m5::nfc::NFCLayerF::read16 ( uint8_t rx[16],
const m5::nfc::f::block_t block,
const uint16_t service_code = m5::nfc::f::service_random_read )
inline

Read the 1 block with service code.

Parameters
[out]rxOutput buffer
blockTarget block
service_codeService code
Returns
True if successful

◆ readWithMAC16()

bool m5::nfc::NFCLayerF::readWithMAC16 ( uint8_t rx[16],
const m5::nfc::f::block_t block )

Read the 1 block.

Parameters
[out]rxOutput buffer
blockTarget block
Returns
True if successful
Precondition
internalAuthentication

◆ requestResponse()

bool m5::nfc::NFCLayerF::requestResponse ( m5::nfc::f::standard::Mode & mode)
inline

Request response.

Returns
True if successful
Parameters
[out]modeMode if detected
Warning
FeliCa Standard only

◆ requestService() [1/2]

bool m5::nfc::NFCLayerF::requestService ( uint16_t & key_version,
const uint16_t node_code )

Request service.

Parameters
[out]key_versionKey version
node_codeNode code
Returns
True if successful
Warning
FeliCa Standard only

◆ requestService() [2/2]

bool m5::nfc::NFCLayerF::requestService ( uint16_t key_version[],
const uint16_t * node_code,
const uint8_t node_num )

Request service.

Parameters
[out]key_versionKey version array (at least node_num)
node_codeNode code array
node_numNumber of node_code
Returns
True if successful
Warning
FeliCa Standard only

◆ requestSystemCode()

bool m5::nfc::NFCLayerF::requestSystemCode ( uint16_t code_list[255],
uint8_t & code_num )

Request system code.

Parameters
[out]code_listCode list array (at least 255)
[out]code_numNumber of code_list
Returns
True if successful
Warning
FeliCa Standard only

◆ unit_size_read()

virtual uint16_t m5::nfc::NFCLayerF::unit_size_read ( ) const
inlineoverrideprotectedvirtual

Unit size for read.

Implements m5::nfc::NFCLayerInterface.

◆ unit_size_write()

virtual uint16_t m5::nfc::NFCLayerF::unit_size_write ( ) const
inlineoverrideprotectedvirtual

Unit size for write.

Implements m5::nfc::NFCLayerInterface.

◆ user_area_size()

virtual uint16_t m5::nfc::NFCLayerF::user_area_size ( ) const
inlineprotectedvirtual

User area size (bytes)

Implements m5::nfc::NFCLayerInterface.

◆ write() [1/2]

bool m5::nfc::NFCLayerF::write ( const m5::nfc::f::block_t sblock,
const uint8_t * tx,
const uint16_t tx_len )

Write any bytes to user area.

Continue writing only the user area from the first block of the user area until tx_len is satisfied

Parameters
sblockBlock to start writing
txBuffer
tx_lenBuffer size
Returns
True if successful

◆ write() [2/2]

bool m5::nfc::NFCLayerF::write ( const uint16_t saddr,
const uint8_t * tx,
const uint16_t tx_len )
overrideprotectedvirtual

Write NDEF (block)

Implements m5::nfc::NFCLayerInterface.

◆ write16()

bool m5::nfc::NFCLayerF::write16 ( const m5::nfc::f::block_t block,
const uint8_t tx[16],
const uint16_t tx_len )

Write the 1 block.

Parameters
blockTarget block
txBuffer
tx_lenBuffer size
Returns
True if successful
Warning
If the tx_len is less than 16 bytes, the remaining space is filled with 0x00
If the tx_len is larger than 16 bytes, only the first 16 bytes will be written

◆ writeSupportNDEF()

bool m5::nfc::NFCLayerF::writeSupportNDEF ( const bool enabled)

Write changes for NDEF Support.

Parameters
enabledSupport NDEF if true, NOT support NDEF if false
Returns
True if successful
Warning
Only FeliCa Lite, Lite-S

◆ writeWithMAC16()

bool m5::nfc::NFCLayerF::writeWithMAC16 ( const m5::nfc::f::block_t block,
const uint8_t tx[16],
const uint16_t tx_len )

Write the 1 block.

Parameters
blockTarget block
txBuffer
tx_lenBuffer size
Returns
True if successful
Warning
If the tx_len is less than 16 bytes, the remaining space is filled with 0x00
If the tx_len is larger than 16 bytes, only the first 16 bytes will be written