System Flashing
The NE503 device software consists of two layers:
| Layer | Name | Contents | Update Method |
|---|---|---|---|
| System Image | hailo-os | Linux kernel, device tree, root filesystem | Flashing/upgrade (this document) |
| Platform Software | hailo-ne503 | Platform services, HAL, Web console | Software Deployment |
This document covers the initial flashing and subsequent upgrades of the system image. For building and deploying platform software, see Software Deployment.
Workflow Overviewβ
Choose a path based on the current state of the device:
- Initial deployment / full flash (new board, or bootloader corrupted): Β§1 Prerequisites β Β§2 Flash Boot Chain β Β§3 Flash System Image β Β§4 System Login β Β§6 Verification
- Upgrade system image only (device already boots normally): Β§1.3 TFTP β Β§5.1 Upgrade β Β§6 Verification
When to skip Β§2: if the device can reach the U-Boot menu or already boots into Linux, the boot chain is intact β go straight to Β§3 or Β§5. You only need Β§2 for a brand-new board or a corrupted bootloader (no U-Boot output on power-up).
1. Prerequisitesβ
1.1 Firmware Packageβ
Obtain the firmware package from CamThink Technical Support. After extraction, it contains the following files, grouped by purpose:
Boot-chain components (used by Β§2, 9 files)
| File | Purpose |
|---|---|
hailo15_uart_recovery_fw.bin | UART recovery firmware |
hailo15_scu_bl.bin | SCU bootloader |
scu_bl_cfg_a.bin | SCU boot configuration |
hailo15_scu_fw.bin | SCU firmware |
u-boot.dtb.signed | U-Boot device tree (signed) |
u-boot-spl.bin | U-Boot SPL |
u-boot-initial-env | U-Boot initial environment variables |
customer_certificate.bin | Customer certificate |
u-boot-tfa.itb | U-Boot TF-A image |
System image (used by Β§3 / Β§5, 3 files)
| File | Purpose |
|---|---|
fitImage | Linux kernel image |
swupdate-image-hailo15-ne503.ext4.gz | System root filesystem |
hailo-update-image-hailo15-ne503.swu | SWUpdate upgrade package |
1.2 Host Toolsβ
Only needed for Β§2 Flash Boot Chain; skip this section if you only do Β§3/Β§5 system-image flashing or upgrades.
Boot-chain flashing in Β§2 supports both Ubuntu and macOS (validated hailo15_board_tools version 1.9.0). hailo15_board_tools is a cross-platform Python wheel; the only differences between the two platforms are how dependencies are installed and the serial device node.
Critical dependency
mkenvimage: thehailo15_spi_flash_programtool in Β§2.3 shells out tomkenvimageto build the U-Boot env image. If not installed, the flash crashes while writing the 5th component (U-Boot env), leaving a half-written boot chain. Both platforms must install it first β Ubuntu provides it viaapt-get install u-boot-tools, macOS viabrew install u-boot-tools.
Ubuntuβ
# Hailo flashing tool (replace <VERSION> with the actual version; validated version is 1.9.0)
pip install hailo15_board_tools-<VERSION>.whl
# U-Boot utilities (provides mkenvimage, required by Β§2.3)
sudo apt-get update && sudo apt-get install u-boot-tools



macOSβ
# 1. mkenvimage (required by Β§2.3, otherwise the flash crashes mid-way)
brew install u-boot-tools
# 2. Install the wheel inside a venv (Homebrew Python is PEP 668 externally-managed; a bare pip install is rejected)
python3 -m venv hailo-venv
./hailo-venv/bin/pip install hailo15_board_tools-<VERSION>.whl
# Then use ./hailo-venv/bin/uart_boot_fw_loader and ./hailo-venv/bin/hailo15_spi_flash_program
Serial device node: Ubuntu is typically
/dev/ttyACM0; macOS is typically/dev/cu.usbserial-*or/dev/tty.usbserial-*. Pass your actual node to--serial-device-name(see Β§1.4 Hardware Connection for how to find it).
1.3 TFTP Serverβ
Required for Β§3 Flash System Image / Β§5 System Upgrade; skip this section if you only do Β§2 boot-chain flashing.
System images are large (100MB+) and must be transferred to the device via TFTP.
Ubuntuβ
# Install TFTP server
sudo apt install tftpd-hpa
# Edit configuration
sudo nano /etc/default/tftpd-hpa
Configuration:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
Start the service and deploy firmware files:
sudo mkdir -p /var/lib/tftpboot
sudo chmod -R 777 /var/lib/tftpboot
sudo systemctl restart tftpd-hpa
# Copy firmware files to TFTP directory
cp fitImage swupdate-image-hailo15-ne503.ext4.gz hailo-update-image-hailo15-ne503.swu /var/lib/tftpboot/
macOSβ
macOS includes tftpd, which runs on-demand via launchd:
# Create firmware directory
mkdir -p ~/Downloads/Firmware
chmod 777 ~/Downloads/Firmware
# Write launchd configuration
sudo tee /Library/LaunchDaemons/com.tftp.local.plist > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.tftp.local</string>
<key>ProgramArguments</key>
<array>
<string>/usr/libexec/tftpd</string>
<string>-i</string>
<string>/Users/<USER>/Downloads/Firmware</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<true/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>tftp</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>
EOF
# Start the service
sudo launchctl load -w /Library/LaunchDaemons/com.tftp.local.plist
# Verify
sudo lsof -i :69
Replace
<USER>with your macOS username. Place firmware files in~/Downloads/Firmware/.If TFTP reports "Operation not permitted", add
/usr/libexec/tftpdto System Settings β Privacy & Security β Full Disk Access, or use/private/tftpbootas the TFTP directory instead.
1.4 Hardware Connectionβ
- Connect the NE503 debug UART to the host using a USB-to-serial adapter
The NE503 debug UART uses 1.8V logic levels. A 1.8V-compatible USB-to-serial adapter is required (common 3.3V adapters may not work reliably). Contact CamThink for the recommended serial adapter board.
- Connect the NE503 Ethernet port to the host (direct cable or same switch)
CamThink serial adapter:

Connected to NE503 board:

- Identify the serial device:
ls /dev/serial/by-id/* -lh
# Example output: usb-1a86_USB_Serial_5B1E071587-if00 -> ../../ttyACM0

The examples below use
/dev/ttyACM0. Replace with your actual device node. On macOS, the device is typically/dev/tty.usbmodem*or/dev/tty.usbserial*.
Open a serial terminal (baud rate 115200). All subsequent flashing logs, U-Boot menu interaction, and system login happen in this terminal:
# Ubuntu (minicom also works)
screen /dev/ttyACM0 115200
# macOS
screen /dev/tty.usbmodem* 115200
On Windows, use SecureCRT or PuTTY at the same 115200 baud rate. To exit screen: press
Ctrl+A, thenK, thenY.
DIP Switch Modesβ
The NE503 uses two DIP switches (BOOT0, BOOT1) to select the power-on behavior. Later sections refer to these modes by name only β check this table:
| Mode | BOOT0 | BOOT1 | When to use |
|---|---|---|---|
| UART recovery (flash boot chain) | OFF | ON | Β§2 Flash Boot Chain only |
| Normal boot | OFF | OFF | Β§3 Flash System Image onward; daily operation |
2. Flash Boot Chainβ
Boot chain flashing is only needed for initial deployment or if the bootloader is corrupted. Skip this step during normal operation.
2.1 Enter UART Recovery Modeβ
Set the DIP switches to UART recovery mode (BOOT0 OFF, BOOT1 ON; see Β§1.4 DIP Switch Modes):

Steps:
- Switch to UART recovery mode (BOOT0 OFF, BOOT1 ON)
- Power on the device via PoE (RJ45 Ethernet port)
- Press the Reset button to enter flashing wait state
