1
1
#include "furi_hal_nfc.h"
2
2
#include <st25r3916.h>
3
+ #include <st25r3916_irq.h>
3
4
#include <rfal_rf.h>
4
5
#include <furi.h>
5
6
#include <m-string.h>
6
- #include <lib/nfc_protocols/nfca.h>
7
+
8
+ #include <lib/digital_signal/digital_signal.h>
9
+ #include <furi_hal_delay.h>
7
10
8
11
#define TAG "FuriHalNfc"
9
12
@@ -394,6 +397,80 @@ ReturnCode furi_hal_nfc_data_exchange(
394
397
return ret ;
395
398
}
396
399
400
+ static bool furi_hal_nfc_transparent_tx_rx (FuriHalNfcTxRxContext * tx_rx , uint16_t timeout_ms ) {
401
+ furi_assert (tx_rx -> nfca_signal );
402
+
403
+ platformDisableIrqCallback ();
404
+
405
+ bool ret = false;
406
+
407
+ // Start transparent mode
408
+ st25r3916ExecuteCommand (ST25R3916_CMD_TRANSPARENT_MODE );
409
+ // Reconfigure gpio
410
+ furi_hal_spi_bus_handle_deinit (& furi_hal_spi_bus_handle_nfc );
411
+ furi_hal_gpio_init (& gpio_spi_r_sck , GpioModeInput , GpioPullUp , GpioSpeedLow );
412
+ furi_hal_gpio_init (& gpio_spi_r_miso , GpioModeInput , GpioPullUp , GpioSpeedLow );
413
+ furi_hal_gpio_init (& gpio_nfc_cs , GpioModeInput , GpioPullUp , GpioSpeedLow );
414
+ furi_hal_gpio_init (& gpio_spi_r_mosi , GpioModeOutputPushPull , GpioPullNo , GpioSpeedVeryHigh );
415
+ furi_hal_gpio_write (& gpio_spi_r_mosi , false);
416
+
417
+ // Send signal
418
+ nfca_signal_encode (tx_rx -> nfca_signal , tx_rx -> tx_data , tx_rx -> tx_bits / 8 , tx_rx -> tx_parity );
419
+ digital_signal_send (tx_rx -> nfca_signal -> tx_signal , & gpio_spi_r_mosi );
420
+ furi_hal_gpio_write (& gpio_spi_r_mosi , false);
421
+
422
+ // Configure gpio back to SPI and exit transparent
423
+ furi_hal_spi_bus_handle_init (& furi_hal_spi_bus_handle_nfc );
424
+ st25r3916ExecuteCommand (ST25R3916_CMD_UNMASK_RECEIVE_DATA );
425
+
426
+ // Manually wait for interrupt
427
+ furi_hal_gpio_init (& gpio_rfid_pull , GpioModeInput , GpioPullDown , GpioSpeedVeryHigh );
428
+ st25r3916ClearAndEnableInterrupts (ST25R3916_IRQ_MASK_RXE );
429
+
430
+ uint32_t irq = 0 ;
431
+ uint8_t rxe = 0 ;
432
+ uint32_t start = DWT -> CYCCNT ;
433
+ while (true) {
434
+ if (furi_hal_gpio_read (& gpio_rfid_pull ) == true) {
435
+ st25r3916ReadRegister (ST25R3916_REG_IRQ_MAIN , & rxe );
436
+ if (rxe & (1 << 4 )) {
437
+ irq = 1 ;
438
+ break ;
439
+ }
440
+ }
441
+ uint32_t timeout = DWT -> CYCCNT - start ;
442
+ if (timeout / furi_hal_delay_instructions_per_microsecond () > timeout_ms * 1000 ) {
443
+ FURI_LOG_D (TAG , "Interrupt waiting timeout" );
444
+ break ;
445
+ }
446
+ }
447
+ if (irq ) {
448
+ uint8_t fifo_stat [2 ];
449
+ st25r3916ReadMultipleRegisters (
450
+ ST25R3916_REG_FIFO_STATUS1 , fifo_stat , ST25R3916_FIFO_STATUS_LEN );
451
+ uint16_t len =
452
+ ((((uint16_t )fifo_stat [1 ] & ST25R3916_REG_FIFO_STATUS2_fifo_b_mask ) >>
453
+ ST25R3916_REG_FIFO_STATUS2_fifo_b_shift )
454
+ << RFAL_BITS_IN_BYTE );
455
+ len |= (((uint16_t )fifo_stat [0 ]) & 0x00FFU );
456
+ uint8_t rx [100 ];
457
+ st25r3916ReadFifo (rx , len );
458
+
459
+ tx_rx -> rx_bits = len * 8 ;
460
+ memcpy (tx_rx -> rx_data , rx , len );
461
+
462
+ ret = true;
463
+ } else {
464
+ FURI_LOG_E (TAG , "Timeout error" );
465
+ ret = false;
466
+ }
467
+
468
+ st25r3916ClearInterrupts ();
469
+ platformEnableIrqCallback ();
470
+
471
+ return ret ;
472
+ }
473
+
397
474
static uint32_t furi_hal_nfc_tx_rx_get_flag (FuriHalNfcTxRxType type ) {
398
475
uint32_t flags = 0 ;
399
476
@@ -405,6 +482,9 @@ static uint32_t furi_hal_nfc_tx_rx_get_flag(FuriHalNfcTxRxType type) {
405
482
} else if (type == FuriHalNfcTxRxTypeRaw ) {
406
483
flags = RFAL_TXRX_FLAGS_CRC_TX_MANUAL | RFAL_TXRX_FLAGS_CRC_RX_KEEP |
407
484
RFAL_TXRX_FLAGS_PAR_RX_KEEP | RFAL_TXRX_FLAGS_PAR_TX_NONE ;
485
+ } else if (type == FuriHalNfcTxRxTypeRxRaw ) {
486
+ flags = RFAL_TXRX_FLAGS_CRC_TX_MANUAL | RFAL_TXRX_FLAGS_CRC_RX_KEEP |
487
+ RFAL_TXRX_FLAGS_PAR_RX_KEEP | RFAL_TXRX_FLAGS_PAR_TX_NONE ;
408
488
}
409
489
410
490
return flags ;
@@ -470,6 +550,10 @@ bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
470
550
uint8_t * temp_rx_buff = NULL ;
471
551
uint16_t * temp_rx_bits = NULL ;
472
552
553
+ if (tx_rx -> tx_rx_type == FuriHalNfcTxRxTransparent ) {
554
+ return furi_hal_nfc_transparent_tx_rx (tx_rx , timeout_ms );
555
+ }
556
+
473
557
// Prepare data for FIFO if necessary
474
558
uint32_t flags = furi_hal_nfc_tx_rx_get_flag (tx_rx -> tx_rx_type );
475
559
if (tx_rx -> tx_rx_type == FuriHalNfcTxRxTypeRaw ) {
@@ -502,7 +586,8 @@ bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
502
586
osDelay (1 );
503
587
}
504
588
505
- if (tx_rx -> tx_rx_type == FuriHalNfcTxRxTypeRaw ) {
589
+ if (tx_rx -> tx_rx_type == FuriHalNfcTxRxTypeRaw ||
590
+ tx_rx -> tx_rx_type == FuriHalNfcTxRxTypeRxRaw ) {
506
591
tx_rx -> rx_bits = 8 * furi_hal_nfc_bitstream_to_data_and_parity (
507
592
temp_rx_buff , * temp_rx_bits , tx_rx -> rx_data , tx_rx -> rx_parity );
508
593
} else {
0 commit comments