rk3568用otg口U盘升级

设备只有一个外露的usb(otg口)出来,平时可切换为host接U盘使用,或者otg可进行adb调试模式。这个口接U盘升级的时候,会升级失败,如果把
dr_mode改成host,就可以正常升级成功:

 但如果dts写死成host模式,开机后就不能切换为otg模式了,不能调试,这样的灵活性不够。dr_mode默认为otg时候,现在基本可以定位到是进入recover模式的时候,不是host状态,识别不到U盘导致升级失败的:

 解决该问题的思路是进入recovery模式时候,在挂载U盘和升级之前,要先切换为host模式。

 recovery.cpp里面的start_recovery函数是入口,在该函数里面实现切换设置。

diff --git a/recovery.cpp b/recovery.cpp
index eda573bc..a7ce5a92 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -75,6 +75,7 @@ static char updatepath[128] = "\0";
 bool bAutoUpdateComplete = false;

 static constexpr const char* CACHE_ROOT = "/cache";
+static const char *OTG_FILE = "/sys/devices/platform/fe8a0000.usb2-phy/otg_mode";

 static bool save_current_log = false;

@@ -1078,6 +1079,13 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
   int arg;
   int option_index;
   int exit_from_factory = 0;
+
+   FILE *fp = fopen(OTG_FILE, "r+");
+   if (fp == NULL) {
+               printf("Can't open %s\n", OTG_FILE);
+  }
+   fputs("host", fp);
+   fclose(fp);
   // Parse everything before the last element (which must be a nullptr). getopt_long(3) expects a
   // null-terminated char* array, but without counting null as an arg (i.e. argv[argc] should be
   // nullptr).

C语言文件操作可参考:https://blog.csdn.net/m0_61213696/article/details/123264172

posted @ 2024-10-25 17:32  M-kobe  阅读(83)  评论(0编辑  收藏  举报