From 78c40976c3921ea857a3b99478692bb9f76aaa2a Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Mon, 7 Jan 2019 21:19:45 -0500 Subject: [PATCH] log interrupts and recv'd data --- fido2/log.c | 2 +- fido2/log.h | 1 + targets/stm32l432/src/nfc.c | 207 +++++++++++++++++++++++++++--------- targets/stm32l432/src/nfc.h | 40 +++++++ 4 files changed, 201 insertions(+), 49 deletions(-) diff --git a/fido2/log.c b/fido2/log.c index 6161191..01514db 100644 --- a/fido2/log.c +++ b/fido2/log.c @@ -83,7 +83,7 @@ void LOG(uint32_t tag, const char * filename, int num, const char * fmt, ...) { if (tag & tagtable[i].tagn) { - if (tagtable[i].tag[0]) printf("[%s] ", tagtable[i].tag); + if (tagtable[i].tag[0] && !(tag & TAG_NO_TAG)) printf("[%s] ", tagtable[i].tag); i = 0; break; } diff --git a/fido2/log.h b/fido2/log.h index 1ef8850..9ba145a 100644 --- a/fido2/log.h +++ b/fido2/log.h @@ -59,6 +59,7 @@ typedef enum TAG_EXT = (1 << 17), TAG_NFC = (1 << 18), + TAG_NO_TAG = (1<<30), TAG_FILENO = (1<<31) } LOG_TAG; diff --git a/targets/stm32l432/src/nfc.c b/targets/stm32l432/src/nfc.c index 980367f..986810a 100644 --- a/targets/stm32l432/src/nfc.c +++ b/targets/stm32l432/src/nfc.c @@ -35,23 +35,23 @@ static void wait_for_rx() static void ams_print_device(AMS_DEVICE * dev) { printf1(TAG_NFC, "AMS_DEVICE:\r\n"); - printf1(TAG_NFC, " io_conf: %02x\r\n",dev->regs.io_conf); - printf1(TAG_NFC, " ic_conf0: %02x\r\n",dev->regs.ic_conf0); - printf1(TAG_NFC, " ic_conf1: %02x\r\n",dev->regs.ic_conf1); - printf1(TAG_NFC, " ic_conf2: %02x\r\n",dev->regs.ic_conf2); - printf1(TAG_NFC, " rfid_status: %02x\r\n",dev->regs.rfid_status); - printf1(TAG_NFC, " ic_status: %02x\r\n",dev->regs.ic_status); - printf1(TAG_NFC, " mask_int0: %02x\r\n",dev->regs.mask_int0); - printf1(TAG_NFC, " mask_int1: %02x\r\n",dev->regs.mask_int1); - printf1(TAG_NFC, " int0: %02x\r\n",dev->regs.int0); - printf1(TAG_NFC, " int1: %02x\r\n",dev->regs.int1); + printf1(TAG_NFC, " io_conf: %02x\r\n",dev->regs.io_conf); + printf1(TAG_NFC, " ic_conf0: %02x\r\n",dev->regs.ic_conf0); + printf1(TAG_NFC, " ic_conf1: %02x\r\n",dev->regs.ic_conf1); + printf1(TAG_NFC, " ic_conf2: %02x\r\n",dev->regs.ic_conf2); + printf1(TAG_NFC, " rfid_status: %02x\r\n",dev->regs.rfid_status); + printf1(TAG_NFC, " ic_status: %02x\r\n",dev->regs.ic_status); + printf1(TAG_NFC, " mask_int0: %02x\r\n",dev->regs.mask_int0); + printf1(TAG_NFC, " mask_int1: %02x\r\n",dev->regs.mask_int1); + printf1(TAG_NFC, " int0: %02x\r\n",dev->regs.int0); + printf1(TAG_NFC, " int1: %02x\r\n",dev->regs.int1); printf1(TAG_NFC, " buffer_status2: %02x\r\n",dev->regs.buffer_status2); printf1(TAG_NFC, " buffer_status1: %02x\r\n",dev->regs.buffer_status1); - printf1(TAG_NFC, " last_nfc_addr: %02x\r\n",dev->regs.last_nfc_addr); - printf1(TAG_NFC, " product_type: %02x\r\n",dev->regs.product_type); - printf1(TAG_NFC, " product_subtype: %02x\r\n",dev->regs.product_subtype); - printf1(TAG_NFC, " version_maj: %02x\r\n",dev->regs.version_maj); - printf1(TAG_NFC, " version_min: %02x\r\n",dev->regs.version_min); + printf1(TAG_NFC, " last_nfc_addr: %02x\r\n",dev->regs.last_nfc_addr); + printf1(TAG_NFC, " product_type: %02x\r\n",dev->regs.product_type); + printf1(TAG_NFC, " product_subtype:%02x\r\n",dev->regs.product_subtype); + printf1(TAG_NFC, " version_maj: %02x\r\n",dev->regs.version_maj); + printf1(TAG_NFC, " version_min: %02x\r\n",dev->regs.version_min); } static uint8_t send_recv(uint8_t b) @@ -110,7 +110,19 @@ void read_reg_block(AMS_DEVICE * dev) UNSELECT(); SELECT(); +} +void ams_read_buffer(uint8_t * data, int len) +{ + int i; + send_recv(0xa0); + while(len--) + { + *data++ = send_recv(0x00); + } + + UNSELECT(); + SELECT(); } void ams_write_command(uint8_t cmd) @@ -120,6 +132,87 @@ void ams_write_command(uint8_t cmd) SELECT(); } +const char * ams_get_state_string(uint8_t regval) +{ + if (regval & AMS_STATE_INVALID) + { + return "STATE_INVALID"; + } + switch (regval & AMS_STATE_MASK) + { + case AMS_STATE_OFF: + return "STATE_OFF"; + case AMS_STATE_SENSE: + return "STATE_SENSE"; + case AMS_STATE_RESOLUTION: + return "STATE_RESOLUTION"; + case AMS_STATE_RESOLUTION_L2: + return "STATE_RESOLUTION_L2"; + case AMS_STATE_SELECTED: + return "STATE_SELECTED"; + case AMS_STATE_SECTOR2: + return "STATE_SECTOR2"; + case AMS_STATE_SECTORX_2: + return "STATE_SECTORX_2"; + case AMS_STATE_SELECTEDX: + return "STATE_SELECTEDX"; + case AMS_STATE_SENSEX_L2: + return "STATE_SENSEX_L2"; + case AMS_STATE_SENSEX: + return "STATE_SENSEX"; + case AMS_STATE_SLEEP: + return "STATE_SLEEP"; + } + return "STATE_WRONG"; +} + +void ams_print_int0(uint8_t int0) +{ + printf1(TAG_NFC," "); + if (int0 & AMS_INT_XRF) + printf1(TAG_NFC|TAG_NO_TAG," XRF"); + if (int0 & AMS_INT_TXE) + printf1(TAG_NFC|TAG_NO_TAG," TXE"); + if (int0 & AMS_INT_RXE) + printf1(TAG_NFC|TAG_NO_TAG," RXE"); + if (int0 & AMS_INT_EER_RF) + printf1(TAG_NFC|TAG_NO_TAG," EER_RF"); + if (int0 & AMS_INT_EEW_RF) + printf1(TAG_NFC|TAG_NO_TAG," EEW_RF"); + if (int0 & AMS_INT_SLP) + printf1(TAG_NFC|TAG_NO_TAG," SLP"); + if (int0 & AMS_INT_WU_A) + printf1(TAG_NFC|TAG_NO_TAG," WU_A"); + if (int0 & AMS_INT_INIT) + printf1(TAG_NFC|TAG_NO_TAG," INIT"); + + printf1(TAG_NFC|TAG_NO_TAG,"\r\n"); +} + +void ams_print_int1(uint8_t int0) +{ + printf1(TAG_NFC," "); + if (int0 & AMS_INT_ACC_ERR) + printf1(TAG_NFC|TAG_NO_TAG," ACC_ERR"); + if (int0 & AMS_INT_EEAC_ERR) + printf1(TAG_NFC|TAG_NO_TAG," EEAC_ERR"); + if (int0 & AMS_INT_IO_EEWR) + printf1(TAG_NFC|TAG_NO_TAG," IO_EEWR"); + if (int0 & AMS_INT_BF_ERR) + printf1(TAG_NFC|TAG_NO_TAG," BF_ERR"); + if (int0 & AMS_INT_CRC_ERR) + printf1(TAG_NFC|TAG_NO_TAG," CRC_ERR"); + if (int0 & AMS_INT_PAR_ERR) + printf1(TAG_NFC|TAG_NO_TAG," PAR_ERR"); + if (int0 & AMS_INT_FRM_ERR) + printf1(TAG_NFC|TAG_NO_TAG," FRM_ERR"); + if (int0 & AMS_INT_RXS) + printf1(TAG_NFC|TAG_NO_TAG," RXS"); + + printf1(TAG_NFC|TAG_NO_TAG,"\r\n"); +} + + void nfc_init() { LL_GPIO_SetPinMode(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN,LL_GPIO_MODE_OUTPUT); @@ -129,45 +222,63 @@ void nfc_init() LL_SPI_SetClockPhase(SPI1,LL_SPI_PHASE_2EDGE); LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER); LL_SPI_Enable(SPI1); + + delay(10); + SELECT(); + delay(10); + + + ams_write_command(AMS_CMD_DEFAULT); + ams_write_command(AMS_CMD_CLEAR_BUFFER); + + // enable tunneling mode and RF configuration + ams_write_reg(AMS_REG_IC_CONF2, AMS_RFCFG_EN | AMS_TUN_MOD); } void nfc_loop() { - static int run = 0; - AMS_DEVICE ams,ams2; + const uint32_t interval = 200; + static uint32_t t1 = 0; + uint8_t buf[32]; + AMS_DEVICE ams,ams2; + int len = 0; - if (!run) + if (millis() - t1 > interval) + { + t1 = millis(); + read_reg_block(&ams); + printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,ams.buf,sizeof(AMS_DEVICE)); + + if (ams.regs.rfid_status) { - run = 1; - - delay(10); - SELECT(); - delay(10); - - ams_write_command(AMS_CMD_DEFAULT); - ams_write_command(AMS_CMD_CLEAR_BUFFER); - - ams_write_reg(AMS_REG_IC_CONF1,7); - - int x; - for (x = 0 ; x < 2; x++) - { - read_reg_block(&ams); - printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,ams.buf,sizeof(AMS_DEVICE)); - ams_print_device(&ams); - } - - printf1(TAG_NFC,"---\r\n"); - for (x = 0 ; x < 2; x++) - { - read_reg_block2(&ams2); - printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,ams.buf,sizeof(AMS_DEVICE)); - } - - printf1(TAG_NFC,"Version: %02x vs %02x\r\n",ams_read_reg(0x1e), ams.regs.version_maj); - printf1(TAG_NFC,"Product Type: %02x vs %02x\r\n",ams_read_reg(0x1c), ams.regs.product_type); - printf1(TAG_NFC,"Electrical: %02x vs %02x\r\n",ams_read_reg(2), ams.regs.ic_conf1); - + printf1(TAG_NFC," %s\r\n", ams_get_state_string(ams.regs.rfid_status)); } + if (ams.regs.int0) + { + ams_print_int0(ams.regs.int0); + } + if (ams.regs.int1) + { + ams_print_int1(ams.regs.int1); + } + if (ams.regs.buffer_status2) + { + if (ams.regs.buffer_status2 & AMS_BUF_INVALID) + { + printf1(TAG_NFC,"Buffer being updated!\r\n"); + } + else + { + len = ams.regs.buffer_status2 & AMS_BUF_LEN_MASK; + printf1(TAG_NFC,"%d bytes in buffer\r\n", len); + ams_read_buffer(buf, len); + dump_hex1(TAG_NFC, buf, len); + } + } + // ams_print_device( &ams); + } + + + } diff --git a/targets/stm32l432/src/nfc.h b/targets/stm32l432/src/nfc.h index 1d2fdbd..07c87cc 100644 --- a/targets/stm32l432/src/nfc.h +++ b/targets/stm32l432/src/nfc.h @@ -36,6 +36,46 @@ typedef union #define AMS_REG_IC_CONF0 0x01 #define AMS_REG_IC_CONF1 0x02 #define AMS_REG_IC_CONF2 0x03 + #define AMS_RFCFG_EN 0x80 + #define AMS_TUN_MOD 0x40 +#define AMS_REG_RFID_STATUS 0x04 + #define AMS_HF_PON 0x80 + #define AMS_STATE_MASK 0x78 + #define AMS_STATE_INVALID 0x04 + #define AMS_STATE_OFF (0 << 3) + #define AMS_STATE_SENSE (1 << 3) + #define AMS_STATE_RESOLUTION (3 << 3) + #define AMS_STATE_RESOLUTION_L2 (2 << 3) + #define AMS_STATE_SELECTED (6 << 3) + #define AMS_STATE_SECTOR2 (7 << 3) + #define AMS_STATE_SECTORX_2 (0xf << 3) + #define AMS_STATE_SELECTEDX (0xd << 3) + #define AMS_STATE_SENSEX_L2 (0xa << 3) + #define AMS_STATE_SENSEX (0xb << 3) + #define AMS_STATE_SLEEP (0x9 << 3) +// ... // +#define AMS_REG_INT0 0x0a + #define AMS_INT_XRF (1<<0) + #define AMS_INT_TXE (1<<1) + #define AMS_INT_RXE (1<<2) + #define AMS_INT_EER_RF (1<<3) + #define AMS_INT_EEW_RF (1<<4) + #define AMS_INT_SLP (1<<5) + #define AMS_INT_WU_A (1<<6) + #define AMS_INT_INIT (1<<7) +#define AMS_REG_INT0 0x0b + #define AMS_INT_ACC_ERR (1<<0) + #define AMS_INT_EEAC_ERR (1<<1) + #define AMS_INT_IO_EEWR (1<<2) + #define AMS_INT_BF_ERR (1<<3) + #define AMS_INT_CRC_ERR (1<<4) + #define AMS_INT_PAR_ERR (1<<5) + #define AMS_INT_FRM_ERR (1<<6) + #define AMS_INT_RXS (1<<7) +#define AMS_REG_BUF2 0x0c + #define AMS_BUF_LEN_MASK 0x1f + #define AMS_BUF_INVALID 0x80 + #define AMS_CMD_DEFAULT 0x02 #define AMS_CMD_CLEAR_BUFFER 0x04