Convert CRLFs to LFs
This commit is contained in:
parent
6953cbea2c
commit
942faef582
@ -1,110 +1,110 @@
|
||||
|
||||
|
||||
#ifndef __NFC_CHIPS_RC522_INTERNAL_H__
|
||||
#define __NFC_CHIPS_RC522_INTERNAL_H__
|
||||
|
||||
#define RC522_FIFO_SIZE 64
|
||||
|
||||
#define RC522_REG_CommandReg 0x01
|
||||
#define RC522_REG_CommandReg_RcvOff (1 << 5)
|
||||
#define RC522_REG_CommandReg_PowerDown (1 << 4)
|
||||
|
||||
#define RC522_REG_ComlEnReg 0x02
|
||||
|
||||
#define RC522_REG_DivlEnReg 0x03
|
||||
|
||||
#define RC522_REG_ComIrqReg 0x04
|
||||
|
||||
#define RC522_REG_DivIrqReg 0x05
|
||||
|
||||
#define RC522_REG_ErrorReg 0x06
|
||||
|
||||
#define RC522_REG_Status1Reg 0x07
|
||||
|
||||
#define RC522_REG_Status2Reg 0x08
|
||||
#define RC522_REG_Status2Reg_MFCrypto1On (1 << 3)
|
||||
|
||||
#define RC522_REG_FIFODataReg 0x09
|
||||
|
||||
#define RC522_REG_FIFOLevelReg 0x0A
|
||||
|
||||
#define RC522_REG_WaterLevelReg 0x0B
|
||||
|
||||
#define RC522_REG_ControlReg 0x0C
|
||||
|
||||
#define RC522_REG_BitFramingReg 0x0D
|
||||
|
||||
#define RC522_REG_CollReg 0x0E
|
||||
|
||||
#define RC522_REG_ModeReg 0x11
|
||||
|
||||
#define RC522_REG_TxModeReg 0x12
|
||||
#define RC522_REG_TxModeReg_TxCRCEn (1 << 7)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_106k (0 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_212k (1 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_424k (2 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_847k (3 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_MASK (7 << 4)
|
||||
|
||||
#define RC522_REG_RxModeReg 0x13
|
||||
#define RC522_REG_RxModeReg_RxCRCEn (1 << 7)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_106k (0 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_212k (1 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_424k (2 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_847k (3 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_MASK (7 << 4)
|
||||
|
||||
#define RC522_REG_TxControlReg 0x14
|
||||
#define RC522_REG_TxControlReg_Tx2RFEn (1 << 1)
|
||||
#define RC522_REG_TxControlReg_Tx1RFEn (1 << 0)
|
||||
|
||||
#define RC522_REG_TxASKReg 0x15
|
||||
|
||||
#define RC522_REG_TxSelReg 0x16
|
||||
|
||||
#define RC522_REG_RxSelReg 0x17
|
||||
|
||||
#define RC522_REG_RxThresholdReg 0x18
|
||||
|
||||
#define RC522_REG_DemodReg 0x19
|
||||
|
||||
#define RC522_REG_MfTxReg 0x1C
|
||||
|
||||
#define RC522_REG_MfRxReg 0x1D
|
||||
#define RC522_REG_MfRxReg_ParityDisable (1 << 4)
|
||||
|
||||
#define RC522_REG_SerialSpeedReg 0x1F
|
||||
#define RC522_REG_CRCResultReg 0x21
|
||||
#define RC522_REG_ModWidthReg 0x24
|
||||
#define RC522_REG_RFCfgReg 0x26
|
||||
#define RC522_REG_GsNReg 0x27
|
||||
#define RC522_REG_CWGsPReg 0x28
|
||||
#define RC522_REG_ModGsPReg 0x29
|
||||
#define RC522_REG_TModeReg 0x2A
|
||||
#define RC522_REG_TPrescalerReg 0x2B
|
||||
#define RC522_REG_TReloadReg 0x2C
|
||||
#define RC522_REG_TCounterValReg 0x2E
|
||||
#define RC522_REG_TestSel1Reg 0x31
|
||||
#define RC522_REG_TestSel2Reg 0x32
|
||||
#define RC522_REG_TestPinEnReg 0x33
|
||||
#define RC522_REG_TestPinValueReg 0x34
|
||||
#define RC522_REG_TestBusReg 0x35
|
||||
#define RC522_REG_AutoTestReg 0x36
|
||||
#define RC522_REG_VersionReg 0x37
|
||||
#define RC522_REG_AnalogTestReg 0x38
|
||||
#define RC522_REG_TestDAC1Reg 0x39
|
||||
#define RC522_REG_TestDAC2Reg 0x3A
|
||||
#define RC522_REG_TestADCReg 0x3B
|
||||
|
||||
#define RC522_CMD_Idle 0x0
|
||||
#define RC522_CMD_Mem 0x1
|
||||
#define RC522_CMD_GenerateRandomId 0x2
|
||||
#define RC522_CMD_CalcCRC 0x3
|
||||
#define RC522_CMD_Transmit 0x4
|
||||
#define RC522_CMD_NoCmdChange 0x7
|
||||
#define RC522_CMD_Receive 0x8
|
||||
#define RC522_CMD_Transceive 0xC
|
||||
#define RC522_CMD_MFAuthent 0xE
|
||||
#define RC522_CMD_SoftReset 0xF
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __NFC_CHIPS_RC522_INTERNAL_H__
|
||||
#define __NFC_CHIPS_RC522_INTERNAL_H__
|
||||
|
||||
#define RC522_FIFO_SIZE 64
|
||||
|
||||
#define RC522_REG_CommandReg 0x01
|
||||
#define RC522_REG_CommandReg_RcvOff (1 << 5)
|
||||
#define RC522_REG_CommandReg_PowerDown (1 << 4)
|
||||
|
||||
#define RC522_REG_ComlEnReg 0x02
|
||||
|
||||
#define RC522_REG_DivlEnReg 0x03
|
||||
|
||||
#define RC522_REG_ComIrqReg 0x04
|
||||
|
||||
#define RC522_REG_DivIrqReg 0x05
|
||||
|
||||
#define RC522_REG_ErrorReg 0x06
|
||||
|
||||
#define RC522_REG_Status1Reg 0x07
|
||||
|
||||
#define RC522_REG_Status2Reg 0x08
|
||||
#define RC522_REG_Status2Reg_MFCrypto1On (1 << 3)
|
||||
|
||||
#define RC522_REG_FIFODataReg 0x09
|
||||
|
||||
#define RC522_REG_FIFOLevelReg 0x0A
|
||||
|
||||
#define RC522_REG_WaterLevelReg 0x0B
|
||||
|
||||
#define RC522_REG_ControlReg 0x0C
|
||||
|
||||
#define RC522_REG_BitFramingReg 0x0D
|
||||
|
||||
#define RC522_REG_CollReg 0x0E
|
||||
|
||||
#define RC522_REG_ModeReg 0x11
|
||||
|
||||
#define RC522_REG_TxModeReg 0x12
|
||||
#define RC522_REG_TxModeReg_TxCRCEn (1 << 7)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_106k (0 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_212k (1 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_424k (2 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_847k (3 << 4)
|
||||
#define RC522_REG_TxModeReg_TxSpeed_MASK (7 << 4)
|
||||
|
||||
#define RC522_REG_RxModeReg 0x13
|
||||
#define RC522_REG_RxModeReg_RxCRCEn (1 << 7)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_106k (0 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_212k (1 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_424k (2 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_847k (3 << 4)
|
||||
#define RC522_REG_RxModeReg_RxSpeed_MASK (7 << 4)
|
||||
|
||||
#define RC522_REG_TxControlReg 0x14
|
||||
#define RC522_REG_TxControlReg_Tx2RFEn (1 << 1)
|
||||
#define RC522_REG_TxControlReg_Tx1RFEn (1 << 0)
|
||||
|
||||
#define RC522_REG_TxASKReg 0x15
|
||||
|
||||
#define RC522_REG_TxSelReg 0x16
|
||||
|
||||
#define RC522_REG_RxSelReg 0x17
|
||||
|
||||
#define RC522_REG_RxThresholdReg 0x18
|
||||
|
||||
#define RC522_REG_DemodReg 0x19
|
||||
|
||||
#define RC522_REG_MfTxReg 0x1C
|
||||
|
||||
#define RC522_REG_MfRxReg 0x1D
|
||||
#define RC522_REG_MfRxReg_ParityDisable (1 << 4)
|
||||
|
||||
#define RC522_REG_SerialSpeedReg 0x1F
|
||||
#define RC522_REG_CRCResultReg 0x21
|
||||
#define RC522_REG_ModWidthReg 0x24
|
||||
#define RC522_REG_RFCfgReg 0x26
|
||||
#define RC522_REG_GsNReg 0x27
|
||||
#define RC522_REG_CWGsPReg 0x28
|
||||
#define RC522_REG_ModGsPReg 0x29
|
||||
#define RC522_REG_TModeReg 0x2A
|
||||
#define RC522_REG_TPrescalerReg 0x2B
|
||||
#define RC522_REG_TReloadReg 0x2C
|
||||
#define RC522_REG_TCounterValReg 0x2E
|
||||
#define RC522_REG_TestSel1Reg 0x31
|
||||
#define RC522_REG_TestSel2Reg 0x32
|
||||
#define RC522_REG_TestPinEnReg 0x33
|
||||
#define RC522_REG_TestPinValueReg 0x34
|
||||
#define RC522_REG_TestBusReg 0x35
|
||||
#define RC522_REG_AutoTestReg 0x36
|
||||
#define RC522_REG_VersionReg 0x37
|
||||
#define RC522_REG_AnalogTestReg 0x38
|
||||
#define RC522_REG_TestDAC1Reg 0x39
|
||||
#define RC522_REG_TestDAC2Reg 0x3A
|
||||
#define RC522_REG_TestADCReg 0x3B
|
||||
|
||||
#define RC522_CMD_Idle 0x0
|
||||
#define RC522_CMD_Mem 0x1
|
||||
#define RC522_CMD_GenerateRandomId 0x2
|
||||
#define RC522_CMD_CalcCRC 0x3
|
||||
#define RC522_CMD_Transmit 0x4
|
||||
#define RC522_CMD_NoCmdChange 0x7
|
||||
#define RC522_CMD_Receive 0x8
|
||||
#define RC522_CMD_Transceive 0xC
|
||||
#define RC522_CMD_MFAuthent 0xE
|
||||
#define RC522_CMD_SoftReset 0xF
|
||||
|
||||
#endif
|
||||
|
||||
@ -1,241 +1,241 @@
|
||||
/*-
|
||||
* Free/Libre Near Field Communication (NFC) library
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "rc522.h"
|
||||
#include "rc522-internal.h"
|
||||
|
||||
#include "nfc/nfc.h"
|
||||
#include "nfc-internal.h"
|
||||
|
||||
#define LOG_CATEGORY "libnfc.chip.rc522"
|
||||
#define LOG_GROUP NFC_LOG_GROUP_CHIP
|
||||
|
||||
#define RC522_TIMEOUT 5
|
||||
|
||||
const nfc_modulation_type rc522_initiator_modulation[] = { NMT_ISO14443A, 0 };
|
||||
const nfc_modulation_type rc522_target_modulation[] = { 0 };
|
||||
|
||||
const nfc_baud_rate rc522_iso14443a_supported_baud_rates[] = { NBR_847, NBR_424, NBR_212, NBR_106, 0 };
|
||||
|
||||
struct rc522_chip_data {
|
||||
const struct rc522_io * io;
|
||||
};
|
||||
|
||||
#define CHIP_DATA(x) ((struct rc522_chip_data *) (x)->chip_data)
|
||||
|
||||
int rc522_data_new(struct nfc_device * pnd, const struct rc522_io * io) {
|
||||
pnd->chip_data = malloc(sizeof(struct rc522_chip_data));
|
||||
if (!pnd->chip_data) {
|
||||
perror("malloc");
|
||||
return NFC_ESOFT;
|
||||
}
|
||||
|
||||
CHIP_DATA(pnd)->io = io;
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_read_reg(struct nfc_device * pnd, uint8_t reg) {
|
||||
uint8_t val;
|
||||
|
||||
int ret = CHIP_DATA(pnd)->io->read(pnd, reg, &val, 1);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int rc522_write_reg(struct nfc_device * pnd, uint8_t reg, uint8_t val, uint8_t mask) {
|
||||
if (mask != 0xFF) {
|
||||
int oldval = rc522_read_reg(pnd, reg);
|
||||
if (oldval < 0) {
|
||||
return oldval;
|
||||
}
|
||||
|
||||
val = (val & mask) | (oldval & ~mask);
|
||||
}
|
||||
|
||||
return CHIP_DATA(pnd)->io->write(pnd, reg, &val, 1);
|
||||
}
|
||||
|
||||
int rc522_set_baud_rate(struct nfc_device * pnd, nfc_baud_rate speed) {
|
||||
uint8_t txVal, rxVal;
|
||||
int ret;
|
||||
|
||||
switch (speed) {
|
||||
case NBR_106:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_106k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_106k;
|
||||
break;
|
||||
|
||||
case NBR_212:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_212k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_212k;
|
||||
break;
|
||||
|
||||
case NBR_424:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_424k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_424k;
|
||||
break;
|
||||
|
||||
case NBR_847:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_847k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_847k;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return
|
||||
rc522_write_reg(pnd, RC522_REG_TxModeReg, txVal, RC522_REG_TxModeReg_TxSpeed_MASK) ||
|
||||
rc522_write_reg(pnd, RC522_REG_RxModeReg, rxVal, RC522_REG_RxModeReg_RxSpeed_MASK);
|
||||
}
|
||||
|
||||
int rc522_initiator_select_passive_target_ext(struct nfc_device * pnd, const nfc_modulation nm, const uint8_t * pbtInitData, const size_t szInitData, nfc_target * pnt, int timeout)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (nm.nmt != NMT_ISO14443A) {
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
ret = rc522_set_baud_rate(pnd, nm.nbr);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// TODO
|
||||
return NFC_ENOTIMPL;
|
||||
}
|
||||
|
||||
int rc522_get_supported_modulation(struct nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type ** const supported_mt) {
|
||||
switch (mode) {
|
||||
case N_INITIATOR:
|
||||
*supported_mt = rc522_initiator_modulation;
|
||||
break;
|
||||
|
||||
case N_TARGET:
|
||||
*supported_mt = rc522_target_modulation;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_get_supported_baud_rate(struct nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type nmt, const nfc_baud_rate ** const supported_br) {
|
||||
switch (mode) {
|
||||
case N_INITIATOR:
|
||||
switch (nmt) {
|
||||
case NMT_ISO14443A:
|
||||
*supported_br = rc522_iso14443a_supported_baud_rates;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
break;
|
||||
|
||||
case N_TARGET:
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_set_property_bool(struct nfc_device * pnd, const nfc_property property, const bool enable) {
|
||||
int ret;
|
||||
|
||||
switch (property) {
|
||||
case NP_HANDLE_CRC:
|
||||
if (pnd->bCrc == enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
ret = rc522_write_reg(pnd, RC522_REG_TxModeReg, enable ? ~0 : 0, RC522_REG_TxModeReg_TxCRCEn) ||
|
||||
rc522_write_reg(pnd, RC522_REG_RxModeReg, enable ? ~0 : 0, RC522_REG_RxModeReg_RxCRCEn);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
pnd->bCrc = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_HANDLE_PARITY:
|
||||
if (pnd->bPar == enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
ret = rc522_write_reg(pnd, RC522_REG_MfRxReg, enable ? 0 : ~0, RC522_REG_MfRxReg_ParityDisable);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
pnd->bPar = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_EASY_FRAMING:
|
||||
pnd->bEasyFraming = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_ACTIVATE_FIELD:
|
||||
return rc522_write_reg(pnd, RC522_REG_TxControlReg, enable ? ~0 : 0, RC522_REG_TxControlReg_Tx2RFEn | RC522_REG_TxControlReg_Tx1RFEn);
|
||||
|
||||
case NP_ACTIVATE_CRYPTO1:
|
||||
return rc522_write_reg(pnd, RC522_REG_Status2Reg, enable ? ~0 : 0, RC522_REG_Status2Reg_MFCrypto1On);
|
||||
|
||||
case NP_FORCE_ISO14443_A:
|
||||
// ISO14443-A is the only mode supported by MFRC522
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_FORCE_SPEED_106:
|
||||
if (!enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
return rc522_set_baud_rate(pnd, NBR_106);
|
||||
|
||||
case NP_AUTO_ISO14443_4:
|
||||
case NP_ACCEPT_INVALID_FRAMES:
|
||||
case NP_INFINITE_SELECT:
|
||||
case NP_FORCE_ISO14443_B:
|
||||
case NP_TIMEOUT_COMMAND:
|
||||
case NP_TIMEOUT_ATR:
|
||||
case NP_TIMEOUT_COM:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
int rc522_set_property_int(struct nfc_device * pnd, const nfc_property property, const int value) {
|
||||
// TODO
|
||||
return NFC_ENOTIMPL;
|
||||
}
|
||||
|
||||
int rc522_idle(struct nfc_device * pnd) {
|
||||
// Set idle and disable RX demodulator to save energy
|
||||
return rc522_write_reg(pnd, RC522_REG_CommandReg, RC522_CMD_Idle | RC522_REG_CommandReg_PowerDown, 0xFF);
|
||||
}
|
||||
|
||||
/*-
|
||||
* Free/Libre Near Field Communication (NFC) library
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "rc522.h"
|
||||
#include "rc522-internal.h"
|
||||
|
||||
#include "nfc/nfc.h"
|
||||
#include "nfc-internal.h"
|
||||
|
||||
#define LOG_CATEGORY "libnfc.chip.rc522"
|
||||
#define LOG_GROUP NFC_LOG_GROUP_CHIP
|
||||
|
||||
#define RC522_TIMEOUT 5
|
||||
|
||||
const nfc_modulation_type rc522_initiator_modulation[] = { NMT_ISO14443A, 0 };
|
||||
const nfc_modulation_type rc522_target_modulation[] = { 0 };
|
||||
|
||||
const nfc_baud_rate rc522_iso14443a_supported_baud_rates[] = { NBR_847, NBR_424, NBR_212, NBR_106, 0 };
|
||||
|
||||
struct rc522_chip_data {
|
||||
const struct rc522_io * io;
|
||||
};
|
||||
|
||||
#define CHIP_DATA(x) ((struct rc522_chip_data *) (x)->chip_data)
|
||||
|
||||
int rc522_data_new(struct nfc_device * pnd, const struct rc522_io * io) {
|
||||
pnd->chip_data = malloc(sizeof(struct rc522_chip_data));
|
||||
if (!pnd->chip_data) {
|
||||
perror("malloc");
|
||||
return NFC_ESOFT;
|
||||
}
|
||||
|
||||
CHIP_DATA(pnd)->io = io;
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_read_reg(struct nfc_device * pnd, uint8_t reg) {
|
||||
uint8_t val;
|
||||
|
||||
int ret = CHIP_DATA(pnd)->io->read(pnd, reg, &val, 1);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
int rc522_write_reg(struct nfc_device * pnd, uint8_t reg, uint8_t val, uint8_t mask) {
|
||||
if (mask != 0xFF) {
|
||||
int oldval = rc522_read_reg(pnd, reg);
|
||||
if (oldval < 0) {
|
||||
return oldval;
|
||||
}
|
||||
|
||||
val = (val & mask) | (oldval & ~mask);
|
||||
}
|
||||
|
||||
return CHIP_DATA(pnd)->io->write(pnd, reg, &val, 1);
|
||||
}
|
||||
|
||||
int rc522_set_baud_rate(struct nfc_device * pnd, nfc_baud_rate speed) {
|
||||
uint8_t txVal, rxVal;
|
||||
int ret;
|
||||
|
||||
switch (speed) {
|
||||
case NBR_106:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_106k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_106k;
|
||||
break;
|
||||
|
||||
case NBR_212:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_212k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_212k;
|
||||
break;
|
||||
|
||||
case NBR_424:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_424k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_424k;
|
||||
break;
|
||||
|
||||
case NBR_847:
|
||||
txVal = RC522_REG_TxModeReg_TxSpeed_847k;
|
||||
rxVal = RC522_REG_RxModeReg_RxSpeed_847k;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return
|
||||
rc522_write_reg(pnd, RC522_REG_TxModeReg, txVal, RC522_REG_TxModeReg_TxSpeed_MASK) ||
|
||||
rc522_write_reg(pnd, RC522_REG_RxModeReg, rxVal, RC522_REG_RxModeReg_RxSpeed_MASK);
|
||||
}
|
||||
|
||||
int rc522_initiator_select_passive_target_ext(struct nfc_device * pnd, const nfc_modulation nm, const uint8_t * pbtInitData, const size_t szInitData, nfc_target * pnt, int timeout)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (nm.nmt != NMT_ISO14443A) {
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
ret = rc522_set_baud_rate(pnd, nm.nbr);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// TODO
|
||||
return NFC_ENOTIMPL;
|
||||
}
|
||||
|
||||
int rc522_get_supported_modulation(struct nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type ** const supported_mt) {
|
||||
switch (mode) {
|
||||
case N_INITIATOR:
|
||||
*supported_mt = rc522_initiator_modulation;
|
||||
break;
|
||||
|
||||
case N_TARGET:
|
||||
*supported_mt = rc522_target_modulation;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_get_supported_baud_rate(struct nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type nmt, const nfc_baud_rate ** const supported_br) {
|
||||
switch (mode) {
|
||||
case N_INITIATOR:
|
||||
switch (nmt) {
|
||||
case NMT_ISO14443A:
|
||||
*supported_br = rc522_iso14443a_supported_baud_rates;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
break;
|
||||
|
||||
case N_TARGET:
|
||||
default:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
int rc522_set_property_bool(struct nfc_device * pnd, const nfc_property property, const bool enable) {
|
||||
int ret;
|
||||
|
||||
switch (property) {
|
||||
case NP_HANDLE_CRC:
|
||||
if (pnd->bCrc == enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
ret = rc522_write_reg(pnd, RC522_REG_TxModeReg, enable ? ~0 : 0, RC522_REG_TxModeReg_TxCRCEn) ||
|
||||
rc522_write_reg(pnd, RC522_REG_RxModeReg, enable ? ~0 : 0, RC522_REG_RxModeReg_RxCRCEn);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
pnd->bCrc = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_HANDLE_PARITY:
|
||||
if (pnd->bPar == enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
ret = rc522_write_reg(pnd, RC522_REG_MfRxReg, enable ? 0 : ~0, RC522_REG_MfRxReg_ParityDisable);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
pnd->bPar = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_EASY_FRAMING:
|
||||
pnd->bEasyFraming = enable;
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_ACTIVATE_FIELD:
|
||||
return rc522_write_reg(pnd, RC522_REG_TxControlReg, enable ? ~0 : 0, RC522_REG_TxControlReg_Tx2RFEn | RC522_REG_TxControlReg_Tx1RFEn);
|
||||
|
||||
case NP_ACTIVATE_CRYPTO1:
|
||||
return rc522_write_reg(pnd, RC522_REG_Status2Reg, enable ? ~0 : 0, RC522_REG_Status2Reg_MFCrypto1On);
|
||||
|
||||
case NP_FORCE_ISO14443_A:
|
||||
// ISO14443-A is the only mode supported by MFRC522
|
||||
return NFC_SUCCESS;
|
||||
|
||||
case NP_FORCE_SPEED_106:
|
||||
if (!enable) {
|
||||
return NFC_SUCCESS;
|
||||
}
|
||||
|
||||
return rc522_set_baud_rate(pnd, NBR_106);
|
||||
|
||||
case NP_AUTO_ISO14443_4:
|
||||
case NP_ACCEPT_INVALID_FRAMES:
|
||||
case NP_INFINITE_SELECT:
|
||||
case NP_FORCE_ISO14443_B:
|
||||
case NP_TIMEOUT_COMMAND:
|
||||
case NP_TIMEOUT_ATR:
|
||||
case NP_TIMEOUT_COM:
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
return NFC_EINVARG;
|
||||
}
|
||||
|
||||
int rc522_set_property_int(struct nfc_device * pnd, const nfc_property property, const int value) {
|
||||
// TODO
|
||||
return NFC_ENOTIMPL;
|
||||
}
|
||||
|
||||
int rc522_idle(struct nfc_device * pnd) {
|
||||
// Set idle and disable RX demodulator to save energy
|
||||
return rc522_write_reg(pnd, RC522_REG_CommandReg, RC522_CMD_Idle | RC522_REG_CommandReg_PowerDown, 0xFF);
|
||||
}
|
||||
|
||||
|
||||
@ -1,35 +1,37 @@
|
||||
/*-
|
||||
* Free/Libre Near Field Communication (NFC) library
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __NFC_CHIPS_RC522_H__
|
||||
#define __NFC_CHIPS_RC522_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <nfc/nfc-types.h>
|
||||
|
||||
struct rc522_io {
|
||||
int (*read)(struct nfc_device * pnd, uint8_t reg, uint8_t * data, size_t size);
|
||||
int (*write)(struct nfc_device * pnd, uint8_t reg, const uint8_t * data, size_t size);
|
||||
};
|
||||
|
||||
int rc522_data_new(struct nfc_device * pnd, const struct rc522_io * io);
|
||||
int rc522_get_supported_modulation(nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type ** const supported_mt);
|
||||
int rc522_get_supported_baud_rate(nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type nmt, const nfc_baud_rate ** const supported_br);
|
||||
int rc522_set_property_bool(struct nfc_device * pnd, const nfc_property property, const bool enable);
|
||||
|
||||
#endif
|
||||
/*-
|
||||
* Free/Libre Near Field Communication (NFC) library
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __NFC_CHIPS_RC522_H__
|
||||
#define __NFC_CHIPS_RC522_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <nfc/nfc-types.h>
|
||||
|
||||
struct rc522_io {
|
||||
int (*read)(struct nfc_device * pnd, uint8_t reg, uint8_t * data, size_t size);
|
||||
int (*write)(struct nfc_device * pnd, uint8_t reg, const uint8_t * data, size_t size);
|
||||
};
|
||||
|
||||
int rc522_data_new(struct nfc_device * pnd, const struct rc522_io * io);
|
||||
int rc522_get_supported_modulation(nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type ** const supported_mt);
|
||||
int rc522_get_supported_baud_rate(nfc_device * pnd, const nfc_mode mode, const nfc_modulation_type nmt, const nfc_baud_rate ** const supported_br);
|
||||
int rc522_set_property_bool(struct nfc_device * pnd, const nfc_property property, const bool enable);
|
||||
int rc522_set_property_int(struct nfc_device * pnd, const nfc_property property, const int value);
|
||||
int rc522_idle(struct nfc_device * pnd);
|
||||
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user