mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-09-20 06:31:55 +00:00
NFC: fix MFC timings (#2719)
* digital signal: add optimization * nfc test: more restrict tests * digital signal: build as separate library * digital signal: remove unused flags, format sources * digital signal: fix cflag name * target: fix build for f18 target Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
3a7203e32e
commit
1d7966f74e
9 changed files with 98 additions and 16 deletions
|
@ -27,6 +27,12 @@ static const uint32_t nfc_test_file_version = 1;
|
|||
#define NFC_TEST_DATA_MAX_LEN 18
|
||||
#define NFC_TETS_TIMINGS_MAX_LEN 1350
|
||||
|
||||
// Maximum allowed time for buffer preparation to fit 500us nt message timeout
|
||||
#define NFC_TEST_4_BYTE_BUILD_BUFFER_TIM_MAX (150)
|
||||
#define NFC_TEST_16_BYTE_BUILD_BUFFER_TIM_MAX (640)
|
||||
#define NFC_TEST_4_BYTE_BUILD_SIGNAL_TIM_MAX (110)
|
||||
#define NFC_TEST_16_BYTE_BUILD_SIGNAL_TIM_MAX (440)
|
||||
|
||||
typedef struct {
|
||||
Storage* storage;
|
||||
NfcaSignal* signal;
|
||||
|
@ -89,13 +95,13 @@ static bool nfc_test_read_signal_from_file(const char* file_name) {
|
|||
|
||||
static bool nfc_test_digital_signal_test_encode(
|
||||
const char* file_name,
|
||||
uint32_t encode_max_time,
|
||||
uint32_t build_signal_max_time_us,
|
||||
uint32_t build_buffer_max_time_us,
|
||||
uint32_t timing_tolerance,
|
||||
uint32_t timings_sum_tolerance) {
|
||||
furi_assert(nfc_test);
|
||||
|
||||
bool success = false;
|
||||
uint32_t time = 0;
|
||||
uint32_t dut_timings_sum = 0;
|
||||
uint32_t ref_timings_sum = 0;
|
||||
uint8_t parity[10] = {};
|
||||
|
@ -109,17 +115,37 @@ static bool nfc_test_digital_signal_test_encode(
|
|||
|
||||
// Encode signal
|
||||
FURI_CRITICAL_ENTER();
|
||||
time = DWT->CYCCNT;
|
||||
uint32_t time_start = DWT->CYCCNT;
|
||||
|
||||
nfca_signal_encode(
|
||||
nfc_test->signal, nfc_test->test_data, nfc_test->test_data_len * 8, parity);
|
||||
|
||||
uint32_t time_signal =
|
||||
(DWT->CYCCNT - time_start) / furi_hal_cortex_instructions_per_microsecond();
|
||||
|
||||
time_start = DWT->CYCCNT;
|
||||
|
||||
digital_signal_prepare_arr(nfc_test->signal->tx_signal);
|
||||
time = (DWT->CYCCNT - time) / furi_hal_cortex_instructions_per_microsecond();
|
||||
|
||||
uint32_t time_buffer =
|
||||
(DWT->CYCCNT - time_start) / furi_hal_cortex_instructions_per_microsecond();
|
||||
FURI_CRITICAL_EXIT();
|
||||
|
||||
// Check timings
|
||||
if(time > encode_max_time) {
|
||||
if(time_signal > build_signal_max_time_us) {
|
||||
FURI_LOG_E(
|
||||
TAG, "Encoding time: %ld us while accepted value: %ld us", time, encode_max_time);
|
||||
TAG,
|
||||
"Build signal time: %ld us while accepted value: %ld us",
|
||||
time_signal,
|
||||
build_signal_max_time_us);
|
||||
break;
|
||||
}
|
||||
if(time_buffer > build_buffer_max_time_us) {
|
||||
FURI_LOG_E(
|
||||
TAG,
|
||||
"Build buffer time: %ld us while accepted value: %ld us",
|
||||
time_buffer,
|
||||
build_buffer_max_time_us);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -156,7 +182,16 @@ static bool nfc_test_digital_signal_test_encode(
|
|||
break;
|
||||
}
|
||||
|
||||
FURI_LOG_I(TAG, "Encoding time: %ld us. Acceptable time: %ld us", time, encode_max_time);
|
||||
FURI_LOG_I(
|
||||
TAG,
|
||||
"Build signal time: %ld us. Acceptable time: %ld us",
|
||||
time_signal,
|
||||
build_signal_max_time_us);
|
||||
FURI_LOG_I(
|
||||
TAG,
|
||||
"Build buffer time: %ld us. Acceptable time: %ld us",
|
||||
time_buffer,
|
||||
build_buffer_max_time_us);
|
||||
FURI_LOG_I(
|
||||
TAG,
|
||||
"Timings sum difference: %ld [1/64MHZ]. Acceptable difference: %ld [1/64MHz]",
|
||||
|
@ -171,11 +206,19 @@ static bool nfc_test_digital_signal_test_encode(
|
|||
MU_TEST(nfc_digital_signal_test) {
|
||||
mu_assert(
|
||||
nfc_test_digital_signal_test_encode(
|
||||
NFC_TEST_RESOURCES_DIR NFC_TEST_SIGNAL_SHORT_FILE, 500, 1, 37),
|
||||
NFC_TEST_RESOURCES_DIR NFC_TEST_SIGNAL_SHORT_FILE,
|
||||
NFC_TEST_4_BYTE_BUILD_SIGNAL_TIM_MAX,
|
||||
NFC_TEST_4_BYTE_BUILD_BUFFER_TIM_MAX,
|
||||
1,
|
||||
37),
|
||||
"NFC short digital signal test failed\r\n");
|
||||
mu_assert(
|
||||
nfc_test_digital_signal_test_encode(
|
||||
NFC_TEST_RESOURCES_DIR NFC_TEST_SIGNAL_LONG_FILE, 2000, 1, 37),
|
||||
NFC_TEST_RESOURCES_DIR NFC_TEST_SIGNAL_LONG_FILE,
|
||||
NFC_TEST_16_BYTE_BUILD_SIGNAL_TIM_MAX,
|
||||
NFC_TEST_16_BYTE_BUILD_BUFFER_TIM_MAX,
|
||||
1,
|
||||
37),
|
||||
"NFC long digital signal test failed\r\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
entry,status,name,type,params
|
||||
Version,+,28.1,,
|
||||
Version,+,28.2,,
|
||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||
Header,+,applications/services/cli/cli.h,,
|
||||
Header,+,applications/services/cli/cli_vcp.h,,
|
||||
|
@ -80,6 +80,7 @@ Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid.h,,
|
|||
Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid_u2f.h,,
|
||||
Header,+,firmware/targets/furi_hal_include/furi_hal_version.h,,
|
||||
Header,+,firmware/targets/furi_hal_include/furi_hal_vibro.h,,
|
||||
Header,+,lib/digital_signal/digital_signal.h,,
|
||||
Header,+,lib/flipper_application/api_hashtable/api_hashtable.h,,
|
||||
Header,+,lib/flipper_application/api_hashtable/compilesort.hpp,,
|
||||
Header,+,lib/flipper_application/flipper_application.h,,
|
||||
|
@ -617,6 +618,24 @@ Function,+,dialog_message_set_text,void,"DialogMessage*, const char*, uint8_t, u
|
|||
Function,+,dialog_message_show,DialogMessageButton,"DialogsApp*, const DialogMessage*"
|
||||
Function,+,dialog_message_show_storage_error,void,"DialogsApp*, const char*"
|
||||
Function,-,difftime,double,"time_t, time_t"
|
||||
Function,-,digital_sequence_add,void,"DigitalSequence*, uint8_t"
|
||||
Function,-,digital_sequence_alloc,DigitalSequence*,"uint32_t, const GpioPin*"
|
||||
Function,-,digital_sequence_clear,void,DigitalSequence*
|
||||
Function,-,digital_sequence_free,void,DigitalSequence*
|
||||
Function,-,digital_sequence_send,_Bool,DigitalSequence*
|
||||
Function,-,digital_sequence_set_sendtime,void,"DigitalSequence*, uint32_t"
|
||||
Function,-,digital_sequence_set_signal,void,"DigitalSequence*, uint8_t, DigitalSignal*"
|
||||
Function,-,digital_sequence_timebase_correction,void,"DigitalSequence*, float"
|
||||
Function,-,digital_signal_add,void,"DigitalSignal*, uint32_t"
|
||||
Function,-,digital_signal_add_pulse,void,"DigitalSignal*, uint32_t, _Bool"
|
||||
Function,-,digital_signal_alloc,DigitalSignal*,uint32_t
|
||||
Function,-,digital_signal_append,_Bool,"DigitalSignal*, DigitalSignal*"
|
||||
Function,-,digital_signal_free,void,DigitalSignal*
|
||||
Function,-,digital_signal_get_edge,uint32_t,"DigitalSignal*, uint32_t"
|
||||
Function,-,digital_signal_get_edges_cnt,uint32_t,DigitalSignal*
|
||||
Function,-,digital_signal_get_start_level,_Bool,DigitalSignal*
|
||||
Function,-,digital_signal_prepare_arr,void,DigitalSignal*
|
||||
Function,-,digital_signal_send,void,"DigitalSignal*, const GpioPin*"
|
||||
Function,-,diprintf,int,"int, const char*, ..."
|
||||
Function,+,dir_walk_alloc,DirWalk*,Storage*
|
||||
Function,+,dir_walk_close,void,DirWalk*
|
||||
|
|
|
|
@ -1,5 +1,5 @@
|
|||
entry,status,name,type,params
|
||||
Version,+,28.1,,
|
||||
Version,+,28.2,,
|
||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||
Header,+,applications/services/cli/cli.h,,
|
||||
Header,+,applications/services/cli/cli_vcp.h,,
|
||||
|
@ -86,6 +86,7 @@ Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid.h,,
|
|||
Header,+,firmware/targets/furi_hal_include/furi_hal_usb_hid_u2f.h,,
|
||||
Header,+,firmware/targets/furi_hal_include/furi_hal_version.h,,
|
||||
Header,+,firmware/targets/furi_hal_include/furi_hal_vibro.h,,
|
||||
Header,+,lib/digital_signal/digital_signal.h,,
|
||||
Header,+,lib/flipper_application/api_hashtable/api_hashtable.h,,
|
||||
Header,+,lib/flipper_application/api_hashtable/compilesort.hpp,,
|
||||
Header,+,lib/flipper_application/flipper_application.h,,
|
||||
|
|
|
|
@ -28,6 +28,7 @@
|
|||
"flipperformat",
|
||||
"toolbox",
|
||||
"nfc",
|
||||
"digital_signal",
|
||||
"pulse_reader",
|
||||
"microtar",
|
||||
"usb_stm32",
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
- `nfc` - NFC library, used by NFC application
|
||||
- `one_wire` - OneWire library, used by iButton application
|
||||
- `print` - Tiny printf implementation
|
||||
- `digital_signal` - Digital Signal library used by NFC for software implemented protocols
|
||||
- `pulse_reader` - Pulse Reader library used by NFC for software implemented protocols
|
||||
- `qrcode` - QR-Code library
|
||||
- `stm32wb_cmsis` - STM32WB series CMSIS headers, extends CMSIS Core
|
||||
|
|
|
@ -15,7 +15,6 @@ env.Append(
|
|||
Dir("u8g2"),
|
||||
Dir("update_util"),
|
||||
Dir("print"),
|
||||
Dir("pulse_reader"),
|
||||
],
|
||||
)
|
||||
|
||||
|
@ -95,6 +94,7 @@ libs = env.BuildModules(
|
|||
"mbedtls",
|
||||
"subghz",
|
||||
"nfc",
|
||||
"digital_signal",
|
||||
"pulse_reader",
|
||||
"appframe",
|
||||
"misc",
|
||||
|
|
20
lib/digital_signal/SConscript
Normal file
20
lib/digital_signal/SConscript
Normal file
|
@ -0,0 +1,20 @@
|
|||
Import("env")
|
||||
|
||||
env.Append(
|
||||
CPPPATH=[
|
||||
"#/lib/digital_signal",
|
||||
],
|
||||
SDK_HEADERS=[
|
||||
File("digital_signal.h"),
|
||||
],
|
||||
)
|
||||
|
||||
libenv = env.Clone(FW_LIB_NAME="digital_signal")
|
||||
libenv.ApplyLibFlags()
|
||||
libenv.Append(CCFLAGS=["-O3", "-funroll-loops", "-Ofast"])
|
||||
|
||||
sources = libenv.GlobRecursive("*.c*")
|
||||
|
||||
lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources)
|
||||
libenv.Install("${LIB_DIST_DIR}", lib)
|
||||
Return("lib")
|
|
@ -212,8 +212,7 @@ void digital_signal_prepare_arr(DigitalSignal* signal) {
|
|||
internals->reload_reg_entries = 0;
|
||||
|
||||
for(size_t pos = 0; pos < signal->edge_cnt; pos++) {
|
||||
uint32_t edge_scaled = (internals->factor * signal->edge_timings[pos]) / (1024 * 1024);
|
||||
uint32_t pulse_duration = edge_scaled + internals->reload_reg_remainder;
|
||||
uint32_t pulse_duration = signal->edge_timings[pos] + internals->reload_reg_remainder;
|
||||
if(pulse_duration < 10 || pulse_duration > 10000000) {
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
|
|
|
@ -4,7 +4,6 @@ Import("env")
|
|||
|
||||
env.Append(
|
||||
CPPPATH=[
|
||||
"#/lib/digital_signal",
|
||||
"#/lib/fnv1a_hash",
|
||||
"#/lib/heatshrink",
|
||||
"#/lib/micro-ecc",
|
||||
|
@ -26,7 +25,6 @@ libenv.ApplyLibFlags()
|
|||
sources = []
|
||||
|
||||
libs_recurse = [
|
||||
"digital_signal",
|
||||
"micro-ecc",
|
||||
"u8g2",
|
||||
"update_util",
|
||||
|
|
Loading…
Reference in a new issue