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
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich