Flash Bootloader¶
This script will flash bootloader to the connected DepthAI device. Bootloader can only be flashed to devices that have flash on-board.
Click on Bootloader for more information.
Demo¶
Example script output
~/depthai-python/examples$ python3 bootloader_version.py
Found device with name: 14442C1031425FD700-ma2480
Version: 0.0.15
Setup¶
Please run the install script to download all required dependencies. Please note that this script must be ran from git context, so you have to download the depthai-python repository first and then run the script
git clone https://github.com/luxonis/depthai-python.git
cd depthai-python/examples
python3 install_requirements.py
For additional information, please follow installation guide
Source code¶
Also available on GitHub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #!/usr/bin/env python3
import depthai as dai
import sys
import time
blType = dai.DeviceBootloader.Type.AUTO
if len(sys.argv) > 1:
if sys.argv[1] == 'usb':
blType = dai.DeviceBootloader.Type.USB
elif sys.argv[1] == 'network':
blType = dai.DeviceBootloader.Type.NETWORK
else:
print("Specify either 'usb' or 'network' bootloader type")
exit()
(found, info) = dai.DeviceBootloader.getFirstAvailableDevice()
if not found:
print("No device found to flash. Exiting.")
exit(-1)
hasBootloader = (info.state == dai.XLinkDeviceState.X_LINK_BOOTLOADER)
if hasBootloader:
print("Warning! Flashing bootloader can potentially soft brick your device and should be done with caution.")
print("Do not unplug your device while the bootloader is flashing.")
print("Type 'y' and press enter to proceed, otherwise exits: ")
if input() != 'y':
print("Prompt declined, exiting...")
exit(-1)
# Open DeviceBootloader and allow flashing bootloader
print(f"Booting latest bootloader first, will take a tad longer...")
with dai.DeviceBootloader(info, allowFlashingBootloader=True) as bl:
currentBlType = bl.getType()
if blType == dai.DeviceBootloader.Type.AUTO:
blType = currentBlType
# Check if bootloader type is the same, if already booted by bootloader (not in USB recovery mode)
if currentBlType != blType and hasBootloader:
print(f"Are you sure you want to flash '{blType.name}' bootloader over current '{currentBlType.name}' bootloader?")
print(f"Type 'y' and press enter to proceed, otherwise exits: ")
if input() != 'y':
print("Prompt declined, exiting...")
exit(-1)
# Create a progress callback lambda
progress = lambda p : print(f'Flashing progress: {p*100:.1f}%')
print(f"Flashing {blType.name} bootloader...")
startTime = time.monotonic()
(res, message) = bl.flashBootloader(dai.DeviceBootloader.Memory.FLASH, blType, progress)
if res:
print("Flashing successful. Took", time.monotonic() - startTime, "seconds")
else:
print("Flashing failed:", message)
|
Also available on GitHub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <chrono>
#include <string>
#include "depthai/depthai.hpp"
#include "depthai/xlink/XLinkConnection.hpp"
int main(int argc, char** argv) {
using namespace std::chrono;
dai::DeviceBootloader::Type blType = dai::DeviceBootloader::Type::AUTO;
if(argc > 1) {
std::string blTypeStr(argv[1]);
if(blTypeStr == "usb") {
blType = dai::DeviceBootloader::Type::USB;
} else if(blTypeStr == "network") {
blType = dai::DeviceBootloader::Type::NETWORK;
} else {
std::cout << "Specify either 'usb' or 'network' bootloader type\n";
return 0;
}
}
bool found = false;
dai::DeviceInfo info;
std::tie(found, info) = dai::DeviceBootloader::getFirstAvailableDevice();
if(!found) {
std::cout << "No device found to flash. Exiting." << std::endl;
return -1;
}
bool hasBootloader = (info.state == X_LINK_BOOTLOADER);
if(hasBootloader) {
std::cout << "Warning! Flashing bootloader can potentially soft brick your device and should be done with caution." << std::endl;
std::cout << "Do not unplug your device while the bootloader is flashing." << std::endl;
std::cout << "Type 'y' and press enter to proceed, otherwise exits: ";
if(std::cin.get() != 'y') {
std::cout << "Prompt declined, exiting..." << std::endl;
return -1;
}
}
// Open DeviceBootloader and allow flashing bootloader
std::cout << "Booting latest bootloader first, will take a tad longer..." << std::endl;
dai::DeviceBootloader bl(info, true);
auto currentBlType = bl.getType();
if(blType == dai::DeviceBootloader::Type::AUTO) {
blType = currentBlType;
}
// Check if bootloader type is the same, if already booted by bootloader (not in USB recovery mode)
if(currentBlType != blType && hasBootloader) {
std::cout << "Are you sure you want to flash '" << blType << "' bootloader over current '" << currentBlType << "' bootloader?" << std::endl;
std::cout << "Type 'y' and press enter to proceed, otherwise exits: ";
std::cin.ignore();
if(std::cin.get() != 'y') {
std::cout << "Prompt declined, exiting..." << std::endl;
return -1;
}
}
// Create a progress callback lambda
auto progress = [](float p) { std::cout << "Flashing Progress..." << p * 100 << "%" << std::endl; };
std::cout << "Flashing " << blType << " bootloader..." << std::endl;
auto t1 = steady_clock::now();
bool success = false;
std::string message;
std::tie(success, message) = bl.flashBootloader(dai::DeviceBootloader::Memory::FLASH, blType, progress);
if(success) {
std::cout << "Flashing successful. Took " << duration_cast<milliseconds>(steady_clock::now() - t1).count() << "ms" << std::endl;
} else {
std::cout << "Flashing failed: " << message << std::endl;
}
return 0;
}
|
Got questions?
We’re always happy to help with code or other questions you might have.