mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-08 07:38:10 +00:00
NFC: trf7970a: Add RF technology specific guard times
When turning on the RF field, the driver must wait an RF-technology-specific amount of time (known as the guard time) before modulating the field. Currently, the driver waits 5 ms but that is too short for NFCF and too long for ISO/IEC 15693. Fix this by determining the guard time when the RF technology is set and delaying that amount of time when turning on the RF field. Signed-off-by: Mark A. Greer <mgreer@animalcreek.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
a08e54549e
commit
4e64eff837
1 changed files with 13 additions and 1 deletions
|
@ -134,6 +134,12 @@
|
||||||
#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 3
|
#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 3
|
||||||
#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 20
|
#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 20
|
||||||
|
|
||||||
|
/* Guard times for various RF technologies (in us) */
|
||||||
|
#define TRF7970A_GUARD_TIME_NFCA 5000
|
||||||
|
#define TRF7970A_GUARD_TIME_NFCB 5000
|
||||||
|
#define TRF7970A_GUARD_TIME_NFCF 20000
|
||||||
|
#define TRF7970A_GUARD_TIME_15693 1000
|
||||||
|
|
||||||
/* Quirks */
|
/* Quirks */
|
||||||
/* Erratum: When reading IRQ Status register on trf7970a, we must issue a
|
/* Erratum: When reading IRQ Status register on trf7970a, we must issue a
|
||||||
* read continuous command for IRQ Status and Collision Position registers.
|
* read continuous command for IRQ Status and Collision Position registers.
|
||||||
|
@ -351,6 +357,7 @@ struct trf7970a {
|
||||||
u8 iso_ctrl_tech;
|
u8 iso_ctrl_tech;
|
||||||
u8 modulator_sys_clk_ctrl;
|
u8 modulator_sys_clk_ctrl;
|
||||||
u8 special_fcn_reg1;
|
u8 special_fcn_reg1;
|
||||||
|
unsigned int guard_time;
|
||||||
int technology;
|
int technology;
|
||||||
int framing;
|
int framing;
|
||||||
u8 tx_cmd;
|
u8 tx_cmd;
|
||||||
|
@ -887,22 +894,27 @@ static int trf7970a_config_rf_tech(struct trf7970a *trf, int tech)
|
||||||
case NFC_DIGITAL_RF_TECH_106A:
|
case NFC_DIGITAL_RF_TECH_106A:
|
||||||
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
|
||||||
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
||||||
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
|
||||||
break;
|
break;
|
||||||
case NFC_DIGITAL_RF_TECH_106B:
|
case NFC_DIGITAL_RF_TECH_106B:
|
||||||
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
|
||||||
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
||||||
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
|
||||||
break;
|
break;
|
||||||
case NFC_DIGITAL_RF_TECH_212F:
|
case NFC_DIGITAL_RF_TECH_212F:
|
||||||
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
|
||||||
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
||||||
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
||||||
break;
|
break;
|
||||||
case NFC_DIGITAL_RF_TECH_424F:
|
case NFC_DIGITAL_RF_TECH_424F:
|
||||||
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
|
||||||
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
||||||
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
||||||
break;
|
break;
|
||||||
case NFC_DIGITAL_RF_TECH_ISO15693:
|
case NFC_DIGITAL_RF_TECH_ISO15693:
|
||||||
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
|
||||||
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
||||||
|
trf->guard_time = TRF7970A_GUARD_TIME_15693;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
|
dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
|
||||||
|
@ -971,7 +983,7 @@ static int trf7970a_config_framing(struct trf7970a *trf, int framing)
|
||||||
|
|
||||||
trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
|
trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
|
||||||
|
|
||||||
usleep_range(5000, 6000);
|
usleep_range(trf->guard_time, trf->guard_time + 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue