Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 8 additions & 27 deletions firmware/targets/f7/furi_hal/f_hal_nfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,14 @@ FHalNfcError f_hal_nfc_reset_mode() {
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

st25r3916_direct_cmd(handle, ST25R3916_CMD_STOP);

const FHalNfcMode mode = f_hal_nfc.mode;
const FHalNfcTech tech = f_hal_nfc.tech;
if(mode == FHalNfcModePoller) {
error = f_hal_nfc_tech[tech]->poller.deinit(handle);
} else if(mode == FHalNfcModeListener) {
error = f_hal_nfc_tech[tech]->listener.deinit(handle);
}
// Set default value in mode register
st25r3916_write_reg(handle, ST25R3916_REG_MODE, ST25R3916_REG_MODE_om0);
st25r3916_write_reg(handle, ST25R3916_REG_STREAM_MODE, 0);
Expand All @@ -389,15 +397,6 @@ FHalNfcError f_hal_nfc_reset_mode() {
ST25R3916_REG_CORR_CONF1_corr_s1 | ST25R3916_REG_CORR_CONF1_corr_s0);
st25r3916_write_reg(handle, ST25R3916_REG_CORR_CONF2, 0);

const FHalNfcMode mode = f_hal_nfc.mode;
const FHalNfcTech tech = f_hal_nfc.tech;

if(mode == FHalNfcModePoller) {
error = f_hal_nfc_tech[tech]->poller.deinit(handle);
} else if(mode == FHalNfcModeListener) {
error = f_hal_nfc_tech[tech]->listener.deinit(handle);
}

return error;
}

Expand Down Expand Up @@ -585,24 +584,6 @@ FHalNfcError f_hal_nfc_trx_reset() {
}

FHalNfcError f_hal_nfc_listener_start() {
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

st25r3916_direct_cmd(handle, ST25R3916_CMD_STOP);
uint32_t interrupts =
(/*ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_TXE |*/ ST25R3916_IRQ_MASK_RXS /*|
ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC |
ST25R3916_IRQ_MASK_ERR1 | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_EON |
ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_WU_A_X | ST25R3916_IRQ_MASK_WU_A*/);
// Clear interrupts
// FURI_LOG_I("LISTEN START", "%lX", interrupts);
st25r3916_get_irq(handle);
// Enable interrupts
st25r3916_mask_irq(handle, interrupts);
// Enable auto collision resolution
st25r3916_clear_reg_bits(
handle, ST25R3916_REG_PASSIVE_TARGET, ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a);
st25r3916_direct_cmd(handle, ST25R3916_CMD_GOTO_SENSE);

return FHalNfcErrorNone;
}

Expand Down
16 changes: 16 additions & 0 deletions firmware/targets/f7/furi_hal/f_hal_nfc_iso14443a.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,22 @@ static FHalNfcError f_hal_nfc_iso14443a_listener_init(FuriHalSpiBusHandle* handl

st25r3916_write_reg(handle, ST25R3916_REG_MASK_RX_TIMER, 0x02);

st25r3916_direct_cmd(handle, ST25R3916_CMD_STOP);
uint32_t interrupts =
(/*ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_TXE |*/ ST25R3916_IRQ_MASK_RXS /*|
ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC |
ST25R3916_IRQ_MASK_ERR1 | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_EON |
ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_WU_A_X | ST25R3916_IRQ_MASK_WU_A*/);
// Clear interrupts
// FURI_LOG_I("LISTEN START", "%lX", interrupts);
st25r3916_get_irq(handle);
// Enable interrupts
st25r3916_mask_irq(handle, interrupts);
// Enable auto collision resolution
st25r3916_clear_reg_bits(
handle, ST25R3916_REG_PASSIVE_TARGET, ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a);
st25r3916_direct_cmd(handle, ST25R3916_CMD_GOTO_SENSE);

return f_hal_nfc_iso14443a_common_init(handle);
}

Expand Down
45 changes: 23 additions & 22 deletions firmware/targets/f7/furi_hal/f_hal_nfc_iso15693.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,21 @@ static FHalNfcError f_hal_nfc_iso15693_poller_rx(
return error;
}

static void f_hal_nfc_iso15693_listener_transparent_mode_enter(FuriHalSpiBusHandle* handle) {
st25r3916_direct_cmd(handle, ST25R3916_CMD_TRANSPARENT_MODE);

furi_hal_spi_bus_handle_deinit(handle);
f_hal_nfc_deinit_gpio_isr();
}

static void f_hal_nfc_iso15693_listener_transparent_mode_exit(FuriHalSpiBusHandle* handle) {
// Configure gpio back to SPI and exit transparent mode
f_hal_nfc_init_gpio_isr();
furi_hal_spi_bus_handle_init(handle);

st25r3916_direct_cmd(handle, ST25R3916_CMD_UNMASK_RECEIVE_DATA);
}

static FHalNfcError f_hal_nfc_iso15693_listener_init(FuriHalSpiBusHandle* handle) {
furi_assert(f_hal_nfc_iso15693_listener == NULL);

Expand All @@ -295,34 +310,24 @@ static FHalNfcError f_hal_nfc_iso15693_listener_init(FuriHalSpiBusHandle* handle
st25r3916_change_reg_bits(
handle, ST25R3916_REG_MODE, ST25R3916_REG_MODE_targ, ST25R3916_REG_MODE_targ_targ);

return f_hal_nfc_iso15693_common_init(handle);
FHalNfcError error = f_hal_nfc_iso15693_common_init(handle);

f_hal_nfc_iso15693_listener_transparent_mode_enter(handle);

return error;
}

static FHalNfcError f_hal_nfc_iso15693_listener_deinit(FuriHalSpiBusHandle* handle) {
UNUSED(handle);
furi_assert(f_hal_nfc_iso15693_listener);

f_hal_nfc_iso15693_listener_transparent_mode_exit(handle);

f_hal_nfc_iso15693_listener_free(f_hal_nfc_iso15693_listener);
f_hal_nfc_iso15693_listener = NULL;

return FHalNfcErrorNone;
}

static void f_hal_nfc_iso15693_listener_transparent_mode_enter(FuriHalSpiBusHandle* handle) {
st25r3916_direct_cmd(handle, ST25R3916_CMD_TRANSPARENT_MODE);

furi_hal_spi_bus_handle_deinit(handle);
f_hal_nfc_deinit_gpio_isr();
}

static void f_hal_nfc_iso15693_listener_transparent_mode_exit(FuriHalSpiBusHandle* handle) {
// Configure gpio back to SPI and exit transparent mode
f_hal_nfc_init_gpio_isr();
furi_hal_spi_bus_handle_init(handle);

st25r3916_direct_cmd(handle, ST25R3916_CMD_UNMASK_RECEIVE_DATA);
}

static FHalNfcError
f_hal_nfc_iso15693_listener_tx_transparent(const uint8_t* data, size_t data_size) {
iso15693_signal_tx(
Expand All @@ -347,9 +352,7 @@ static void f_hal_nfc_iso15693_parser_callback(Iso15693ParserEvent event, void*

static FHalNfcEvent f_hal_nfc_iso15693_wait_event(uint32_t timeout_ms) {
FHalNfcEvent event = 0;
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

f_hal_nfc_iso15693_listener_transparent_mode_enter(handle);
FuriThreadId thread_id = furi_thread_get_current_id();
iso15693_parser_start(
f_hal_nfc_iso15693_listener->parser, f_hal_nfc_iso15693_parser_callback, thread_id);
Expand All @@ -363,7 +366,6 @@ static FHalNfcEvent f_hal_nfc_iso15693_wait_event(uint32_t timeout_ms) {

if(flag & FHalNfcEventInternalTypeAbort) {
event = FHalNfcEventAbortRequest;
f_hal_nfc_iso15693_listener_transparent_mode_exit(handle);
break;
}
if(flag & FHalNfcEventInternalTypeTransparentDataReceived) {
Expand All @@ -382,14 +384,13 @@ static FHalNfcError f_hal_nfc_iso15693_listener_tx(
FuriHalSpiBusHandle* handle,
const uint8_t* tx_data,
size_t tx_bits) {
UNUSED(handle);
furi_assert(f_hal_nfc_iso15693_listener);

FHalNfcError error = FHalNfcErrorNone;

error = f_hal_nfc_iso15693_listener_tx_transparent(tx_data, tx_bits / BITS_IN_BYTE);

f_hal_nfc_iso15693_listener_transparent_mode_exit(handle);

return error;
}

Expand Down
3 changes: 3 additions & 0 deletions lib/digital_signal/digital_signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,9 @@ bool digital_sequence_send(DigitalSequence* sequence) {
FURI_CRITICAL_EXIT();
digital_sequence_finish(sequence);

// TODO reconfig GPIO to initial state
furi_hal_gpio_write(sequence->gpio, false);

return true;
}

Expand Down
1 change: 1 addition & 0 deletions lib/digital_signal/presets/nfc/iso15693_signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,5 +192,6 @@ void iso15693_signal_tx(
digital_sequence_clear(instance->tx_sequence);
iso15693_signal_encode(instance, data_rate, tx_data, tx_data_size);
digital_sequence_send(instance->tx_sequence);

FURI_CRITICAL_EXIT();
}
1 change: 0 additions & 1 deletion lib/signal_reader/signal_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,6 @@ void signal_reader_start(SignalReader* instance, SignalReaderCallback callback,
/* We need the EXTI to be configured as interrupt generating line, but no ISR registered */
furi_hal_gpio_init(
instance->pin, GpioModeInterruptRiseFall, instance->pull, GpioSpeedVeryHigh);
furi_delay_ms(10);

/* Set DMAMUX request generation signal ID on specified DMAMUX channel */
LL_DMAMUX_SetRequestSignalID(
Expand Down