Files
portable_modules/nfc/vendor/dp1312ea/Felica.c
2026-07-20 10:48:38 +08:00

200 lines
6.0 KiB
C

/***********************************************************************************************
*FeliCa操作函数文件
***********************************************************************************************/
#include <stdio.h>
#include <string.h>
#include "DP1312EA.h"
#include "DP1312EA_Config.h"
#include "Felica.h"
#include "nfc_platform.h"
void ReadmoniF(void)
{
s8 status;
u8 i;
u8 IDm[10],PMm[8];
DP1312EA_PcdConfigISOTypeF();
nfc_platform_sleep_ms(10);
status = DP1312EA_PcdRequestF(IDm,PMm);
#ifdef UART_DEBUG
nfc_platform_log("ATQF: %d_",status);
if(status==MI_OK)
{
for(i=0;i<10;i++)
nfc_platform_log(" %02X ",IDm[i]);
nfc_platform_log("_");
for(i=0;i<8;i++)
nfc_platform_log(" %02X",PMm[i]);
}
nfc_platform_log("\n");
#endif
if(status!=MI_OK) return;
}
/***********************************************************************************************
*配置为FeliCa卡
***********************************************************************************************/
void DP1312EA_PcdConfigISOTypeF(void)
{
DP1312EA_ClearBitMask(Status2Reg,0x08);//08h //MFCrypto1On
DP1312EA_WriteRawRC(WaterLevelReg,0x10); //0bh,
DP1312EA_WriteRawRC(ControlReg,0x10);//0ch, //Initiator
DP1312EA_WriteRawRC(BitFramingReg,0); //0dh,
DP1312EA_WriteRawRC(ModeReg,0x00);//11h, *00*
DP1312EA_WriteRawRC(TxModeReg,0x92); //12h, 212k
DP1312EA_WriteRawRC(RxModeReg,0x92); //13h, 212k
//DP1312EA_WriteRawRC(TxModeReg,0xa2); //12h 424k
//DP1312EA_WriteRawRC(RxModeReg,0xa2);//13h 424k
DP1312EA_WriteRawRC(TxControlReg,0x80);//14h,
DP1312EA_WriteRawRC(TxAutoReg,0x00); //15h,
DP1312EA_WriteRawRC(TxSelReg,0x10);//16h
DP1312EA_WriteRawRC(RxSelReg,0x83);//17h
DP1312EA_WriteRawRC(RxThresholdReg,0x55); //18h
DP1312EA_WriteRawRC(DemodReg,0x6D); //19h
DP1312EA_WriteRawRC(TypeBReg,0); //1eh,
DP1312EA_WriteRawRC(GsNOffReg,0xF2); //23h
DP1312EA_WriteRawRC(ModWidthReg,0x26); //24h,
DP1312EA_WriteRawRC(RFCfgReg,0x78); //26h
DP1312EA_WriteRawRC(GsNOnReg,0xFF); //27h
DP1312EA_WriteRawRC(CWGsPReg,0x3f); //28h
DP1312EA_WriteRawRC(ModGsPReg,0x12); //29h
DP1312EA_WriteRawRC(TModeReg,0x8D); //2ah
DP1312EA_WriteRawRC(TPrescalerReg,0x00); //2bh
DP1312EA_FieldOff();
nfc_platform_sleep_ms(5);
DP1312EA_FieldOn();
}
s8 DP1312EA_PcdRequestF(u8 *pIDm,u8 *pPMm)
{
s8 status;
struct TranSciveBuffer MfComData,*pi = &MfComData;
DP1312EA_WriteRawRC(TPrescalerReg,0x01); //2bh,
DP1312EA_WriteRawRC(TModeReg,0x80); //2ah,
DP1312EA_WriteRawRC(TReloadRegL,0xEC);//2dh,
DP1312EA_WriteRawRC(TReloadRegH,0x5C); //2ch,
MfComData.MfCommand = DP1312EA_TRANSCEIVE;
MfComData.MfLength =6;
MfComData.MfData[0] =0x06;
MfComData.MfData[1] =0;
MfComData.MfData[2] =0xFF;
MfComData.MfData[3] =0xFF;
MfComData.MfData[4] =0;
MfComData.MfData[5] =0;
// FLAG_0;
status = DP1312EA_PcdComTransceive(pi);
// FLAG_1;
if (status == MI_OK)
{
if(MfComData.MfLength == 0x90)
{
memcpy(pIDm, &MfComData.MfData[2], 8);
memcpy(pPMm, &MfComData.MfData[10], 8);
}
else
status = MI_VALERR;
}
return status;
}
s8 DP1312EA_PcdReadF(u8 *pIDm,u8 *pDat)
{
s8 status;
struct TranSciveBuffer MfComData,*pi= &MfComData;
MfComData.MfCommand = DP1312EA_TRANSCEIVE;
MfComData.MfLength = 16;
MfComData.MfData[0] = 0x10; //len
MfComData.MfData[1] = 0x06;
memcpy(&MfComData.MfData[2],pIDm, 8);
MfComData.MfData[10] = 1; //bNumServices
MfComData.MfData[11] = 0x0B; //pServiceList..
MfComData.MfData[12] = 0;
MfComData.MfData[13] = 1; //read how much number of block
MfComData.MfData[14] = 0x80; //pBlockList..
MfComData.MfData[15] = 0x01;
status = DP1312EA_PcdComTransceive(pi);
if (status == MI_OK)
{
if(MfComData.MfLength == 0xE8)
{
memcpy(pDat, &MfComData.MfData[13], 16);
}
else
status = MI_VALERR;
}
return status;
}
/***********************************************************************************************
*检测并读取FeliCa卡函数
***********************************************************************************************/
void DP1312EA_Felica(void)
{
s8 status;
u8 i;
u8 IDm[8],PMm[8],buf[16];
DP1312EA_Reset();
DP1312EA_PcdConfigISOTypeF();
nfc_platform_sleep_ms(10);
status = DP1312EA_PcdRequestF(IDm,PMm);
#ifdef UART_DEBUG
nfc_platform_log("ATQF: %d_",status);
if(status==MI_OK)
{
for(i=0;i<8;i++)
nfc_platform_log(" %02X ",IDm[i]);
nfc_platform_log("_");
for(i=0;i<8;i++)
nfc_platform_log(" %02X",PMm[i]);
}
nfc_platform_log("\n");
#endif
if(status!=MI_OK) return;
status = DP1312EA_PcdReadF(IDm,buf);
#ifdef UART_DEBUG
nfc_platform_log("Read: %d_",status);
if(status==MI_OK)
{
for(i=0;i<16;i++)
nfc_platform_log(" %02X",buf[i]);
}
nfc_platform_log("\n");
#endif
if(status!=MI_OK) return;
do
{
DP1312EA_FieldOff();
nfc_platform_sleep_ms(10);
DP1312EA_FieldOn();
//LED_1;
nfc_platform_sleep_ms(10);
status = DP1312EA_PcdRequestF(IDm,PMm);
if(status==MI_OK){
// LED_0;
}
else
break;
}while(status==MI_OK);
}
/***********************************************END*******************************************************/