设备只有一个外露的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).