171 lines
5.3 KiB
C
171 lines
5.3 KiB
C
#pragma once
|
|
|
|
#include "rc522_types.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define RC522_PICC_UID_SIZE_MAX (10)
|
|
#define RC522_PICC_UID_SIZE_MIN (4)
|
|
#define RC522_PICC_UID_STR_BUFFER_SIZE_MAX (RC522_PICC_UID_SIZE_MAX * 3)
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t value[RC522_PICC_UID_SIZE_MAX];
|
|
uint8_t length;
|
|
} rc522_picc_uid_t;
|
|
|
|
typedef enum
|
|
{
|
|
RC522_PICC_TYPE_UNKNOWN = -1,
|
|
RC522_PICC_TYPE_UNDEFINED = 0,
|
|
RC522_PICC_TYPE_ISO_14443_4, // PICC compliant with ISO/IEC 14443-4
|
|
RC522_PICC_TYPE_ISO_18092, // PICC compliant with ISO/IEC 18092 (NFC)
|
|
RC522_PICC_TYPE_MIFARE_MINI, // MIFARE Classic protocol, 320 bytes
|
|
RC522_PICC_TYPE_MIFARE_1K, // MIFARE Classic protocol, 1KB
|
|
RC522_PICC_TYPE_MIFARE_4K, // MIFARE Classic protocol, 4KB
|
|
RC522_PICC_TYPE_MIFARE_UL, // MIFARE Ultralight or Ultralight C
|
|
RC522_PICC_TYPE_MIFARE_PLUS, // MIFARE Plus
|
|
RC522_PICC_TYPE_MIFARE_DESFIRE, // MIFARE DESFire
|
|
RC522_PICC_TYPE_TNP3XXX, // Only mentioned in NXP AN 10833 MIFARE Type Identification Procedure
|
|
RC522_PICC_TYPE_MIFARE_UL_, // Ultralight MF0ICU1; 16x 4-byte pages
|
|
RC522_PICC_TYPE_MIFARE_UL_C, // Ultralight C MF0ICU2; 48x 4-byte pages
|
|
RC522_PICC_TYPE_MIFARE_UL_EV1_1, // Ultralight EV1 MF0UL11; 20x 4-byte pages
|
|
RC522_PICC_TYPE_MIFARE_UL_EV1_2, // Ultralight EV1 MF0UL21; 41x 4-byte pages
|
|
RC522_PICC_TYPE_MIFARE_UL_NANO, // Ultralight NANO; 40 bytes (probably 10x 4-byte pages)
|
|
RC522_PICC_TYPE_MIFARE_UL_AES, // Ultralight AES MF0AES(H)20; 60x 4-byte pages
|
|
RC522_PICC_TYPE_NTAG2xx, // NTAG 2xx; further information unknown
|
|
RC522_PICC_TYPE_NTAG213, // NTAG213; 45x 4-byte pages
|
|
RC522_PICC_TYPE_NTAG215, // NTAG215; 135x 4-byte pages
|
|
RC522_PICC_TYPE_NTAG216, // NTAG216; 231x 4-byte pages
|
|
} rc522_picc_type_t;
|
|
|
|
typedef enum
|
|
{
|
|
/**
|
|
* Not used! Ignore this one.
|
|
*
|
|
* In the POWER-OFF State, the PICC is not powered
|
|
* due to a lack of carrier energy.
|
|
*/
|
|
RC522_PICC_STATE_POWER_OFF = -1,
|
|
|
|
/**
|
|
* PICC is maybe in the field.
|
|
*
|
|
* In the IDLE State, the PICC shall recognize REQA and WUPA Commands.
|
|
* The PICC enters the READY State after it has received a valid
|
|
* REQA or WUPA Command and transmitted its ATQA.
|
|
*/
|
|
RC522_PICC_STATE_IDLE = 0,
|
|
|
|
/**
|
|
* In the READY State, either the bit frame anticollision or a proprietary
|
|
* anticollision method can be applied. Cascade levels are handled inside
|
|
* this state to get the complete UID.
|
|
*
|
|
* The PICC enters the ACTIVE State when it is selected with its complete UID.
|
|
*/
|
|
RC522_PICC_STATE_READY,
|
|
|
|
/**
|
|
* PICC is in the field.
|
|
*
|
|
* In the ACTIVE State, the PICC listens to any higher layer message.
|
|
* The PICC enters the HALT State when a valid HLTA Command is received.
|
|
*
|
|
* @note
|
|
* In the higher layer protocol, specific commands may be defined
|
|
* to return the PICC to its HALT State.
|
|
*/
|
|
RC522_PICC_STATE_ACTIVE,
|
|
|
|
/**
|
|
* In the HALT State, the PICC shall respond only to a WUPA Command.
|
|
*
|
|
* The PICC enters the READY* state after it has received a valid
|
|
* WUPA Command and transmitted its ATQA.
|
|
*/
|
|
RC522_PICC_STATE_HALT,
|
|
|
|
/**
|
|
* READY* State
|
|
*
|
|
* PICC is woken from HALT state by WUPA command.
|
|
*
|
|
* The READY* State is similar to the READY State, either the bit frame
|
|
* anticollision or a proprietary anticollision method can be applied.
|
|
* Cascade levels are handled inside this state to get complete UID.
|
|
*
|
|
* The PICC enters the ACTIVE* State when it is selected with its complete UID.
|
|
*/
|
|
RC522_PICC_STATE_READY_H,
|
|
|
|
/**
|
|
* ACTIVE* State
|
|
*
|
|
* PICC is still in the field. PICC enters this state
|
|
* when it is SELECTED in the READY* state.
|
|
*
|
|
* The ACTIVE* State is similar to the ACTIVE State, the PICC is selected and
|
|
* listens to any higher layer message.
|
|
*
|
|
* The PICC enters the HALT State when a valid HLTA Command is received.
|
|
*/
|
|
RC522_PICC_STATE_ACTIVE_H,
|
|
|
|
/**
|
|
* AUTHENTICATED State
|
|
*
|
|
* PICC has been authenticated, via either keys or passwords, and accessing
|
|
* protected areas is now possible. This is a Level 3 extension on some NXP
|
|
* PICCs.
|
|
*/
|
|
RC522_PICC_STATE_AUTHENTICATED,
|
|
} rc522_picc_state_t;
|
|
|
|
/**
|
|
* All RFU bits shall be set to zero.
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint16_t source;
|
|
uint8_t rfu4 :4;
|
|
uint8_t prop_coding :4;
|
|
uint8_t uid_size :2; // 00b - single (4 bytes), 01b - double (7 bytes), 10b - triple (10 bytes)
|
|
uint8_t rfu1 :1;
|
|
uint8_t anticollision :5;
|
|
} rc522_picc_atqa_desc_t;
|
|
|
|
typedef struct
|
|
{
|
|
rc522_picc_atqa_desc_t atqa;
|
|
rc522_picc_uid_t uid;
|
|
uint8_t sak;
|
|
rc522_picc_type_t type;
|
|
rc522_picc_state_t state;
|
|
} rc522_picc_t;
|
|
|
|
typedef struct
|
|
{
|
|
rc522_picc_state_t old_state;
|
|
rc522_picc_t *picc;
|
|
} rc522_picc_state_changed_event_t;
|
|
|
|
char *rc522_picc_type_name(rc522_picc_type_t type);
|
|
|
|
/**
|
|
* @brief Convert PICC UID to (null-terminated) string
|
|
*/
|
|
esp_err_t rc522_picc_uid_to_str(const rc522_picc_uid_t *uid, char *buffer, uint8_t buffer_size);
|
|
|
|
/**
|
|
* @brief Print PICC information in a fancy way
|
|
*/
|
|
esp_err_t rc522_picc_print(const rc522_picc_t *picc);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|