Ver código fonte

Fix UART deinit issues and crashes

Remove interrupt callback before stopping thread
Prevents race condition of interrupt setting flag on free'd thread
Also correctly stop async rx events
Willy-JL 1 ano atrás
pai
commit
c3547182b2

+ 5 - 4
camera_suite/views/camera_suite_view_camera.c

@@ -634,6 +634,11 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
 void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
     furi_assert(instance);
 
+    // Deinitialize the serial handle and release the control.
+    furi_hal_serial_async_rx_stop(instance->serial_handle);
+    furi_hal_serial_deinit(instance->serial_handle);
+    furi_hal_serial_control_release(instance->serial_handle);
+
     // Free the worker thread.
     furi_thread_flags_set(furi_thread_get_id(instance->camera_worker_thread), WorkerEventStop);
     furi_thread_join(instance->camera_worker_thread);
@@ -642,10 +647,6 @@ void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
     // Free the allocated stream buffer.
     furi_stream_buffer_free(instance->camera_rx_stream);
 
-    // Deinitialize the serial handle and release the control.
-    furi_hal_serial_deinit(instance->serial_handle);
-    furi_hal_serial_control_release(instance->serial_handle);
-
     with_view_model(
         instance->view, UartDumpModel * model, { UNUSED(model); }, true);
     view_free(instance->view);

+ 2 - 0
dap_link/dap_link.c

@@ -359,11 +359,13 @@ static void cdc_init_uart(
 static void cdc_deinit_uart(CDCProcess* app, DapUartType type) {
     switch(type) {
     case DapUartTypeUSART1:
+        furi_hal_serial_async_rx_stop(app->serial_handle);
         furi_hal_serial_deinit(app->serial_handle);
         LL_USART_SetTXRXSwap(USART1, LL_USART_TXRX_STANDARD);
         furi_hal_serial_control_release(app->serial_handle);
         break;
     case DapUartTypeLPUART1:
+        furi_hal_serial_async_rx_stop(app->serial_handle);
         furi_hal_serial_deinit(app->serial_handle);
         LL_LPUART_SetTXRXSwap(LPUART1, LL_LPUART_TXRX_STANDARD);
         furi_hal_serial_control_release(app->serial_handle);

+ 4 - 3
esp8266_deauth/esp8266_deauth.c

@@ -505,6 +505,10 @@ int32_t esp8266_deauth_app(void* p) {
 
     DEAUTH_APP_LOG_I("Start exit app");
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
+    furi_hal_serial_deinit(app->serial_handle);
+    furi_hal_serial_control_release(app->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(app->m_worker_thread), WorkerEventStop);
     furi_thread_join(app->m_worker_thread);
     furi_thread_free(app->m_worker_thread);
@@ -518,9 +522,6 @@ int32_t esp8266_deauth_app(void* p) {
     furi_hal_gpio_init(&gpio_ext_pb3, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
     furi_hal_gpio_init(&gpio_ext_pa4, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 
-    furi_hal_serial_deinit(app->serial_handle);
-    furi_hal_serial_control_release(app->serial_handle);
-
     //*app->m_originalBufferLocation = app->m_originalBuffer;
 
     view_port_enabled_set(view_port, false);

+ 4 - 3
esp_flasher/esp_flasher_uart.c

@@ -93,12 +93,13 @@ EspFlasherUart* esp_flasher_usart_init(EspFlasherApp* app) {
 void esp_flasher_uart_free(EspFlasherUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(uart->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 3 - 3
evil_portal/evil_portal_uart.c

@@ -163,12 +163,12 @@ Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app) {
 void evil_portal_uart_free(Evil_PortalUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 1 - 0
gpio_reader_b/usb_uart_bridge.c

@@ -122,6 +122,7 @@ static void usb_uart_serial_init(UsbUartBridge* usb_uart, uint8_t uart_ch) {
 
 static void usb_uart_serial_deinit(UsbUartBridge* usb_uart, uint8_t uart_ch) {
     UNUSED(uart_ch);
+    furi_hal_serial_async_rx_stop(usb_uart->serial_handle);
     furi_hal_serial_deinit(usb_uart->serial_handle);
     furi_hal_serial_control_release(usb_uart->serial_handle);
 }

+ 1 - 0
gps_nmea/gps_uart.c

@@ -33,6 +33,7 @@ static void gps_uart_serial_init(GpsUart* gps_uart) {
 
 static void gps_uart_serial_deinit(GpsUart* gps_uart) {
     UNUSED(gps_uart);
+    furi_hal_serial_async_rx_stop(gps_uart->serial_handle);
     furi_hal_serial_deinit(gps_uart->serial_handle);
     furi_hal_serial_control_release(gps_uart->serial_handle);
 }

+ 4 - 3
magspoof/scenes/mag_scene_read.c

@@ -169,6 +169,10 @@ void mag_scene_read_on_exit(void* context) {
     widget_reset(mag->widget);
     // view_dispatcher_remove_view(mag->view_dispatcher, MagViewWidget);
 
+    furi_hal_serial_async_rx_stop(mag->serial_handle);
+    furi_hal_serial_deinit(mag->serial_handle);
+    furi_hal_serial_control_release(mag->serial_handle);
+
     // Stop UART worker
     FURI_LOG_D(TAG, "Stopping UART worker");
     furi_thread_flags_set(furi_thread_get_id(mag->uart_rx_thread), WorkerEvtStop);
@@ -178,8 +182,5 @@ void mag_scene_read_on_exit(void* context) {
 
     furi_string_free(mag->uart_text_box_store);
 
-    furi_hal_serial_deinit(mag->serial_handle);
-    furi_hal_serial_control_release(mag->serial_handle);
-
     notification_message(mag->notifications, &sequence_blink_stop);
 }

+ 1 - 0
mayhem_camera/camera.c

@@ -280,6 +280,7 @@ static UartEchoApp* camera_app_alloc() {
 static void camera_app_free(UartEchoApp* app) {
     furi_assert(app);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
     furi_hal_serial_deinit(app->serial_handle);
     furi_hal_serial_control_release(app->serial_handle);
 

+ 4 - 3
mayhem_marauder/wifi_marauder_uart.c

@@ -113,12 +113,13 @@ WifiMarauderUart* wifi_marauder_lp_uart_init(WifiMarauderApp* app) {
 void wifi_marauder_uart_free(WifiMarauderUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(uart->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 4 - 3
mayhem_morseflash/uart_terminal_uart.c

@@ -86,12 +86,13 @@ UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
 void uart_terminal_uart_free(UART_TerminalUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 1 - 0
mayhem_motion/uart_echo.c

@@ -202,6 +202,7 @@ static UartEchoApp* uart_echo_app_alloc() {
 static void uart_echo_app_free(UartEchoApp* app) {
     furi_assert(app);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
     furi_hal_serial_deinit(app->serial_handle);
     furi_hal_serial_control_release(app->serial_handle);
 

+ 1 - 0
mayhem_nannycam/uart_echo.c

@@ -196,6 +196,7 @@ static UartEchoApp* uart_echo_app_alloc() {
 static void uart_echo_app_free(UartEchoApp* app) {
     furi_assert(app);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
     furi_hal_serial_deinit(app->serial_handle);
     furi_hal_serial_control_release(app->serial_handle);
 

+ 1 - 0
mayhem_qrcode/uart_echo.c

@@ -196,6 +196,7 @@ static UartEchoApp* uart_echo_app_alloc() {
 static void uart_echo_app_free(UartEchoApp* app) {
     furi_assert(app);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
     furi_hal_serial_deinit(app->serial_handle);
     furi_hal_serial_control_release(app->serial_handle);
 

+ 4 - 3
uart_terminal/uart_terminal_uart.c

@@ -91,12 +91,13 @@ UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
 void uart_terminal_uart_free(UART_TerminalUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(uart->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 10 - 8
wardriver/wardriver_uart.c

@@ -443,6 +443,16 @@ void wardriver_uart_init(Context* ctx) {
 }
 
 void wardriver_uart_deinit(Context* ctx) {
+    furi_hal_serial_async_rx_stop(ctx->serial_handle_esp);
+    furi_hal_serial_deinit(ctx->serial_handle_esp);
+    furi_hal_serial_control_release(ctx->serial_handle_esp);
+
+    if(UART_CH_ESP != UART_CH_GPS) {
+        furi_hal_serial_async_rx_stop(ctx->serial_handle_gps);
+        furi_hal_serial_deinit(ctx->serial_handle_gps);
+        furi_hal_serial_control_release(ctx->serial_handle_gps);
+    }
+
     furi_thread_flags_set(furi_thread_get_id(ctx->thread_esp), WorkerEvtStop);
     furi_thread_join(ctx->thread_esp);
     furi_thread_free(ctx->thread_esp);
@@ -455,13 +465,5 @@ void wardriver_uart_deinit(Context* ctx) {
         furi_stream_buffer_free(ctx->rx_stream_gps);
     }
 
-    furi_hal_serial_deinit(ctx->serial_handle_esp);
-    furi_hal_serial_control_release(ctx->serial_handle_esp);
-
-    if(UART_CH_ESP != UART_CH_GPS) {
-        furi_hal_serial_deinit(ctx->serial_handle_gps);
-        furi_hal_serial_control_release(ctx->serial_handle_gps);
-    }
-
     return;
 }

+ 4 - 3
wifi_deauther/wifi_deauther_uart.c

@@ -91,12 +91,13 @@ WifideautherUart* wifi_deauther_uart_init(WifideautherApp* app) {
 void wifi_deauther_uart_free(WifideautherUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(uart->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 4 - 3
wifi_marauder_companion/wifi_marauder_uart.c

@@ -168,12 +168,13 @@ WifiMarauderUart* wifi_marauder_usart_init(WifiMarauderApp* app) {
 void wifi_marauder_uart_free(WifiMarauderUart* uart) {
     furi_assert(uart);
 
+    furi_hal_serial_async_rx_stop(uart->serial_handle);
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
+
     furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
     free(uart);
 }

+ 1 - 0
wifi_scanner/wifi_scanner.c

@@ -1038,6 +1038,7 @@ int32_t wifi_scanner_app(void* p) {
     // Reset GPIO pins to default state
     furi_hal_gpio_init(&gpio_ext_pc0, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
 
+    furi_hal_serial_async_rx_stop(app->serial_handle);
     furi_hal_serial_deinit(app->serial_handle);
     furi_hal_serial_control_release(app->serial_handle);