Просмотр исходного кода

[FL-3122] Re-init NFC when starting the worker (#2399)

* Re-init NFC when starting the worker
* FuriHal: cleanup nfc init/deinit sequence
* FuriHal: a little bit more defensive nfc init

Co-authored-by: あく <alleteam@gmail.com>
Astra 2 лет назад
Родитель
Сommit
b15c4afea1

+ 2 - 1
firmware/targets/f7/api_symbols.csv

@@ -1,5 +1,5 @@
 entry,status,name,type,params
 entry,status,name,type,params
-Version,+,14.0,,
+Version,+,14.1,,
 Header,+,applications/services/bt/bt_service/bt.h,,
 Header,+,applications/services/bt/bt_service/bt.h,,
 Header,+,applications/services/cli/cli.h,,
 Header,+,applications/services/cli/cli.h,,
 Header,+,applications/services/cli/cli_vcp.h,,
 Header,+,applications/services/cli/cli_vcp.h,,
@@ -1171,6 +1171,7 @@ 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_no_access,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
 Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
 Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
 Function,+,furi_hal_nfc_activate_nfca,_Bool,"uint32_t, uint32_t*"
 Function,+,furi_hal_nfc_activate_nfca,_Bool,"uint32_t, uint32_t*"
+Function,-,furi_hal_nfc_deinit,void,
 Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t"
 Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t"
 Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, FuriHalNfcEmulateCallback, void*, uint32_t"
 Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, FuriHalNfcEmulateCallback, void*, uint32_t"
 Function,+,furi_hal_nfc_exit_sleep,void,
 Function,+,furi_hal_nfc_exit_sleep,void,

+ 18 - 2
firmware/targets/f7/furi_hal/furi_hal_nfc.c

@@ -24,13 +24,29 @@ FuriEventFlag* event = NULL;
 #define FURI_HAL_NFC_UID_INCOMPLETE (0x04)
 #define FURI_HAL_NFC_UID_INCOMPLETE (0x04)
 
 
 void furi_hal_nfc_init() {
 void furi_hal_nfc_init() {
+    furi_assert(!event);
+    event = furi_event_flag_alloc();
+
     ReturnCode ret = rfalNfcInitialize();
     ReturnCode ret = rfalNfcInitialize();
     if(ret == ERR_NONE) {
     if(ret == ERR_NONE) {
         furi_hal_nfc_start_sleep();
         furi_hal_nfc_start_sleep();
-        event = furi_event_flag_alloc();
         FURI_LOG_I(TAG, "Init OK");
         FURI_LOG_I(TAG, "Init OK");
     } else {
     } else {
-        FURI_LOG_W(TAG, "Initialization failed, RFAL returned: %d", ret);
+        FURI_LOG_W(TAG, "Init Failed, RFAL returned: %d", ret);
+    }
+}
+
+void furi_hal_nfc_deinit() {
+    ReturnCode ret = rfalDeinitialize();
+    if(ret == ERR_NONE) {
+        FURI_LOG_I(TAG, "Deinit OK");
+    } else {
+        FURI_LOG_W(TAG, "Deinit Failed, RFAL returned: %d", ret);
+    }
+
+    if(event) {
+        furi_event_flag_free(event);
+        event = NULL;
     }
     }
 }
 }
 
 

+ 4 - 0
firmware/targets/f7/furi_hal/furi_hal_nfc.h

@@ -101,6 +101,10 @@ typedef struct {
  */
  */
 void furi_hal_nfc_init();
 void furi_hal_nfc_init();
 
 
+/** Deinit nfc
+ */
+void furi_hal_nfc_deinit();
+
 /** Check if nfc worker is busy
 /** Check if nfc worker is busy
  *
  *
  * @return     true if busy
  * @return     true if busy

+ 2 - 0
lib/nfc/nfc_worker.c

@@ -56,6 +56,8 @@ void nfc_worker_start(
     while(furi_hal_nfc_is_busy()) {
     while(furi_hal_nfc_is_busy()) {
         furi_delay_ms(10);
         furi_delay_ms(10);
     }
     }
+    furi_hal_nfc_deinit();
+    furi_hal_nfc_init();
 
 
     nfc_worker->callback = callback;
     nfc_worker->callback = callback;
     nfc_worker->context = context;
     nfc_worker->context = context;