> For the complete documentation index, see [llms.txt](https://docs.mtoolstec.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mtoolstec.com/hardware/rfid-nfc-and-uhf-hardware/grovenfc/api-header-reference.md).

# API Header Reference

Reference declarations for GroveNFC firmware development. Sections are organized by project path and include function signatures, register constants, and data structures. Generated PIO and SDK headers are excluded.

For host integration, use the [IIC Operation Guide](/hardware/rfid-nfc-and-uhf-hardware/grovenfc/iic-operation-guide.md). For build configuration and NFC application flows, use [API and Firmware Development](/hardware/rfid-nfc-and-uhf-hardware/grovenfc/build-and-flash-firmware.md). Feature availability depends on the firmware implementation.

## 4-I2C/X\_I2C.h

```c
#ifndef __XI2C_H__
#define __XI2C_H__

#include <stdint.h>

////////I2C Slave mode///////////
#define I2C_SLAVE_ADDR 		0x48
#define I2cDataReg_Addr			0x0100
#define I2cEpromReg_Addr		0x1000 //0x1000-0x1FFF, 4K bytes buffer

#define I2cSysReg_Base_Addr		0x0000  //0x0000-0x001F
#define I2cSysReg_GetHardwareVersion_Addr   (I2cSysReg_Base_Addr + 0x0000)
#define I2cSysReg_GetFirmwareVersion_Addr   (I2cSysReg_Base_Addr + 0x0002)
#define I2cSysReg_SetMode_Addr              (I2cSysReg_Base_Addr + 0x0004)
#define I2cSysReg_SetTagAddr_Addr           (I2cSysReg_Base_Addr + 0x0006)
#define I2cSysReg_SetRFConfig_Addr          (I2cSysReg_Base_Addr + 0x0008)
#define I2cSysReg_SetFWI_Addr               (I2cSysReg_Base_Addr + 0x000A)
#define I2cSysReg_SetTxCrcEn_Addr           (I2cSysReg_Base_Addr + 0x000C)
#define I2cSysReg_SetRxCrcEn_Addr           (I2cSysReg_Base_Addr + 0x000E)
#define I2cSysReg_GetNFCStatus_Addr         (I2cSysReg_Base_Addr + 0x0010)
#define I2cSysReg_ClrNFCStatus_Addr         (I2cSysReg_Base_Addr + 0x0010)
#define I2cSysReg_GetRxLen_Addr             (I2cSysReg_Base_Addr + 0x0012)
#define I2cSysReg_Shortcut_Addr             (I2cSysReg_Base_Addr + 0x0014)

typedef struct {
    uint16_t VerHardware;  //RO
	uint16_t VerFirmware;  //RO
    uint16_t Mode;
    //Mode is SYS_REG_MODE_TAG, TagAddr: 0000-FFFF, 64K for 16 tags, must be a multiple of 4096 bytes (one sector).
    //Mode is SYS_REG_MODE_FILE_TAG, TagAddr: Slot 0000-xxxx
    uint16_t TagAddr;  
    uint16_t RfConfig;
	uint16_t FWI;
    uint16_t TxCrcEn;
	uint16_t RxCrcEn;
    uint16_t NFCStatus;  //RO
    uint16_t RxLen;  //RO
    uint16_t Command;
} I2cSysReg;

#define I2cMiscReg_Base_Addr	0x0020  //0x0020-0x0023
#define I2cMiscReg_SetRFOn_Addr             (I2cMiscReg_Base_Addr + 0x0000)
#define I2cMiscReg_SetTxLastBit_Addr        (I2cMiscReg_Base_Addr + 0x0001)
#define I2cMiscReg_SetThru_Addr             (I2cMiscReg_Base_Addr + 0x0002)
#define I2cMiscReg_SetEGT_Addr              (I2cMiscReg_Base_Addr + 0x0003)
#define I2cMiscReg_SetSlot_Addr             (I2cMiscReg_Base_Addr + 0x0004)
#define I2cMiscReg_SetResv0_Addr            (I2cMiscReg_Base_Addr + 0x0005)
#define I2cMiscReg_SetResv1_Addr            (I2cMiscReg_Base_Addr + 0x0006)
#define I2cMiscReg_SetResv2_Addr            (I2cMiscReg_Base_Addr + 0x0007)
#define I2cMiscReg_SetResv3_Addr            (I2cMiscReg_Base_Addr + 0x0008)
#define I2cMiscReg_SetEpWrite_Addr          (I2cMiscReg_Base_Addr + 0x0009)


typedef struct {
    uint8_t RFOn;
	uint8_t TxLastBit;
	uint8_t Thru;
	uint8_t EGT;
    uint8_t Slot;
    uint8_t Resv0;
    uint8_t Resv1;
    uint8_t Resv2;
    uint8_t Resv3;
    uint8_t EpWrite;  //write data to flash/read data from flash
} I2cMiscReg;

extern I2cSysReg 	X_I2cSysReg;
extern I2cMiscReg 	X_I2cMiscReg;
extern uint8_t u8I2cDataBuf[256];
extern uint32_t u32I2cSwapCore0;

extern void X_InitI2cSlave();
extern void X_InitI2cReg();

#endif
```

## 4-I2C/X\_RegPara.h

```c
#ifndef __XREGPARA_H__
#define __XREGPARA_H__

////SysRegister for i2c slave mode/////////////////////
    //Mode
    #define SYS_REG_MODE_DEFAULT            0x0000
    #define SYS_REG_MODE_READER             0x0100
    #define SYS_REG_MODE_TAG                0x0200  //Tag data from Flash
    #define SYS_REG_MODE_MIFARE1_READER     0x0300
    #define SYS_REG_MODE_FILE_TAG           0x0400  //Tag data from FAT12 file
        //Tag type only, valid when Mode is set to SYS_REG_MODE_TAG
        #define SYS_REG_MODE_TAG_NONE                    0x0000
        #define SYS_REG_MODE_TAG_NTAG213                 0x0001
        #define SYS_REG_MODE_TAG_NTAG215                 0x0002
        #define SYS_REG_MODE_TAG_NTAG216                 0x0003
        #define SYS_REG_MODE_TAG_NTAG21X                 0x0003  //add it, PS-20260831
        #define SYS_REG_MODE_TAG_MIFARE1_4B1K            0x0004
        #define SYS_REG_MODE_TAG_MIFARE1_7B1K            0x0005
        #define SYS_REG_MODE_TAG_MIFARE1_4B4K            0x0006
        #define SYS_REG_MODE_TAG_MIFARE1_7B4K            0x0007

        #define SYS_REG_MODE_TAG_iSLI                      0x0008  //(28+4)*4
        #define SYS_REG_MODE_TAG_iSLIX                     0x0009  //(28+4)*4
        #define SYS_REG_MODE_TAG_iSLIX2                    0x000A  //(80+4)*4
        #define SYS_REG_MODE_TAG_iSLI_L                    0x000B  //(8+4)*4
        #define SYS_REG_MODE_TAGIT_HF_I_Plus               0x000C  //(64+4)*4
        #define SYS_REG_MODE_TAG_ISO15                     0x000F  //add it, PS-20260831

        #define SYS_REG_MODE_TAG_CHINA_II                  0x0020
        
    //RFConfig, modulation&coding scheme
        //reader config,high 8 bits
        #define SYS_REG_RFCONFIG_READER_DEFAULT            0x0000
        #define SYS_REG_RFCONFIG_READER_ISO14A_106K        0x0100
        #define SYS_REG_RFCONFIG_READER_ISO14A_212K        0x0200
        #define SYS_REG_RFCONFIG_READER_ISO14A_424K        0x0300
        #define SYS_REG_RFCONFIG_READER_ISO14A_848K        0x0400

        #define SYS_REG_RFCONFIG_READER_ISO14B_106K        0x0500
        #define SYS_REG_RFCONFIG_READER_ISO14B_212K        0x0600
        #define SYS_REG_RFCONFIG_READER_ISO14B_424K        0x0700
        #define SYS_REG_RFCONFIG_READER_ISO14B_848K        0x0800

        #define SYS_REG_RFCONFIG_READER_FELICA_212K        0x0900
        #define SYS_REG_RFCONFIG_READER_FELICA_424K        0x0A00

        #define SYS_REG_RFCONFIG_READER_ISO15_26K_ASK100       0x0B00
        #define SYS_REG_RFCONFIG_READER_ISO15_26K_ASK10        0x0C00

        //tag config, low 8 bits
        #define SYS_REG_RFCONFIG_TAG_DEFAULT                0x0000
        #define SYS_REG_RFCONFIG_TAG_ISO14443A_106K         0x0001
        #define SYS_REG_RFCONFIG_TAG_ISO14443A_212K         0x0002
        #define SYS_REG_RFCONFIG_TAG_ISO14443A_424K         0x0003
        #define SYS_REG_RFCONFIG_TAG_ISO14443A_848K         0x0004
        #define SYS_REG_RFCONFIG_TAG_ISO14443B_106K         0x0005
        #define SYS_REG_RFCONFIG_TAG_ISO14443B_212K         0x0006
        #define SYS_REG_RFCONFIG_TAG_ISO14443B_424K         0x0007
        #define SYS_REG_RFCONFIG_TAG_ISO14443B_848K         0x0008
        #define SYS_REG_RFCONFIG_TAG_FELICA_212K            0x0009
        #define SYS_REG_RFCONFIG_TAG_FELICA_424K            0x000A
        #define SYS_REG_RFCONFIG_TAG_ISO15693_26K_ASK       0x000B  //single subcarrier 512/Fs
        #define SYS_REG_RFCONFIG_TAG_ISO15693_26K_FSK       0x000C  //two subcarrier 512/Fs & 508/Fs

    //TxCrcEn
    #define SYS_REG_TXCRCEN_DEFAULT             0x0000
    #define SYS_REG_TXCRCEN_DISABLE             0x0000
    #define SYS_REG_TXCRCEN_14A_ENABLE          0x0001   
    #define SYS_REG_TXCRCEN_14B_ENABLE          0x0002
    #define SYS_REG_TXCRCEN_FELICA_ENABLE       0x0004
    #define SYS_REG_TXCRCEN_ISO15_ENABLE        0x0008
    //RxCrcEn
    #define SYS_REG_RXCRCEN_DEFAULT             0x0000
    #define SYS_REG_RXCRCEN_DISABLE             0x0000
    #define SYS_REG_RXCRCEN_14A_ENABLE          0x0001   
    #define SYS_REG_RXCRCEN_14B_ENABLE          0x0002
    #define SYS_REG_RXCRCEN_FELICA_ENABLE       0x0004
    #define SYS_REG_RXCRCEN_ISO15_ENABLE        0x0008

    //NFCStatus
    #define SYS_REG_NFCSTATUS_DEFAULT           0x0000
    #define SYS_REG_NFCSTATUS_BUSY              0x8000
    #define SYS_REG_NFCSTATUS_RECV_TIMEOUT      0x4000
    #define SYS_REG_NFCSTATUS_RECV_CRCERR       0x2000
    #define SYS_REG_NFCSTATUS_RECV_BITERR       0x1000
    #define SYS_REG_NFCSTATUS_MIFARE1_AUTHOK            0x0800
    #define SYS_REG_NFCSTATUS_MIFARE1_AUTHERR           0x0400
    #define SYS_REG_NFCSTATUS_MIFARE1_WRITEOK           0x0200
    #define SYS_REG_NFCSTATUS_MIFARE1_WRITEERR          0x0100
    #define SYS_REG_NFCSTATUS_RECV_DONE         0x0001
    #define SYS_REG_NFCSTATUS_RECV_NORESP       0x0002
    //NFCStatus for PN532Killer
    #define SYS_REG_NFCSTATUS_PN532_DONE        0x0080  //no data means NORESP!!!

    //Shortcut Command
    #define SYS_REG_COMMAND_NESTED              0x0001
    #define SYS_REG_COMMAND_STATICNESTED        0x0002
    #define SYS_REG_COMMAND_HARDNESTED          0x0003
    #define SYS_REG_COMMAND_DARKSIDE            0x0004
    #define SYS_REG_COMMAND_TAGONSNIFF          0x0005
    #define SYS_REG_COMMAND_TAGOFFSNIFF         0x0006
    #define SYS_REG_COMMAND_TAGONSNIFF_Q        0x0007
    #define SYS_REG_COMMAND_TAGOFFSNIFF_Q       0x0008
    #define SYS_REG_COMMAND_MFKEY32             0x0009
    #define SYS_REG_COMMAND_MFKEY32_Q           0x000A
    #define SYS_REG_COMMAND_MFKEY64             0x000B
    #define SYS_REG_COMMAND_MFKEY64_Q           0x000C
    #define SYS_REG_COMMAND_FUDAN               0x000D
    #define SYS_REG_COMMAND_FUDAN_Q             0x000E
    #define SYS_REG_COMMAND_STATICNESTED_CRACK  0x000F

    #define SYS_REG_COMMAND_PN532KILLER         0x0020
/////////////////////////////////////////////////////////////////////////

////MiscRegister for i2c slave mode/////////////////////
    //RFOn
    #define MISC_REG_RFON_DEFAULT              0x00
    #define MISC_REG_RFON_OFF                  0x00
    #define MISC_REG_RFON_ON                   0x01
    //TxLastBit (only valid when TxCrcEn is disabled)
    #define MISC_REG_TXLASTBIT_DEFAULT         0x00  //8bit data
    #define MISC_REG_TXLASTBIT_0               0x00
    #define MISC_REG_TXLASTBIT_1               0x01
    #define MISC_REG_TXLASTBIT_2               0x02
    #define MISC_REG_TXLASTBIT_3               0x03
    #define MISC_REG_TXLASTBIT_4               0x04
    #define MISC_REG_TXLASTBIT_5               0x05
    #define MISC_REG_TXLASTBIT_6               0x06
    #define MISC_REG_TXLASTBIT_7               0x07
    //Thru
    #define MISC_REG_THRU_DEFAULT              0x00 //disable thru mode
    #define MISC_REG_THRU_DISABLE              0x00 //disable thru mode
    #define MISC_REG_THRU_ENABLE               0x01 //enable thru mode, data received from RF will be sent to I2C master directly without CRC check, and the length is determined by RxLen register
    //EGT
    #define MISC_REG_EGT_DEFAULT               0x00 //default EGT, only valid when 14B is enabled
    #define MISC_REG_EGT_0                     0x00
    #define MISC_REG_EGT_1                     0x01
    #define MISC_REG_EGT_2                     0x02
    #define MISC_REG_EGT_3                     0x03
    #define MISC_REG_EGT_4                     0x04
    #define MISC_REG_EGT_5                     0x05
    #define MISC_REG_EGT_6                     0x06
    #define MISC_REG_EGT_7                     0x07

    //Slot (only valid when Felica is enabled)
    #define MISC_REG_SLOT_DEFAULT              0x00 //default slot, only valid when Felica is enabled
    #define MISC_REG_SLOT_0                    0x00
    #define MISC_REG_SLOT_1                    0x01
    #define MISC_REG_SLOT_2                    0x02
    #define MISC_REG_SLOT_3                    0x03
    #define MISC_REG_SLOT_4                    0x04
    #define MISC_REG_SLOT_5                    0x05
    #define MISC_REG_SLOT_6                    0x06
    #define MISC_REG_SLOT_7                    0x07

    //EpWrite
    #define MISC_REG_EPWRITE_WRITE              0x01
    #define MISC_REG_EPWRITE_READ               0x02


/////////////////////////////////////////////////////////////////////////


#endif
```

## 4-I2C/X\_Ver.h

```c
#ifndef __XVER_H__
#define __XVER_H__

#define X_VER_HARDWARE		( (6<<12)|(1<<8)|(2<<4)|(3<<0) ) //0x6123--20260123;  
#define X_VER_FIRMWARE		( (6<<12)|(9<<8)|(3<<4)|(0<<0) ) //0x6913--20260930;

//Compatible with PN532Killer
#define VER_YEAR    26 
#define VER_MONTH   9
#define VER_DAY     30

#endif
```

## 4-I2C/I2C\_Function.h

```c
#ifndef __I2CFUNC_H__
#define __I2CFUNC_H__

#define UARTSETWORKMODE_FLAG  0xF0000000

extern void X_HandleI2c(uint32_t swap);
extern uint32_t gSetWorkMode;  //uart set work mode 
extern uint32_t gWriteToFile;  //high 16bits -- file, low 16bits -- slot
extern uint16_t u16TagMode;  //record tag mode, remove pio when from tag mode to default mode
#endif
```

## libNFC/X\_Core0.h

```c
/*
NFC runs on RP2040's core1
*/

#ifndef __XCORE0_H__
#define __XCORE0_H__

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>

	//GroveNFC Hardware V1.2, PS-20260428
	//////////////////////////////////////////////////
	//output gpio
	//Reader mode, gpio output pwm 
	#define IOO_CARRIER_13M56			12  //&13
	#define IOO_CARRIER_13M56_OPT		10  //&11
	#define IOO_PWM_41K4					18

	//Tag mode, gpio output to load modulate
	#define IOO_14443ATAG_MODULATE		9
	#define IOO_14443BTAG_MODULATE		IOO_14443ATAG_MODULATE
	#define IOO_15693TAG_MODULATE		IOO_14443ATAG_MODULATE
	#define IOO_FELICATAG_MODULATE		IOO_14443ATAG_MODULATE
	
	#define IOO_BUSY					19  //1--busy
		#define IOO_BUSY_ASSERT				sio_hw->gpio_set = (1<<IOO_BUSY);
		#define IOO_BUSY_DESASSERT 			sio_hw->gpio_clr = (1<<IOO_BUSY);
		
	#define IOO_INDICATOR_LED			6
		#define INDICATOR_LED_ON			sio_hw->gpio_set = (1<<IOO_INDICATOR_LED);
		#define INDICATOR_LED_OFF 			sio_hw->gpio_clr = (1<<IOO_INDICATOR_LED);
		#define INDICATOR_LED_TOG			sio_hw->gpio_togl = (1<<IOO_INDICATOR_LED);
		
	#define IOO_NFC_LED					7
		#define IOO_NFC_LED_ON				sio_hw->gpio_set = (1<<IOO_NFC_LED);
		#define IOO_NFC_LED_OFF 			sio_hw->gpio_clr = (1<<IOO_NFC_LED);
		#define IOO_NFC_LED_TOG				sio_hw->gpio_togl = (1<<IOO_NFC_LED);
		
	#define IOO_RSSI_LED				8
		#define IOO_RSSI_LED_ON				sio_hw->gpio_set = (1<<IOO_RSSI_LED);
		#define IOO_RSSI_LED_OFF 			sio_hw->gpio_clr = (1<<IOO_RSSI_LED);
		#define IOO_RSSI_LED_TOG			sio_hw->gpio_togl = (1<<IOO_RSSI_LED);

	//input gpio
	//Reader mode, gpio input for tag's data
	#define IOI_14443ATAG_RSP		14
	#define IOI_14443BTAG_RSP		IOI_14443ATAG_RSP	
	#define IOI_15693TAG_RSP		IOI_14443ATAG_RSP
	#define IOI_FELICATAG_RSP		IOI_14443ATAG_RSP
	//Tag mode, gpio input for reader's command, use for PIO machine
	#define IOI_14443AREADER_REQ		15
	#define IOI_14443BREADER_REQ		IOI_14443AREADER_REQ
	#define IOI_15693READER_REQ			IOI_14443AREADER_REQ
	#define IOI_FELICAREADER_REQ		IOI_14443AREADER_REQ

	//input ADC
	//carrier amplitude
	#define ADC_RSSI 	29
	//////////////////////////////////////////////////////

#define FRAME_LENGTH_MAX (256+4)

extern uint8_t u8TagRecvCmd[FRAME_LENGTH_MAX];
extern uint8_t u8TagSimData[4096];	//Tag Emulator Buffer
extern bool bTagDataWrite;	//ISO15693 EOF for write
extern uint8_t u8MfPar[18];  //Mifare parity bit


//128K for FAT12
#define FLASH_FAT_OFFSET       0x1E0000  //2MB Flash -- 0x200000
#define FLASH_FAT_BLOCK_SIZE   4096
#define FAT_BLOCK_NUM          256//256--128K  //128--64KB
#define FAT_BLOCK_SIZE         512
//64K for tags' data in I2C mode
#define FLASH_TARGET_OFFSET (FLASH_FAT_OFFSET - (64*1024))  //((2048-256) * 1024) = 0x1C0000  //

	
#endif
```

## libNFC/Comm/X\_Comm.h

```c
#ifndef __XCOMM_H__
#define __XCOMM_H__

extern uint8_t X_SystemInit(void);
extern uint8_t X_NFCInit();
extern void X_NFCFiledOn();
extern void X_NFCFiledOff();
extern void X_NFCSetRef(uint16_t voltage);
extern uint8_t X_NFCMf1ToolInit(uint8_t type);

#endif
```

## libNFC/ISO14A/X\_14443A\_HW\.h

```c
#ifndef     __X_14443AHW_H__
#define     __X_14443AHW_H__

#include <stdint.h>
#include <stdio.h>

#include "pico/stdlib.h"

/* ###################################### */
/* return parity - 1 or 0                 */
/* ###################################### */
extern uint8_t __not_in_flash_func(oddparity)(uint8_t bt);

/* ###################################### */
/* return ISO14443A crc16                 */
/* high byte transmit first               */
/* ###################################### */
extern uint16_t __not_in_flash_func(crc16_A)(uint8_t *data, uint16_t len);

/* ###################################### */
/* return true or false                   */
/* ###################################### */
extern bool __not_in_flash_func(HasValidCrcA)(uint8_t *receivedCmd, uint16_t receivedCmd_len);

/* ###################################### */
/* append crc to the end of data          */
/* ###################################### */
extern void __not_in_flash_func(AppendCrcA)(uint8_t *data, uint16_t len);

/*
///////////////////////////////reader/////////////////////////////////////////////////////////////////////
//timing for 14443A
///////////////////////////////////////////////////////
//PS-20220828
//PCD --> PICC timing
//X -- 64/fc + pause(32/fc) + 32/fc
//Y -- 128/fc
//Z -- pause(32/fc) + 96/fc
//logic 1 -- X
//logic 0 -- Y/Z instead of Y
//SOF -- Z
//EOF -- logic 0 + Y
*/
/* ###################################### */
/*Call this function after X_NFCFiledOn();*/
/*Delay time = u16timer * 2.36us          */
/* ###################################### */
extern void RF14443A_Carrier_On_Delay(uint16_t u16timer); //unit -- 32/fc

/* ######################################### */
/* transmit data                             */
/* uint8_t *buf: transmit data buffer        */
/* uint8_t *par: parity bit - 0 or 1         */
/* uint8_t parflag: 1 - transmit par;0 - dont transmit par*/
/* uint16_t len: length of transmit data     */
/* uint8_t TxLastBits: 0 - 8bits;1:7 - 1-7bits*/
/* ######################################### */
extern void __not_in_flash_func(RF14443A_Reader_SendData)(uint8_t *buf, uint8_t *par, uint8_t parFlag, uint16_t len, uint8_t TxLastBits);
/*
///////////////////////////////////////////////////////
//PS-20220828
//PICC --> PCD delay = (n*128-204)/fc,the MIN is 70us(n=9)
//n =9,REQA/WAKE-UP/ANTICOLLISION/SELECT
//n>=9,other command
//last data bit is "logic 1" -- FDT=(n*128+84)/fc -- delay=FDT-256/fc-32/fc 91.15us
//last data bit is "logic 0" -- FDT=(n*128+20)/fc -- delay=FDT-(256/fc-32/fc) 86.43us
//ex: cmd-0x52 FDT=91.15us
//    cmd-0x93 0x20 FDT=86.43us
///////////////////////////////////////////////////////
*/

/* ######################################### */
/* return length of receive data             */
/* uint8_t *recv_buf: receive data buffer    */
/* uint8_t nbit: 9 - include parity bit and ignore the bit;8 - parity bit as data;4 - 4bits ack*/
/* uint8_t encryption: 0 - unencryted;1 - encryted; Mifare mode*/
/* uint16_t u16FDT: FDT Max = u16FDT * 9.44us*/
/* ######################################### */
#define RF14A_RECV_TIMEOUT      (-1)
#define RF14A_RECV_PARITY_ERR   (-3)
#define RF14A_RECV_NONE          (0)
extern int16_t __not_in_flash_func(RF14443A_Reader_RecvData)(uint8_t *recv_buf, uint8_t nbit, uint8_t encryption, uint16_t u16FDT);

/* ######################################### */
/* PIO: receive tag's data in reader mode    */
/* ######################################### */
//capture rising edge
extern void X_PIOCapture1Init();
extern void X_PIOCapture1Deinit();
/////////////////////////////////////////////////

/* ################tag mode#######################
    PS-20220828
    PICC --> PCD timing,fs=fc/16
    D -- 4/fs + 64/fc
    E -- 64/fc + 4/fs
    F -- 128/fc
    logic 1 -- D
    logic 0 -- E
    SOF -- D
    EOF -- F
    PS-20230820 test wave
    demodulate PCD --> PICC data
    low after pause about 500ns
    pause time is about 2.1us(actually,its 2.36us)*/
/////////////////////////////////////////////////////

/* ######################################### */
/* response 4bit ack in tag mode             */
/* ######################################### */
extern void __not_in_flash_func(X_14443A_Tag_Send4bit)(uint8_t data4bit);

/* ######################################### */
/* response data in tag mode                 */
/* uint8_t *resp: response data buffer       */
/* uint16_t len: length of response data     */
/* uint8_t parflag: 1 - transmit par;0 - dont transmit par*/
/* uint8_t *par: parity bit - 0 or 1         */
/* ######################################### */
extern void __not_in_flash_func(X_14443A_Tag_SendData)(uint8_t *resp, uint16_t len, uint8_t parFlag, uint8_t *par);

/* ######################################### */
/* callback function in tag mode             */
/* ######################################### */
//X_ISO14A_Tag_Emul call back function
extern int __not_in_flash_func(X_ISO14A_Tag_Emul)(uint16_t len);

/* ######################################### */
/* PIO: receive reader's command in tag mode */
/* ######################################### */
//capture falling edge and filter inter-pulse
extern void X_PIOCapture0filterInit();
extern void X_PIOCapture0filterDeinit();


#endif
```

## libNFC/ISO14B/X\_14443B\_HW\.h

```c
#ifndef     __X_14443BHW_H__
#define     __X_14443BHW_H__

#include <stdint.h>
#include <stdio.h>

#include "pico/stdlib.h"

///////////////////////////////////////////////////////
//PS-20220918
//PCD --> PICC timing
//etu -- 128/Fc
//logic 0 -- 1 etu low
//logic 1 -- 1 etu high
//START -- 1 logic 0
//CHAR -- LSB first
//STOP -- 1 logic 1
//EGT -- 0-57us
//EOF -- 10.5 logic 0
///////////////////////////////////////////////////////

/* ###################################### */
/*Call this function after X_NFCFiledOn();*/
/*Delay time = u16timer * 9.44us          */
/* ###################################### */
extern void RF14443B_Carrier_On_Delay(uint16_t u16timer); //unit -- 128/fc

/* ###################################### */
/* return ISO14443B crc16                 */
/* high byte transmit first               */
/* ###################################### */
extern uint16_t crc16_B(uint8_t *data, uint16_t len);

/* ###################################### */
/* return true or false                   */
/* ###################################### */
extern bool HasValidCrcB(uint8_t *receivedCmd, uint16_t receivedCmd_len);

/* ###################################### */
/* append crc to the end of data          */
/* ###################################### */
extern void AppendCrcB(uint8_t *data, uint16_t len);

/* ######################################### */
/* transmit clear txt data                   */
/* uint8_t *buf: transmit data buffer        */
/* uint16_t len: length of transmit data     */
/* uint8_t egt: egt euts "1" after stop bit  */
/* ######################################### */
extern void __not_in_flash_func(RF14443B_Reader_SendData)(uint8_t *buf, uint16_t len, uint8_t egt);  //egt<=20

/* ######################################### */
/* receive clear txt data in FWI             */
/* return length of receive data             */
/* uint8_t *recv_buf: receive data buffer    */
/* uint8_t u8FWI: TR0 - (256/fs)*2^FWI(0-14) */
/* ######################################### */
extern int16_t __not_in_flash_func(RF14443B_Reader_RecvData)(uint8_t *recv_buf, uint8_t u8FWI);

/* ######################################### */
/* PIO: receive tag's data in reader mode    */
/* ######################################### */
extern void X_PIOCapture14bInit();
extern void X_PIOCapture14bDeinit();
////////////////////////////////////////////////////////////////////////////

//PS-20220918
//PICC --> PCD delay
//EGT -- 0-19us 1.5 etu  //PS-20220925
//SOF - 10.5bit"0" 2.5bit"1"  //PS-20220925
//PS-20221001
// ISO/IEC 14443-2, 9.2.5.
//TR0 -- >= 64/Fs <=256/Fs(ATQB 302us) (256/fs)*2^FWI(the others)
//TR1 -- >= 80/Fs <=200/Fs
///////////////////////////////////////////////////////
//////////////////////////////////////////
//Tag mode////////////////////////////////
/* ######################################### */
/* response data in tag mode                 */
/* uint8_t *resp: response data buffer       */
/* uint16_t len: length of response data     */
/* uint32_t tr0: undefined                   */
/* uint32_t tr1: 80~200                      */
/* uint8_t egt: egt euts "1" after stop bit  */
/* ######################################### */
extern void __not_in_flash_func(X_14443B_Tag_SendData)(uint8_t *resp, uint16_t len, uint32_t tr0, uint8_t tr1, uint8_t egt);//tr0--fs tr1--fs egt-etu

/* ######################################### */
/* callback function in tag mode             */
/* ######################################### */
//X_ISO14B_Tag_Emul call back function
extern int __not_in_flash_func(X_ISO14B_Tag_Emul)(uint16_t len);

/* ######################################### */
/* PIO: receive reader's command in tag mode */
/* ######################################### */
//capture falling edge and filter inter-pulse
extern void X_PIOCapture14bfilterInit();
extern void X_PIOCapture14bfilterDeinit();
#endif
```

## libNFC/ISO15/X\_15693\_HW\.h

```c
#ifndef     __X_15693_H__
#define     __X_15693_H__

#include <stdint.h>
#include <stdio.h>

#include "pico/stdlib.h"

//timing for 15693
///////////////////////////////////////////////////////
//PS-20221023
//VCD --> VICC timing 100%-ASK 1/4
//pause -- 128/Fc no carrier
//00 -- 128/Fc + pause + 128*6/Fc
//01 -- 128*3/Fc + pause + 128*4/Fc
//10 -- 128*5/Fc + pause + 128*2/Fc
//11 -- 128*7/Fc + pause
//SOF -- pause + 128*3/Fc + 128/Fc + pause + 128*2/Fc
//EOF -- 128*2/Fc + pause + 128/Fc
///////////////////////////////////////////////////////

///////////////////////////////////////////////////////
//PS-20221023
//VICC --> VCD timing, only one sub carrier, fs=Fc/32, 26.48kbps(Fc/512)
//logic 0 -- 8fs + 8nc
//logic 1 -- 8nc + 8fs
//SOF -- 24nc + 24fs + 8nc + 8fs
//EOF -- 8fs + 8nc + 24fs + 24nc
//////////////////////////////////////////////////////

///////////////////////////////////////////////////////
//PS-20221023
//VICC --> VCD delay from EOF rising edge
//T1--wait for transmite: nomal -- 4352/Fc, min -- 4320/Fc, max -- 4384/Fc
//4352/13.56=320.94us, Ti--322.08 NXP--320.58

//first VCD --> VICC
//carrier on > 1ms
//wait for next VCD --> VICC
//4192/Fc
//turn on carrier delay 9.44us*u16timer
extern void RF15693_Carrier_On_Delay(uint16_t u16timer); //unit -- 128/fc

/* ###################################### */
/* return ISO15693 crc16                  */
/* low byte transmit first                */
/* ###################################### */
extern uint16_t crc16_V(uint8_t *data, uint16_t len);
extern bool HasValidCrcV(uint8_t *receivedCmd, uint16_t receivedCmd_len);
extern void AppendCrcV(uint8_t *data, uint16_t len);

//reader mode:  capture rising edge
extern void X_PIOCapture15Init();
extern void X_PIOCapture15Deinit();
//mode: 0-ASK 1-FSK
extern void __not_in_flash_func(RF15693_Reader_SendData)(uint8_t *buf, uint16_t len, uint8_t mode);
extern int16_t __not_in_flash_func(RF15693_Reader_RecvData)(uint8_t *recv_buf, uint8_t mode);
extern void __not_in_flash_func(RF15693_Reader_SendEOF)();


//tag mode: capture falling edge(filter 3us)
extern void X_PIOCapture15filterInit();
extern void X_PIOCapture15filterDeinit();
extern void __not_in_flash_func(X_15693_Tag_SendData)(uint8_t *resp, uint16_t len, uint8_t mode);


//X_15693_Tag_Emul call back function, task time < 188.8us
extern int __not_in_flash_func(X_15693_Tag_Emul)(uint16_t len);  //recv buffer: uint8_t u8CmdVcd2Vicc[256];

#endif
```

## libNFC/Felica/X\_FELICA\_HW\.h

```c
#ifndef     __X_FELICA_H__
#define     __X_FELICA_H__

#include <stdint.h>
#include <stdio.h>

#include "pico/stdlib.h"

///////////////////////////////////////////////////////
//PS-20250131
//PCD --> PICC timing
//etu -- 128/(D*Fc)
//	D=2 Bit-rate=Fc/64=212kbps
//	D=4 Bit-rate=Fc/32=424kbps
//ASK 10%
//logic 1: H(unmodulated state) + L
//logic 0: L + H(unmodulated state)


//PICC -- > PCD timing, No subcarrier
//logic 1: H(unmodulated state) + L
//logic 0: L + H(unmodulated state)
//Character transmission format: MSB
//Frame format:
//	Preamble(6 bytes): 00-00-00-00-00-00
//	Sync code(2 bytes): B2-4D
//	LEN(1 byte): 
//	Data field(0-254 bytes): length is (LEN - 1)
//	EDC: CRC(2 bytes), Error detection code -- (LEN + Data field)
//the first time slot shall start after 512*64/Fc=2.417ms
//time slot duration: 256*64/Fc=1.208ms

//PS-20250201
//Hardware: Pico-NFC-V1.0 20241210
//PICC -- > PCD code
//logic 0: ----____ or ________
//logic 1: ____----
//Preamble: 46-47 '0's, not 48
///////////////////////////////////////////////////////


/* ###################################### */
/*Call this function after X_NFCFiledOn();*/
/*Delay time = u16timer * 2.36us          */
/* ###################################### */
extern void RFFelica_Carrier_On_Delay(uint16_t u16timer); //unit -- 32/fc

/* ###################################### */
/* return Felica crc16                    */
/* high byte transmit first                */
/* ###################################### */
extern uint16_t crc16_F(uint8_t *data, uint16_t len);

/* ###################################### */
/* return true or false                   */
/* ###################################### */
extern bool HasValidCrcF(uint8_t *receivedCmd, uint16_t receivedCmd_len);

/* ###################################### */
/* append crc to the end of data          */
/* ###################################### */
extern void AppendCrcF(uint8_t *data, uint16_t len);

/* ######################################### */
/* transmit clear txt data, u8speed: 0-212K  */
/* uint8_t *buf: transmit data buffer        */
/* uint16_t len: length of transmit data     */
/* ######################################### */
extern void __not_in_flash_func(FELICA_Reader_SendData)(uint8_t *buf, uint16_t len, uint8_t u8speed);

/* ######################################### */
/* return length of receive data             */
/* receive clear txt data, u8speed: 0-212K   */
/* uint8_t *recv_buf: receive data buffer    */
/* uint8_t u8Slot: time slot                 */
/* ######################################### */
extern int16_t __not_in_flash_func(FELICA_Reader_RecvData)(uint8_t *recv_buf, uint8_t u8Slot, uint8_t u8speed);

/* ######################################### */
/* PIO: receive tag's data in reader mode    */
/* ######################################### */
//capture rising edge
extern void X_PIOFelica1Init();
extern void X_PIOFelica1Deinit();

extern void X_PIOFelica10Init();
extern void X_PIOFelica10Deinit();

#endif
```

## 2-NFC/ISO14A/X\_ISO14A\_App.h

```c
#ifndef     __X_ISO14A_APP_H__
#define     __X_ISO14A_APP_H__

extern uint8_t gISO14A_Atqa[2];
extern uint8_t gISO14A_Sak;
extern uint8_t gISO14A_Uid[10];  //include bbc //10-7B [5];//-4B

uint16_t X_RF14443A_Reqa(void);  //return atqa--b[16:1]
uint8_t X_RF14443A_AntiCL1(uint8_t *CardNo);
uint8_t X_RF14443A_AntiCL2(uint8_t *CardNo);
uint8_t X_RF14443A_SelCL1(uint8_t *CardNo);
uint8_t X_RF14443A_SelCL2(uint8_t *CardNo);
uint8_t X_RF14443A_GetUid(uint8_t *CardNo);

#endif
```

## 2-NFC/ISO14A/Ntag/X\_Ntag.h

```c
#ifndef     __X_NTAG_H__
#define     __X_NTAG_H__

//#define NTAG_DATA_FROM_CONST  //const uint8_t Ntag215_Data[], else from flash

int __not_in_flash_func(Ntag_Emul)(uint16_t len);

#endif
```

## 2-NFC/ISO14B/X\_ISO14B\_App.h

```c
#ifndef     __X_ISO14B_APP_H__
#define     __X_ISO14B_APP_H__


int16_t X_RF14443B_reqb();
int16_t X_RF14443B_attrib();
int16_t X_RF14443B_getuid();

#endif
```

## 2-NFC/ISO15/X\_ISO15\_App.h

```c
#ifndef     __X_ISO15_APP_H__
#define     __X_ISO15_APP_H__

//#define ISO15TAG_DATA_FROM_CONST  //const uint8_t ISO15_Sim_Data[], else from flash

int16_t X_15693_getuid(uint8_t *uid15693, uint8_t mode);
int16_t X_15693_readsingleblock(uint8_t *uid15693, uint8_t block, uint8_t *data15693, uint8_t mode);
int16_t X_15693_writesingleblock(uint8_t *uid15693, uint8_t block, uint8_t *data15693, uint8_t mode);
int16_t X_15693_readmultiblock(uint8_t *uid15693, uint8_t block, uint8_t number, uint8_t *data15693, uint8_t mode);
int16_t X_15693_magicuid(uint8_t *uid15693, uint8_t mode);

/**
 * @brief Get ISO15693 information from uid15693
 * @param uid15693    ISO15693 tag UID
 * @param type          Tag type
 * @param blocksize     Block size
 * @param blockcount    Block count
 **/
void X_15693_info(uint8_t *uid15693, uint8_t *type, uint8_t *blocksize, uint8_t *blockcount);
extern 	uint8_t u8ISO15BlockCount;
extern 	uint8_t u8ISO15BlockSize;
extern 	uint8_t u8ISO15Type;

extern uint8_t gISO15_Uid[8];

///////////////////////////////////////////////////////////////////////////////////////////////
// REQUEST FLAGS
#define ISO15_REQ_SUBCARRIER_SINGLE      0x00 // Tag should respond using one subcarrier (ASK)
#define ISO15_REQ_SUBCARRIER_TWO         0x01 // Tag should respond using two subcarriers (FSK)
#define ISO15_REQ_DATARATE_LOW           0x00 // Tag should respond using low data rate
#define ISO15_REQ_DATARATE_HIGH          0x02 // Tag should respond using high data rate
#define ISO15_REQ_NONINVENTORY           0x00
#define ISO15_REQ_INVENTORY              0x04 // This is an inventory request - see inventory flags
#define ISO15_REQ_PROTOCOL_NONEXT        0x00
#define ISO15_REQ_PROTOCOL_EXT           0x08 // RFU

// REQUEST FLAGS when INVENTORY is not set
#define ISO15_REQ_SELECT                 0x10 // only selected cards response
#define ISO15_REQ_ADDRESS                0x20 // this req contains an address
#define ISO15_REQ_OPTION                 0x40 // Command specific option selector

//REQUEST FLAGS when INVENTORY is set
#define ISO15_REQINV_AFI                 0x10 // AFI Field is present
#define ISO15_REQINV_SLOT1               0x20 // 1 Slot
#define ISO15_REQINV_SLOT16              0x00 // 16 Slots
#define ISO15_REQINV_OPTION              0x40 // Command specific option selector

//RESPONSE FLAGS
#define ISO15_RES_ERROR                  0x01
#define ISO15_RES_EXT                    0x08 // Protocol Extension

// RESPONSE ERROR CODES
#define ISO15_NOERROR                    0x00
#define ISO15_ERROR_CMD_NOT_SUP          0x01 // Command not supported
#define ISO15_ERROR_CMD_NOT_REC          0x02 // Command not recognized (eg. parameter error)
#define ISO15_ERROR_CMD_OPTION           0x03 // Command option not supported
#define ISO15_ERROR_GENERIC              0x0F // No additional Info about this error
#define ISO15_ERROR_BLOCK_UNAVAILABLE    0x10
#define ISO15_ERROR_BLOCK_LOCKED_ALREADY 0x11 // cannot lock again
#define ISO15_ERROR_BLOCK_LOCKED         0x12 // cannot be changed
#define ISO15_ERROR_BLOCK_WRITE          0x13 // Writing was unsuccessful
#define ISO15_ERROR_BLOCL_WRITELOCK      0x14 // Locking was unsuccessful
///////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////
//First byte is 26
#define ISO15693_INVENTORY     0x01
#define ISO15693_STAYQUIET     0x02
//First byte is 02
#define ISO15693_READBLOCK                   0x20
#define ISO15693_WRITEBLOCK                  0x21
#define ISO15693_LOCKBLOCK                   0x22
#define ISO15693_READ_MULTI_BLOCK            0x23
#define ISO15693_WRITE_MULTI_BLOCK           0x24
#define ISO15693_SELECT                      0x25
#define ISO15693_RESET_TO_READY              0x26
#define ISO15693_WRITE_AFI                   0x27
#define ISO15693_LOCK_AFI                    0x28
#define ISO15693_WRITE_DSFID                 0x29
#define ISO15693_LOCK_DSFID                  0x2A
#define ISO15693_GET_SYSTEM_INFO             0x2B
#define ISO15693_READ_MULTI_SECSTATUS        0x2C
// NXP/Philips custom commands
#define ISO15693_INVENTORY_READ              0xA0
#define ISO15693_FAST_INVENTORY_READ         0xA1
#define ISO15693_SET_EAS                     0xA2
#define ISO15693_RESET_EAS                   0xA3
#define ISO15693_LOCK_EAS                    0xA4
#define ISO15693_EAS_ALARM                   0xA5
#define ISO15693_PASSWORD_PROTECT_EAS        0xA6
#define ISO15693_WRITE_EAS_ID                0xA7
#define ISO15693_READ_EPC                    0xA8
#define ISO15693_GET_NXP_SYSTEM_INFO         0xAB
#define ISO15693_INVENTORY_PAGE_READ         0xB0
#define ISO15693_FAST_INVENTORY_PAGE_READ    0xB1
#define ISO15693_GET_RANDOM_NUMBER           0xB2
#define ISO15693_SET_PASSWORD                0xB3
#define ISO15693_WRITE_PASSWORD              0xB4
#define ISO15693_LOCK_PASSWORD               0xB5
#define ISO15693_PROTECT_PAGE                0xB6
#define ISO15693_LOCK_PAGE_PROTECTION        0xB7
#define ISO15693_GET_MULTI_BLOCK_PROTECTION  0xB8
#define ISO15693_DESTROY                     0xB9
#define ISO15693_ENABLE_PRIVACY              0xBA
#define ISO15693_64BIT_PASSWORD_PROTECTION   0xBB
#define ISO15693_STAYQUIET_PERSISTENT        0xBC
#define ISO15693_READ_SIGNATURE              0xBD
////////////////////////////////////////////////////////////////////////////////////////////////

#endif
```

## 2-NFC/Felica/X\_FELICA\_App.h

```c
#ifndef     __X_FELICA_APP_H__
#define     __X_FELICA_APP_H__

int16_t X_Felica_wup();  //
int16_t X_Felica_req();

#endif
```

## 1-USB/X\_FAT12.h

```c
#ifndef     __X_FAT12_H__
#define     __X_FAT12_H__

#include <ff.h>

void test_and_init_filesystem(void);

void get_disk_space(const char* path, uint32_t* total_bytes, uint32_t* free_bytes);
FRESULT read_file_part(const char* path, uint32_t offset, uint32_t len, void* buffer, uint32_t* file_size_out);
FRESULT write_file_part(const char* path, uint32_t offset, uint32_t len, const void* data);
FRESULT create_file(const char* path, const void* data, uint32_t len);

//ISO14A///////////////////////////////////////////////////////////////
#define FAT12_FileName_MF1_4B1K     "ISO14A/MF1_4B1K.BIN"
#define FAT12_FileName_MF1_7B1K     "ISO14A/MF1_7B1K.BIN"
#define FAT12_FileName_MF1_4B4K     "ISO14A/MF1_4B4K.BIN"
#define FAT12_FileName_MF1_7B4K     "ISO14A/MF1_7B4K.BIN"
#define FAT12_FileName_SNIFFOFF     "ISO14A/SNIFFOFF.BIN"
//#define FAT12_FileName_SNIFFON      "ISO14A/SNIFFON.BIN"
    #define FAT12_FileName_MF1_4B1K_NAME     "ISO14A/MF1_4B1K_NAME.TXT"

#define FAT12_FileName_NTAG21X      "ISO14A/NTAG21X.BIN"
///////////////////////////////////////////////////////////////////////

//ISO14B///////////////////////////////////////////////////////////////
#define FAT12_FileName_CHINA_ID     "ISO14B/CHINA_ID.BIN"
///////////////////////////////////////////////////////////////////////

//ISO15////////////////////////////////////////////////////////////////
#define FAT12_FileName_ISO15        "ISO15/ISO15.BIN"

//Amiibo///////////////////////////////////////////////////////////////
#define FAT12_FileName_AMIIBO_KEY           "Amiibo/key_retail.bin"
#define FAT12_FileName_AMIIBO_DATA          "Amiibo/all.bin"
#define FAT12_FileName_AMIIBO_DATA_NAME     "Amiibo/allname.txt"
///////////////////////////////////////////////////////////////////////

#endif
```

## 1-USB/X\_CDC.h

```c
// SPDX-License-Identifier: MIT
/*
 * Copyright (c) 2024 Thomas Grech <thomas@grechtech.co.uk>
 */

#if !defined(_USB_COMM_H_)
#define _USB_COMM_H_

#include <stdint.h>

extern uint8_t u8CDCTxBuf[];
extern uint8_t u8CDCRxBuf[];

// UART RX to USB CDC
extern void cdc_task_read(void); 
// USB CDC to UART TX
extern void cdc_task_write(void); 

#endif /* _USB_COMM_H_ */
```

## 1-USB/flash.h

```c
#ifndef _FLASH_H_
#define _FLASH_H_

#include <ctype.h>
#include <math.h>
#include <hardware/flash.h>
#include <hardware/sync.h>
#include <pico/stdlib.h>
#include <stdio.h>
#include <string.h>

#include "libNFC/X_Core0.h"

void flash_fat_initialize(void);
bool flash_fat_read(int block, uint8_t *buffer);
bool flash_fat_write(int block, uint8_t *buffer);

#endif
```
