소스 검색

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 년 전
부모
커밋
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);