This is an automated email from the ASF dual-hosted git repository.

jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git

commit 9df322d9389fbe60e27a441d63df852364d523d0
Author: wangjianyu3 <wangjian...@xiaomi.com>
AuthorDate: Tue Jun 24 18:50:18 2025 +0800

    system/fastboot: add disconn for usb transport
    
    Disconnect usbdev when deinit USB transport.
    
    Signed-off-by: wangjianyu3 <wangjian...@xiaomi.com>
---
 system/fastboot/fastboot.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/system/fastboot/fastboot.c b/system/fastboot/fastboot.c
index 190040e55..c34bc2379 100644
--- a/system/fastboot/fastboot.c
+++ b/system/fastboot/fastboot.c
@@ -169,6 +169,7 @@ struct fastboot_ctx_s
    */
 
   uint64_t left;
+  FAR void *handle;
   FAR void *download_buffer;
   FAR struct fastboot_var_s *varlist;
   CODE int (*upload_func)(FAR struct fastboot_ctx_s *);
@@ -1157,7 +1158,6 @@ static int fastboot_usbdev_initialize(FAR struct 
fastboot_ctx_s *ctx)
 #  else
     uint8_t dev = BOARDIOC_USBDEV_FASTBOOT;
 #  endif
-  FAR void *handle;
   int ret;
 
   ctrl.usbdev   = dev;
@@ -1177,7 +1177,7 @@ static int fastboot_usbdev_initialize(FAR struct 
fastboot_ctx_s *ctx)
   ctrl.action   = BOARDIOC_USBDEV_CONNECT;
   ctrl.instance = 0;
   ctrl.config   = 0;
-  ctrl.handle   = &handle;
+  ctrl.handle   = &ctx->handle;
 
   ret = boardctl(BOARDIOC_USBDEV_CONTROL, (uintptr_t)&ctrl);
   if (ret < 0)
@@ -1208,6 +1208,9 @@ static int fastboot_usbdev_initialize(FAR struct 
fastboot_ctx_s *ctx)
 
 static void fastboot_usbdev_deinit(FAR struct fastboot_ctx_s *ctx)
 {
+#ifdef CONFIG_SYSTEM_FASTBOOTD_USB_BOARDCTL
+  struct boardioc_usbdev_ctrl_s ctrl;
+#endif
   int i;
 
   for (i = 0; i < nitems(ctx->tran_fd); i++)
@@ -1215,6 +1218,27 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
       close(ctx->tran_fd[i]);
       ctx->tran_fd[i] = -1;
     }
+
+#ifdef CONFIG_SYSTEM_FASTBOOTD_USB_BOARDCTL
+  if (ctx->handle)
+    {
+#  ifdef CONFIG_USBDEV_COMPOSITE
+      ctrl.usbdev   = BOARDIOC_USBDEV_COMPOSITE;
+#  else
+      ctrl.usbdev   =  BOARDIOC_USBDEV_FASTBOOT;
+#  endif
+      ctrl.action   = BOARDIOC_USBDEV_DISCONNECT;
+      ctrl.instance = 0;
+      ctrl.config   = 0;
+      ctrl.handle   = &ctx->handle;
+
+      i = boardctl(BOARDIOC_USBDEV_CONTROL, (uintptr_t)&ctrl);
+      if (i < 0)
+        {
+          fb_err("boardctl(BOARDIOC_USBDEV_DISCONNECT) failed: %d\n", i);
+        }
+    }
+#endif /* SYSTEM_FASTBOOTD_USB_BOARDCTL */
 }
 
 static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,

Reply via email to