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
33 changes: 12 additions & 21 deletions applications/debug/unit_tests/nfc/nfc_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,10 @@ void nfc_free(Nfc* instance) {
free(instance);
}

void nfc_config(Nfc* instance, NfcMode mode) {
void nfc_config(Nfc* instance, NfcMode mode, NfcTech tech) {
UNUSED(instance);
UNUSED(mode);
UNUSED(tech);
}

void nfc_set_fdt_poll_fc(Nfc* instance, uint32_t fdt_poll_fc) {
Expand Down Expand Up @@ -155,7 +156,7 @@ void nfc_set_guard_time_us(Nfc* instance, uint32_t guard_time_us) {
UNUSED(guard_time_us);
}

NfcError nfc_listener_set_col_res_data(
NfcError nfc_iso14443a_listener_set_col_res_data(
Nfc* instance,
uint8_t* uid,
uint8_t uid_len,
Expand Down Expand Up @@ -334,17 +335,6 @@ void nfc_start_listener(Nfc* instance, NfcEventCallback callback, void* context)
furi_thread_start(instance->worker_thread);
}

NfcError nfc_listener_reset(Nfc* instance) {
furi_assert(instance);
furi_assert(poller_queue);

instance->col_res_status = Iso14443_3aColResStatusIdle;
NfcMessage message = {.type = NfcMessageTypeTimeout};
furi_message_queue_put(poller_queue, &message, FuriWaitForever);

return NfcErrorNone;
}

void nfc_listener_abort(Nfc* instance) {
furi_assert(instance);

Expand Down Expand Up @@ -391,11 +381,12 @@ NfcError nfc_listener_tx(Nfc* instance, const BitBuffer* tx_buffer) {
return NfcErrorNone;
}

NfcError nfc_iso14443_3a_listener_tx_custom_parity(Nfc* instance, const BitBuffer* tx_buffer) {
NfcError nfc_iso14443a_listener_tx_custom_parity(Nfc* instance, const BitBuffer* tx_buffer) {
return nfc_listener_tx(instance, tx_buffer);
}

NfcError nfc_trx(Nfc* instance, const BitBuffer* tx_buffer, BitBuffer* rx_buffer, uint32_t fwt) {
NfcError
nfc_poller_trx(Nfc* instance, const BitBuffer* tx_buffer, BitBuffer* rx_buffer, uint32_t fwt) {
furi_assert(instance);
furi_assert(tx_buffer);
furi_assert(rx_buffer);
Expand Down Expand Up @@ -427,17 +418,17 @@ NfcError nfc_trx(Nfc* instance, const BitBuffer* tx_buffer, BitBuffer* rx_buffer
return error;
}

NfcError nfc_trx_custom_parity(
NfcError nfc_iso14443a_poller_trx_custom_parity(
Nfc* instance,
const BitBuffer* tx_buffer,
BitBuffer* rx_buffer,
uint32_t fwt) {
return nfc_trx(instance, tx_buffer, rx_buffer, fwt);
return nfc_poller_trx(instance, tx_buffer, rx_buffer, fwt);
}

// Technology specific API

NfcError nfc_iso14443_3a_short_frame(
NfcError nfc_iso14443a_poller_trx_short_frame(
Nfc* instance,
NfcIso14443aShortFrame frame,
BitBuffer* rx_buffer,
Expand All @@ -448,19 +439,19 @@ NfcError nfc_iso14443_3a_short_frame(
bit_buffer_set_size(tx_buffer, 7);
bit_buffer_set_byte(tx_buffer, 0, 0x52);

NfcError error = nfc_trx(instance, tx_buffer, rx_buffer, fwt);
NfcError error = nfc_poller_trx(instance, tx_buffer, rx_buffer, fwt);

bit_buffer_free(tx_buffer);

return error;
}

NfcError nfc_iso14443_3a_sdd_frame(
NfcError nfc_iso14443a_poller_trx_sdd_frame(
Nfc* instance,
const BitBuffer* tx_buffer,
BitBuffer* rx_buffer,
uint32_t fwt) {
return nfc_trx(instance, tx_buffer, rx_buffer, fwt);
return nfc_poller_trx(instance, tx_buffer, rx_buffer, fwt);
}

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ static bool nfc_scene_info_on_event_mf_classic(NfcApp* instance, uint32_t event)

static bool nfc_scene_read_menu_on_event_mf_classic(NfcApp* instance, uint32_t event) {
if(event == SubmenuIndexDetectReader) {
scene_manager_next_scene(instance->scene_manager, NfcSceneNotImplemented);
scene_manager_next_scene(instance->scene_manager, NfcSceneMfClassicDetectReader);
dolphin_deed(DolphinDeedNfcDetectReader);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,11 @@ bool nfc_scene_mf_classic_detect_reader_on_event(void* context, SceneManagerEven
consumed = true;
}
} else if(event.type == SceneManagerEventTypeBack) {
nfc_listener_stop(instance->listener);
nfc_listener_free(instance->listener);
size_t nonces_pairs = 2 * mfkey32_logger_get_params_num(instance->mfkey32_logger);
if(nonces_pairs < NFC_SCENE_DETECT_READER_PAIR_NONCES_MAX) {
nfc_listener_stop(instance->listener);
nfc_listener_free(instance->listener);
}
mfkey32_logger_free(instance->mfkey32_logger);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ bool nfc_scene_mf_classic_mfkey_complete_on_event(void* context, SceneManagerEve
consumed = scene_manager_search_and_switch_to_previous_scene(
instance->scene_manager, NfcSceneStart);
}
} else if(event.event == SceneManagerEventTypeBack) {
} else if(event.type == SceneManagerEventTypeBack) {
const uint32_t prev_scenes[] = {NfcSceneSavedMenu, NfcSceneStart};
consumed = scene_manager_search_and_switch_to_previous_scene_one_of(
instance->scene_manager, prev_scenes, COUNT_OF(prev_scenes));
Expand Down
2 changes: 1 addition & 1 deletion firmware/targets/f18/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -1120,7 +1120,7 @@ Function,-,furi_hal_mpu_init,void,
Function,+,furi_hal_mpu_protect_disable,void,FuriHalMpuRegion
Function,+,furi_hal_mpu_protect_no_access,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
Function,-,furi_hal_nfca_set_col_res_data,FHalNfcError,"uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,f_hal_nfc_iso14443a_listener_set_col_res_data,FHalNfcError,"uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,furi_hal_os_init,void,
Function,+,furi_hal_os_tick,void,
Function,+,furi_hal_power_check_otg_fault,_Bool,
Expand Down
43 changes: 18 additions & 25 deletions firmware/targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,38.1,,
Version,+,41.8,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.h,,
Expand Down Expand Up @@ -874,24 +874,26 @@ Function,-,f_hal_nfc_acquire,FHalNfcError,
Function,+,f_hal_nfc_event_start,FHalNfcError,
Function,-,f_hal_nfc_init,FHalNfcError,
Function,-,f_hal_nfc_is_hal_ready,FHalNfcError,
Function,-,f_hal_nfc_listener_disable_auto_col_res,FHalNfcError,
Function,+,f_hal_nfc_listener_reset,FHalNfcError,
Function,-,f_hal_nfc_iso14443a_listener_set_col_res_data,FHalNfcError,"uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,f_hal_nfc_iso14443a_listener_tx_custom_parity,FHalNfcError,"const uint8_t*, const uint8_t*, size_t"
Function,-,f_hal_nfc_iso14443a_poller_trx_short_frame,FHalNfcError,FHalNfcaShortFrame
Function,-,f_hal_nfc_iso14443a_poller_tx_custom_parity,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfc_iso14443a_rx_sdd_frame,FHalNfcError,"uint8_t*, size_t, size_t*"
Function,-,f_hal_nfc_iso14443a_tx_sdd_frame,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfc_listener_enable_rx,FHalNfcError,
Function,-,f_hal_nfc_listener_idle,FHalNfcError,
Function,+,f_hal_nfc_listener_rx,FHalNfcError,"uint8_t*, size_t, size_t*"
Function,+,f_hal_nfc_listener_rx_start,FHalNfcError,
Function,-,f_hal_nfc_listener_sleep,FHalNfcError,
Function,+,f_hal_nfc_listener_start,FHalNfcError,
Function,-,f_hal_nfc_listener_tx,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfc_listener_wait_event,FHalNfcEvent,uint32_t
Function,-,f_hal_nfc_low_power_mode_start,FHalNfcError,
Function,-,f_hal_nfc_low_power_mode_stop,FHalNfcError,
Function,-,f_hal_nfc_poller_field_on,FHalNfcError,
Function,-,f_hal_nfc_poller_rx,FHalNfcError,"uint8_t*, size_t, size_t*"
Function,-,f_hal_nfc_poller_tx,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfc_poller_tx_custom_parity,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfc_poller_wait_event,FHalNfcEvent,uint32_t
Function,-,f_hal_nfc_release,FHalNfcError,
Function,-,f_hal_nfc_reset_mode,FHalNfcError,
Function,-,f_hal_nfc_set_mask_receive_timer,void,uint32_t
Function,+,f_hal_nfc_set_mode,FHalNfcError,"FHalNfcMode, FHalNfcTech"
Function,-,f_hal_nfc_timer_block_tx_is_running,_Bool,
Function,-,f_hal_nfc_timer_block_tx_start,void,uint32_t
Expand All @@ -900,10 +902,6 @@ Function,-,f_hal_nfc_timer_block_tx_stop,void,
Function,-,f_hal_nfc_timer_fwt_start,void,uint32_t
Function,-,f_hal_nfc_timer_fwt_stop,void,
Function,-,f_hal_nfc_trx_reset,FHalNfcError,
Function,-,f_hal_nfca_listener_tx_custom_parity,FHalNfcError,"const uint8_t*, const uint8_t*, size_t"
Function,-,f_hal_nfca_receive_sdd_frame,FHalNfcError,"uint8_t*, size_t, size_t*"
Function,-,f_hal_nfca_send_sdd_frame,FHalNfcError,"const uint8_t*, size_t"
Function,-,f_hal_nfca_send_short_frame,FHalNfcError,FHalNfcaShortFrame
Function,-,fabs,double,double
Function,-,fabsf,float,float
Function,-,fabsl,long double,long double
Expand Down Expand Up @@ -1320,7 +1318,6 @@ Function,+,furi_hal_nfc_stop,void,
Function,+,furi_hal_nfc_stop_cmd,void,
Function,+,furi_hal_nfc_tx_rx,_Bool,"FuriHalNfcTxRxContext*, uint16_t"
Function,+,furi_hal_nfc_tx_rx_full,_Bool,FuriHalNfcTxRxContext*
Function,-,furi_hal_nfca_set_col_res_data,FHalNfcError,"uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,furi_hal_os_init,void,
Function,+,furi_hal_os_tick,void,
Function,+,furi_hal_power_check_otg_fault,_Bool,
Expand Down Expand Up @@ -2179,8 +2176,8 @@ Function,-,nextafterl,long double,"long double, long double"
Function,-,nexttoward,double,"double, long double"
Function,-,nexttowardf,float,"float, long double"
Function,-,nexttowardl,long double,"long double, long double"
Function,-,nfc_alloc,Nfc*,
Function,-,nfc_config,void,"Nfc*, NfcMode"
Function,+,nfc_alloc,Nfc*,
Function,+,nfc_config,void,"Nfc*, NfcMode, NfcTech"
Function,+,nfc_device_alloc,NfcDevice*,
Function,+,nfc_device_clear,void,NfcDevice*
Function,+,nfc_device_copy_data,void,"const NfcDevice*, NfcProtocol, NfcDeviceData*"
Expand All @@ -2198,16 +2195,14 @@ Function,+,nfc_device_set_data,void,"NfcDevice*, NfcProtocol, const NfcDeviceDat
Function,+,nfc_device_set_loading_callback,void,"NfcDevice*, NfcLoadingCallback, void*"
Function,+,nfc_device_set_uid,_Bool,"NfcDevice*, const uint8_t*, size_t"
Function,-,nfc_free,void,Nfc*
Function,-,nfc_iso14443_3a_listener_tx_custom_parity,NfcError,"Nfc*, const BitBuffer*"
Function,-,nfc_iso14443_3a_sdd_frame,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,-,nfc_iso14443_3a_short_frame,NfcError,"Nfc*, NfcIso14443aShortFrame, BitBuffer*, uint32_t"
Function,-,nfc_listener_abort,void,Nfc*
Function,-,nfc_iso14443a_listener_set_col_res_data,NfcError,"Nfc*, uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,nfc_iso14443a_listener_tx_custom_parity,NfcError,"Nfc*, const BitBuffer*"
Function,-,nfc_iso14443a_poller_trx_custom_parity,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,-,nfc_iso14443a_poller_trx_sdd_frame,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,-,nfc_iso14443a_poller_trx_short_frame,NfcError,"Nfc*, NfcIso14443aShortFrame, BitBuffer*, uint32_t"
Function,-,nfc_listener_alloc,NfcListener*,"Nfc*, NfcProtocol, const NfcDeviceData*"
Function,-,nfc_listener_free,void,NfcListener*
Function,-,nfc_listener_get_data,const NfcDeviceData*,"NfcListener*, NfcProtocol"
Function,-,nfc_listener_reset,NfcError,Nfc*
Function,-,nfc_listener_set_col_res_data,NfcError,"Nfc*, uint8_t*, uint8_t, uint8_t*, uint8_t"
Function,-,nfc_listener_sleep,NfcError,Nfc*
Function,-,nfc_listener_start,void,"NfcListener*, NfcGenericCallback, void*"
Function,-,nfc_listener_stop,void,NfcListener*
Function,-,nfc_listener_tx,NfcError,"Nfc*, const BitBuffer*"
Expand All @@ -2217,6 +2212,7 @@ Function,+,nfc_poller_free,void,NfcPoller*
Function,+,nfc_poller_get_data,const NfcDeviceData*,NfcPoller*
Function,+,nfc_poller_start,void,"NfcPoller*, NfcGenericCallback, void*"
Function,+,nfc_poller_stop,void,NfcPoller*
Function,+,nfc_poller_trx,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,+,nfc_protocol_get_parent,NfcProtocol,NfcProtocol
Function,+,nfc_protocol_has_parent,_Bool,"NfcProtocol, NfcProtocol"
Function,+,nfc_scanner_alloc,NfcScanner*,Nfc*
Expand All @@ -2228,11 +2224,8 @@ Function,-,nfc_set_fdt_poll_fc,void,"Nfc*, uint32_t"
Function,-,nfc_set_fdt_poll_poll_us,void,"Nfc*, uint32_t"
Function,-,nfc_set_guard_time_us,void,"Nfc*, uint32_t"
Function,-,nfc_set_mask_receive_time_fc,void,"Nfc*, uint32_t"
Function,-,nfc_start_listener,void,"Nfc*, NfcEventCallback, void*"
Function,-,nfc_start_poller,void,"Nfc*, NfcEventCallback, void*"
Function,+,nfc_start,void,"Nfc*, NfcEventCallback, void*"
Function,-,nfc_stop,void,Nfc*
Function,-,nfc_trx,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,-,nfc_trx_custom_parity,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t"
Function,+,nfc_util_bytes2num,uint64_t,"const uint8_t*, uint8_t"
Function,+,nfc_util_even_parity32,uint8_t,uint32_t
Function,+,nfc_util_num2bytes,void,"uint64_t, uint8_t, uint8_t*"
Expand Down
81 changes: 11 additions & 70 deletions firmware/targets/f7/furi_hal/f_hal_nfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,6 @@ FHalNfcError f_hal_nfc_poller_field_on() {
ST25R3916_REG_OP_CONTROL_tx_en)) {
// Set min guard time
st25r3916_write_reg(handle, ST25R3916_REG_FIELD_ON_GT, 0);
// st25r3916_direct_cmd(handle, ST25R3916_CMD_INITIAL_RF_COLLISION);
// Enable tx rx
st25r3916_set_reg_bits(
handle,
Expand All @@ -422,37 +421,6 @@ FHalNfcError f_hal_nfc_poller_field_on() {
return error;
}

FHalNfcError f_hal_nfc_poller_tx_custom_parity(const uint8_t* tx_data, size_t tx_bits) {
furi_assert(tx_data);

// TODO common code for f_hal_nfc_poller_tx

FHalNfcError err = FHalNfcErrorNone;
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

// Prepare tx
st25r3916_direct_cmd(handle, ST25R3916_CMD_CLEAR_FIFO);
st25r3916_clear_reg_bits(
handle, ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_emv);
st25r3916_change_reg_bits(
handle,
ST25R3916_REG_ISO14443A_NFC,
(ST25R3916_REG_ISO14443A_NFC_no_tx_par | ST25R3916_REG_ISO14443A_NFC_no_rx_par),
(ST25R3916_REG_ISO14443A_NFC_no_tx_par | ST25R3916_REG_ISO14443A_NFC_no_rx_par));
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_NRE);
// Clear interrupts
st25r3916_get_irq(handle);
// Enable interrupts
st25r3916_mask_irq(handle, ~interrupts);

st25r3916_write_fifo(handle, tx_data, tx_bits);
st25r3916_direct_cmd(handle, ST25R3916_CMD_TRANSMIT_WITHOUT_CRC);
return err;
}

FHalNfcError f_hal_nfc_poller_tx_common(
FuriHalSpiBusHandle* handle,
const uint8_t* tx_data,
Expand Down Expand Up @@ -536,20 +504,6 @@ FHalNfcError f_hal_nfc_listener_tx(const uint8_t* tx_data, size_t tx_bits) {
return f_hal_nfc_tech[f_hal_nfc.tech]->listener.tx(handle, tx_data, tx_bits);
}

FHalNfcError f_hal_nfc_common_listener_rx_start(FuriHalSpiBusHandle* handle) {
UNUSED(handle);
/* Empty implementation */
return FHalNfcErrorNone;
}

FHalNfcError f_hal_nfc_listener_rx_start() {
furi_assert(f_hal_nfc.mode == FHalNfcModeListener);
furi_assert(f_hal_nfc.tech < FHalNfcTechNum);

FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;
return f_hal_nfc_tech[f_hal_nfc.tech]->listener.rx_start(handle);
}

FHalNfcError f_hal_nfc_common_fifo_rx(
FuriHalSpiBusHandle* handle,
uint8_t* rx_data,
Expand Down Expand Up @@ -583,41 +537,28 @@ FHalNfcError f_hal_nfc_trx_reset() {
return FHalNfcErrorNone;
}

FHalNfcError f_hal_nfc_listener_start() {
return FHalNfcErrorNone;
}
FHalNfcError f_hal_nfc_listener_sleep() {
furi_assert(f_hal_nfc.mode == FHalNfcModeListener);
furi_assert(f_hal_nfc.tech < FHalNfcTechNum);

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

st25r3916_direct_cmd(handle, ST25R3916_CMD_UNMASK_RECEIVE_DATA);

return FHalNfcErrorNone;
return f_hal_nfc_tech[f_hal_nfc.tech]->listener.sleep(handle);
}

FHalNfcError f_hal_nfc_listener_sleep() {
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;
FHalNfcError f_hal_nfc_listener_idle() {
furi_assert(f_hal_nfc.mode == FHalNfcModeListener);
furi_assert(f_hal_nfc.tech < FHalNfcTechNum);

// 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_STOP);
st25r3916_direct_cmd(handle, ST25R3916_CMD_GOTO_SLEEP);
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

return FHalNfcErrorNone;
return f_hal_nfc_tech[f_hal_nfc.tech]->listener.idle(handle);
}

FHalNfcError f_hal_nfc_listener_disable_auto_col_res() {
FHalNfcError f_hal_nfc_listener_enable_rx() {
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

st25r3916_set_reg_bits(
handle, ST25R3916_REG_PASSIVE_TARGET, ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a);
st25r3916_direct_cmd(handle, ST25R3916_CMD_UNMASK_RECEIVE_DATA);

return FHalNfcErrorNone;
}

void f_hal_nfc_set_mask_receive_timer(uint32_t time_fc) {
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;

st25r3916_write_reg(handle, ST25R3916_REG_MASK_RX_TIMER, time_fc);
}
2 changes: 1 addition & 1 deletion firmware/targets/f7/furi_hal/f_hal_nfc_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ FHalNfcEvent f_hal_nfc_wait_event_common(uint32_t timeout_ms) {
event |= FHalNfcEventListenerActive;
}
if(irq & ST25R3916_IRQ_MASK_WU_A_X) {
event |= FHalNfcEventListenerActiveA;
event |= FHalNfcEventListenerActive;
}
}
if(event_flag & FHalNfcEventInternalTypeTimerFwtExpired) {
Expand Down
Loading