I like to understand rather than skipping to the solution
Ok, let's look at the log.
The log contains several updates, new ones are appended at the end.
The log on SD-card is just a copy of a log stored internally within NAND connected to Ambarella, so it may contain old updates at top, not only the ones you performed with the current SD-card. Ambarella stores the log internally, and then copies it to SD-card near the end of update process.
So let's start:
Code:
[00014971]========== remo-con disconnect. boot(15) ============
[00015029]Packet [C:\P3X_FW_V01.11.0020.bin] detected, card sn [0xda946925].
[00015078]Packet upgrade start...
During boot, Ambarella found a file on SD-card which looks like a firmware update. Ambarella reads that file:
Code:
[00015136]Packet checking...
[00015190]Packet vlink 01.11.0020 <-> 01.11.0020.
[00015272]Done.
Ambarella compares the FW package version from new file with something, not sure what 'vlink' is; sometimes the 'vlink' states previous version of FW package, sometimes not. Here, I'm pretty sure previous version of the FW package was v01.06.0060, but version shown was different.. anyway, the version directly after word 'vlink' is the one found in new file.
So now we go into the most interesting part:
Code:
[00015328]Version checking[1]...
[00015422][03 06][00] v2.4.20.50 -> v2.4.20.50
[00015507][03 05][00] v34.2.0.9 -> v34.2.0.9
[00015565][04 00][00] v1.48.0.0 -> v1.48.0.0
[00015707][11 00][00] v1.8.0.0 -> v1.8.0.0
[00016042][11 01][00] v1.8.0.0 -> v2.0.0.33, firmware v1.8.0.0 not support.
[00016093][11 01][00] v1.8.0.0 -> v2.0.0.33
[00016200][12 00][00] v1.12.0.0 -> v1.12.0.0
[00016312][12 01][00] v1.12.0.0 -> v1.12.0.0
[00016420][12 02][00] v1.12.0.0 -> v1.12.0.0
[00016519][12 03][00] v1.12.0.0 -> v1.12.0.0
[00029068][15 00][00] device not detected.
[00029173][17 00][00] v1.1.1.7 -> v1.1.1.7
[00029338][17 01][00] v1.0.2.7 -> v1.0.2.7
[00029405][19 00][00] v1.0.8.96 -> v1.0.8.96
[00029456][01 00][00] v1.32.5432 -> v1.32.5432
[00029513][01 01][00] v1.32.5432 -> v1.32.5432
[00042062][08 00][00] device not detected.
[00042145][09 00][00] v2.13.0.0 -> v4.1.0.0 need upgrade.
[00042202]Done.
So what we have here is:
Code:
[timestamp][module][instance] <current_fw> -> <new_fw>
Timestamp is in milliseconds and time 0 was when the device was turned on. Instance is always 0 as every device in Phantom 3 is present exactly once, there is no redundancy for modules.
Now, what are the modules? This is the most important question for understanding all DJI drones.
DJI drones have several processors, linked into internal network. Each processor is different, manufactured by different company, with different architecture, has its own programming (its own firmware), its own power delivery system, its own RAM and "hard disk" (which is just NAND flash memory). So every 'module' is a separate computer, which boots and works independently of others. These computers are exchanging information and cooperating, of course, but each one boots separately from its own firmware, and automatically starts applications depending on its function.
So what you're getting from DJI as "firmware" is really a collection of different firmwares, packed together into one file - this is why I call it 'firmware package'. The version of that package isn't really that important for each module - firmware of every module is developed separately within DJI, different people work on them and they release their firmware modules with their own versions. So what each module knows and cares about is the module version, not package version.
On the modules, for example, let's look at
Ambarella chip. The same chip you will find in most GoPros and other Action Cams. This is the chip which is actually responsible for controlling the firmware update process - it finds FW package on sd-card, extracts that, and distributes to all other modules if they need an update. But Ambarella is also a module, it's
m0100 to be exact (we tend to write modules as mXXXX instead of '[XX XX]' as most tools for handling firmware use that convention).
Ambarella knows what version of firmware it uses - it can "ask itself" for that. But for other modules - Ambarella doesn't know. They're separate entities after all. But Ambarella knows identifiers (addresses) of all the modules, and they are all connected into internal network within the drone. So Ambarella starts asking all modules for their firmware version (not FW package version, but FW module version of their respective modules).
And this is what we have in that log. Information about how each module responded when asked about FW version, compared to the version found within FW package file.
Now, there is one problem - some modules have "device not detected" - they did not responded on the query from Ambarella. So they're either not connected to the internal network, or are not booting, or crashing, and therefore cannot respond.
Which modules have that issue?
m1500 and
m0800. One is Cypress chip, the other is DaVinci chip. And it so happens that communication to Cypress (m1500) is routed through DaVinci (m0800). So Cypress probably isn't dead, it just cannot respond because DaVinci is not forwarding the messages to it. So the only issue seem to be that DaVinci isn't responding to queries from Ambarella.
Anyway, continuing explanation of the log next we have:
Code:
[00044254]Waiting for user confirm...
[00054300]Timeout, start upgrade automatically.
[00054400]Firmware upgrading[1]...
[00054472][09 00] Firmware upgrade start...
[00106683][09 00] Firmware upgrade finished successfully.
[00106729]Done.
Which means Ambarella waits 54.300-44.254 = 10 seconds, but since there is no keyboard connected to Ambarella there is no input in that time, and then Ambarella starts updating the modules which require an update.
It finds only
m0900 eligible for update, so it only updates this one module. The rest is already at expected version, and the modules which are not responding cannot be updated.
Why the "device not found" modules cannot be updated? Because Ambarella cannot ask them to update. They're not responding. They're not accepting requests. It's like you tried to update your PC through network while it crashes on startup. You can't - it won't download the update from network if it cannot boot to operating system.
Back to the update log, now we have:
Code:
[00106785]Version checking[2]...
[00106869][03 06][00] v2.4.20.50 -> v2.4.20.50
[00106949][03 05][00] v34.2.0.9 -> v34.2.0.9
[00107003][04 00][00] v1.48.0.0 -> v1.48.0.0
[00107130][11 00][00] v1.8.0.0 -> v1.8.0.0
[00107249][11 01][00] v1.8.0.0 -> v2.0.0.33, firmware v1.8.0.0 not support.
[00107366][11 01][00] v1.8.0.0 -> v2.0.0.33
[00107479][12 00][00] v1.12.0.0 -> v1.12.0.0
[00107581][12 01][00] v1.12.0.0 -> v1.12.0.0
[00107704][12 02][00] v1.12.0.0 -> v1.12.0.0
[00107815][12 03][00] v1.12.0.0 -> v1.12.0.0
[00120366][15 00][00] device not detected.
[00120459][17 00][00] v1.1.1.7 -> v1.1.1.7
[00120601][17 01][00] v1.0.2.7 -> v1.0.2.7
[00120695][19 00][00] v1.0.8.96 -> v1.0.8.96
[00120745][01 00][00] v1.32.5432 -> v1.32.5432
[00120807][01 01][00] v1.32.5432 -> v1.32.5432
[00133361][08 00][00] device not detected.
[00133441][09 00][05] v4.1.0.0 -> v4.1.0.0
[00133490]Packet upgrade failed at version checking.
So after Ambarella updated one module, it tried ask every module for its version again, hoping something will unstuck. But it didn't - m0800 is still dead. So Ambarella declared that firmware update failed, there isn't much more it can do.
And that's the whole log for one boot. There were a few reboots after that, but these go with the same pattern I already explained.