USB Recovery (EDL / QDL) from Windows?


#1

Hi,
Has anybody used a Windows tool to do the USB recovery (described in “Using USB flashing tools

There are a few Windows tools out there. I tried XiaoMiFlash tool and it seems to do something, but didn’t fully recover the board.
If anybody knows a way/tool to be able to Recover using Windows, please let me know.

We have moved most of our develop environment from VirtualBox/Ubuntu to Windows/WSL, including kernel build, fastboot, building applications. The only thing left is the recovery. It would be nice if this could be done in Windows too without VM. We need to provide Recovery feature to our customers (only when something really bad happened :wink: but asking customers to install VirtualBox/Ubuntu just for Recovery is a bit overkill.

Thanks,
tamo2


#2

AFAIK, QDL uses the EDL USB serial port (ttyUSB…), so if you’re able to export the Windows COM port to WSL it ‘should’ be possible to use QDL:


#3

Hi @tamo2

I thought you could do complete recovery using the DragonBoard Update Tool that comes with Windows development for the DragonBoard https://docs.microsoft.com/en-ca/windows/iot-core/tutorials/quickstarter/devicesetup This tool will allow you to reinstall the FFU even with a blank eMMC device on the board, from there you can update the build and apps.

-Lawrence- (no longer a Qualcomm employee)
Looking for suitable employment…


#4

Loic, Lawrence,
Thanks for the info! I will take a look!


#5

It’s been for a while, but here is a follow up:

My coworker found a way to make QDL work on WSL.
Here are the steps:

Qdl.c /
     static int tty_open(struct termios *old)
     {
       ...
     #if 1//WSL
       strcpy(path, "/dev/ttyS4"); // On Windows, "Qualcomm HS-USB ADLoader.." appeared as COM4. You may need to change this.
     #else
       ret = find_qdl_tty(path, sizeof(path));
       if (ret < 0) {
         printf("Waiting for QDL tty...\r");
         fflush(stdout);
         sleep(1);
       goto retry;
       }
     #endif
       fd = open(path, O_RDWR | O_NOCTTY | O_EXCL);
     …
     }
firehose.c /
     static int firehose_send_configure(int fd, size_t payload_size, bool skip_storage_init)
     {
       …
     #if 1//WSL
       xml_setpropf(node, "ZLPAwareHost", "%d", 1);
     #else
       xml_setpropf(node, "ZLPAwareHost", "%d", 0);
     #endif
       …
     }

I could not make “DragonBoard Update Tool” work with DB820c. I kept getting “device is not ready” message and couldn’t go any further. I felt like, the tool was checking some ID or something from the HW.


#6

hi,

sorry , the status is not clear to me here. Does it work with WSL for you with this change or not?

Instead of this patch, we could add an extra arg that specifies the path to the device, and when specified we would bypass find_qdl_tty(). If someone makes such a patch, that’s something we can probably merge in our git.


#7

Yes, QDL tool works from WSL.

There are 2 changes needed – serial device name and xml_setpropf.
I think the easiest/simplest would be, adding “–WSL <serial device>” option for bypassing find_qdl_tty() and also setting xml_setpropf to 1.

If that is acceptable, here is the patch.

In my case, QDLoader port appears as COM4 on Windows, so I use “–WSL /dev/ttyS4”.