Parcourir la source

trying to debug USB hang issues when sending lot of data via second VCP

g3gg0 il y a 2 ans
Parent
commit
3a890e8d3a
3 fichiers modifiés avec 26 ajouts et 14 suppressions
  1. 8 2
      swd_probe_app.c
  2. 17 11
      usb_uart.c
  3. 1 1
      usb_uart.h

+ 8 - 2
swd_probe_app.c

@@ -471,7 +471,10 @@ uint8_t swd_read_memory(AppFSM* const ctx, uint8_t ap, uint32_t address, uint32_
     ret |= swd_read_ap(ctx, ap, MEMAP_DRW, data);
     ret |= swd_read_ap(ctx, ap, MEMAP_DRW, data);
 
 
     if(ret != 1) {
     if(ret != 1) {
+        DBG("read from 0x%08lX failed", address);
         swd_abort(ctx);
         swd_abort(ctx);
+    } else {
+        DBG("read 0x%08lX from 0x%08lX", *data, address);
     }
     }
     return ret;
     return ret;
 }
 }
@@ -705,7 +708,9 @@ static void swd_script_log(ScriptContext* ctx, FuriLogLevel level, const char* f
         size_t pos = strlen(buffer);
         size_t pos = strlen(buffer);
         vsnprintf(&buffer[pos], sizeof(buffer) - pos - 2, format, argp);
         vsnprintf(&buffer[pos], sizeof(buffer) - pos - 2, format, argp);
         strcat(buffer, "\n");
         strcat(buffer, "\n");
-        usb_uart_tx_data(ctx->app->uart, (uint8_t*)buffer, strlen(buffer));
+        if(!usb_uart_tx_data(ctx->app->uart, (uint8_t*)buffer, strlen(buffer))) {
+            DBGS("Sending via USB failed");
+        }
     } else {
     } else {
         LOG(buffer);
         LOG(buffer);
     }
     }
@@ -1815,6 +1820,7 @@ static bool swd_scriptfunc_core_regs(ScriptContext* ctx) {
                     ctx->app, ctx->selected_ap, SCS_DCRSR, SCS_DCRSR_RD | cpu_regs[pos].regsel) ==
                     ctx->app, ctx->selected_ap, SCS_DCRSR, SCS_DCRSR_RD | cpu_regs[pos].regsel) ==
                 1;
                 1;
             succ &= swd_read_memory(ctx->app, ctx->selected_ap, SCS_DCRDR, &core_data) == 1;
             succ &= swd_read_memory(ctx->app, ctx->selected_ap, SCS_DCRDR, &core_data) == 1;
+
             if(!succ) {
             if(!succ) {
                 swd_script_log(ctx, FuriLogLevelDefault, "%08s ----------", cpu_regs[pos].desc);
                 swd_script_log(ctx, FuriLogLevelDefault, "%08s ----------", cpu_regs[pos].desc);
             } else {
             } else {
@@ -2818,7 +2824,6 @@ static void swd_main_loop(AppFSM* ctx) {
     }
     }
 
 
     case ModePageDPRegs:
     case ModePageDPRegs:
-    case ModePageDPID:
     case ModePageAPID: {
     case ModePageAPID: {
         furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever);
         furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever);
         /* set debug enable request */
         /* set debug enable request */
@@ -2863,6 +2868,7 @@ static void swd_main_loop(AppFSM* ctx) {
         break;
         break;
     }
     }
 
 
+    case ModePageDPID:
     case ModePageCoresight:
     case ModePageCoresight:
         furi_delay_ms(50);
         furi_delay_ms(50);
         break;
         break;

+ 17 - 11
usb_uart.c

@@ -76,7 +76,7 @@ static void usb_uart_vcp_deinit(UsbUart* usb_uart, uint8_t vcp_ch) {
     }
     }
 }
 }
 
 
-void usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length) {
+bool usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length) {
     uint32_t pos = 0;
     uint32_t pos = 0;
     while(pos < length) {
     while(pos < length) {
         size_t pkt_size = length - pos;
         size_t pkt_size = length - pos;
@@ -85,14 +85,19 @@ void usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length) {
             pkt_size = USB_CDC_PKT_LEN;
             pkt_size = USB_CDC_PKT_LEN;
         }
         }
 
 
-        if(furi_semaphore_acquire(usb_uart->tx_sem, 100) == FuriStatusOk) {
-            furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk);
-            furi_hal_cdc_send(usb_uart->cfg.vcp_ch, &data[pos], pkt_size);
-            furi_check(furi_mutex_release(usb_uart->usb_mutex) == FuriStatusOk);
-            usb_uart->st.tx_cnt += pkt_size;
-            pos += pkt_size;
+        if(furi_semaphore_acquire(usb_uart->tx_sem, 100) != FuriStatusOk) {
+            return false;
         }
         }
+        if(furi_mutex_acquire(usb_uart->usb_mutex, 100) != FuriStatusOk) {
+            furi_semaphore_release(usb_uart->tx_sem);
+            return false;
+        }
+        furi_hal_cdc_send(usb_uart->cfg.vcp_ch, &data[pos], pkt_size);
+        furi_mutex_release(usb_uart->usb_mutex);
+        usb_uart->st.tx_cnt += pkt_size;
+        pos += pkt_size;
     }
     }
+    return true;
 }
 }
 
 
 static int32_t usb_uart_worker(void* context) {
 static int32_t usb_uart_worker(void* context) {
@@ -118,10 +123,11 @@ static int32_t usb_uart_worker(void* context) {
         }
         }
 
 
         if(events & WorkerEvtCdcRx) {
         if(events & WorkerEvtCdcRx) {
-            furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk);
-            size_t len =
-                furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, &data[remain], USB_CDC_PKT_LEN);
-            furi_check(furi_mutex_release(usb_uart->usb_mutex) == FuriStatusOk);
+            size_t len = 0;
+            if(furi_mutex_acquire(usb_uart->usb_mutex, 100) == FuriStatusOk) {
+                len = furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, &data[remain], USB_CDC_PKT_LEN);
+                furi_mutex_release(usb_uart->usb_mutex);
+            }
 
 
             if(len > 0) {
             if(len > 0) {
                 usb_uart->st.rx_cnt += len;
                 usb_uart->st.rx_cnt += len;

+ 1 - 1
usb_uart.h

@@ -26,4 +26,4 @@ void usb_uart_get_config(UsbUart* usb_uart, UsbUartConfig* cfg);
 
 
 void usb_uart_get_state(UsbUart* usb_uart, UsbUartState* st);
 void usb_uart_get_state(UsbUart* usb_uart, UsbUartState* st);
 
 
-void usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length);
+bool usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length);