System Flashing
NE503 整机软件分为两层:
| 层级 | 名称 | 内容 | 更新方式 |
|---|---|---|---|
| 系统镜像 | hailo-os | Linux 内核、设备树、根文件系统 | 烧录/升级(本文档) |
| 平台软件 | hailo-ne503 | 平台服务、HAL、Web 控制台 | Software Deployment |
本文档说明系统镜像的首次烧录和后续升级。平台软件的构建和部署请参阅 Software Deployment。
流程概览
根据设备当前状态选择路径:
- 首次部署 / 全量烧录(全新板或引导损坏):§1 准备 → §2 烧引导链 → §3 烧系统镜像 → §4 接口板 MCU 固件 → §5 登录 → §7 验证
- 仅升级系统镜像(设备已能正常启动):§1.3 TFTP → §6.1 升级 → §7 验证
何时跳过 §2: 设备能进入 U-Boot 菜单或已能正常启动到 Linux,说明引导链完好,直接做 §3 或 §6。只有引导损坏(上电无 U-Boot 输出)或全新板才需要 §2。 接口板 MCU 固件(§4)独立于 SoC 系统镜像——
meta-hailo-os包不含 MCU 固件,首次部署必须用 ST-LINK/SWD 单独烧录(详见 §4),否则镜头、补光灯、IR-CUT、PTZ 等外设全部失灵。
1. 准备工作
1.1 固件包
从开源仓库 camthink-ai/meta-hailo-os 下载固件包,解压后包含以下文件。按用途分为两组:
引导链组件(§2 使用,共 9 个)
| 文件 | 用途 |
|---|---|
hailo15_uart_recovery_fw.bin | UART 恢复固件 |
hailo15_scu_bl.bin | SCU 引导加载器 |
scu_bl_cfg_a.bin | SCU 引导配置 |
hailo15_scu_fw.bin | SCU 固件 |
u-boot.dtb.signed | U-Boot 设备树(签名) |
u-boot-spl.bin | U-Boot SPL |
u-boot-initial-env | U-Boot 初始环境变量 |
customer_certificate.bin | 客户证书 |
u-boot-tfa.itb | U-Boot TF-A 镜像 |
| 文件 | 用途 |
|---|---|
fitImage | Linux 内核镜像 |
swupdate-image-hailo15-ne503.ext4.gz | 系统根文件系统 |
hailo-update-image-hailo15-ne503.swu | SWUpdate 升级包 |
接口板 MCU 固件(§4 使用,1 个)
独立于
meta-hailo-os固件包,由 CamThink 单独提供。
| 文件 | 用途 |
|---|---|
ne503_mcu.elf | 接口板 MCU(STM32G0B0RET6)固件 |
1.2 主机工具
仅 §2 烧录引导链 需要;只做 §3/§5 系统镜像烧录或升级的可跳过本节。
§2 引导链烧录支持 Ubuntu 和 macOS(验证的 hailo15_board_tools 版本 1.9.0)。hailo15_board_tools 是跨平台 Python wheel,两个平台的差异只在依赖安装方式和串口设备节点。
关键依赖
mkenvimage: §2.3 的hailo15_spi_flash_program会调用mkenvimage生成 U-Boot env 镜像。若主机未安装,烧录会在写入第 5 个组件(U-Boot env)时崩溃,留下半写的引导链。两个平台都必须先装好——Ubuntu 由apt-get install u-boot-tools提供,macOS 由brew install u-boot-tools提供。
Ubuntu
# Hailo 烧录工具(将 <VERSION> 替换为实际版本号,当前验证版本 1.9.0)
pip install hailo15_board_tools-<VERSION>.whl
# U-Boot 辅助工具(提供 mkenvimage,§2.3 必需)
sudo apt-get update && sudo apt-get install u-boot-tools



macOS
# 1. mkenvimage(§2.3 必需,否则烧录中途崩溃)
brew install u-boot-tools
# 2. 在 venv 中安装 wheel(Homebrew Python 受 PEP 668 限制,不能直接 pip install)
python3 -m venv hailo-venv
./hailo-venv/bin/pip install hailo15_board_tools-<VERSION>.whl
# 之后用 ./hailo-venv/bin/uart_boot_fw_loader 与 ./hailo-venv/bin/hailo15_spi_flash_program
串口设备节点: Ubuntu 一般为
/dev/ttyACM0;macOS 一般为/dev/cu.usbserial-*或/dev/tty.usbserial-*。传入--serial-device-name时用本机实际节点(确认方法见 §1.4 硬件连接)。
接口板 MCU 烧录(§4 需要)
额外需要 ST-LINK 调试器(V2/V3)和 STM32CubeProgrammer(验证版本 2.19.0,使用其 CLI STM32_Programmer_CLI)。从 st.com 下载安装;macOS 安装后 CLI 通常位于 /Applications/STMicroelectronics/STM32Cube/STM32CubeProgrammer/STM32CubeProgrammer.app/Contents/MacOs/bin/STM32_Programmer_CLI。
1.3 TFTP 服务器
系统镜像 较大(100MB+),通过 TFTP 网络协议传输到设备。
Ubuntu
# 安装 TFTP 服务端
sudo apt install tftpd-hpa
# 编辑配置
sudo nano /etc/default/tftpd-hpa
配置内容:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
启动服务并部署镜像文件:
sudo mkdir -p /var/lib/tftpboot
sudo chmod -R 777 /var/lib/tftpboot
sudo systemctl restart tftpd-hpa
# 将固件文件拷贝到 TFTP 目录
cp fitImage swupdate-image-hailo15-ne503.ext4.gz hailo-update-image-hailo15-ne503.swu /var/lib/tftpboot/
macOS
macOS 自带 tftpd,通过 launchd 按需启动:
# 创建固件目录
mkdir -p ~/Downloads/Firmware
chmod 777 ~/Downloads/Firmware
# 写入 launchd 配置
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
# 启动服务
sudo launchctl load -w /Library/LaunchDaemons/com.tftp.local.plist
# 验证
sudo lsof -i :69
将
<USER>替换为你的 macOS 用户名。将固件文件放入~/Downloads/Firmware/目录。 如果 TFTP 报 "Operation not permitted",在 系统设置 → 隐私与安全性 → 完全磁盘访问权限 中添加/usr/libexec/tftpd,或改用/private/tftpboot作为 TFTP 目录。
1.4 硬件连接
- 使用 USB 转串口线连接 NE503 调试串口和主机
NE503 调试串口为 1.8V 电平,需使用 1.8V 兼容的 USB 转串口线(常见 3.3V 串口线可能无法正常通信)。建议从 CamThink 获取配套串口小板。
- 使用网线连接 NE503 网口和主机(直连或同一交换机)
CamThink 串口小板:

接入 NE503 主板:

- 确认串口设备节点:
ls /dev/serial/by-id/* -lh
# 输出示例:usb-1a86_USB_Serial_5B1E071587-if00 -> ../../ttyACM0

下文以
/dev/ttyACM0为例,请根据实际设备节点修改。macOS 下设备节点通常为/dev/tty.usbmodem*或/dev/tty.usbserial*。
打开串口终端(波特率 115200),后续烧录日志、U-Boot 菜单交互与系统登录均在此终端中完成:
# Ubuntu(也可使用 minicom)
screen /dev/ttyACM0 115200
# macOS
screen /dev/tty.usbmodem* 115200
Windows 可使用 SecureCRT 或 PuTTY,波特率同为 115200。退出 screen:依次按
Ctrl+A、K、Y。
拨码开关模式
NE503 通过两个拨码开关(BOOT0、BOOT1)选择上电后的行为。后文涉及拨码操作时只标注模式名,对照此表即可:
| 模式 | BOOT0 | BOOT1 | 何时使用 |
|---|---|---|---|
| UART 恢复(烧引导链) | OFF | ON | 仅 §2 烧录引导链 |
| 正常启动 | OFF | OFF | §3 烧录系统镜像 及以后、日常运行 |
2. 烧录引导链
引导链烧录仅在首次部署或引导损坏时需要。正常使用中跳过此步骤。
2.1 进入 UART 恢复模式
将拨码开关拨到 UART 恢复模式(BOOT0 OFF、BOOT1 ON,见 §1.4 拨码开关模式):

操作步骤:
- 拨到 UART 恢复模式(BOOT0 OFF、BOOT1 ON)
- 通过 PoE(RJ45 网口)为设备上电
- 按下 Reset 复位键,进入烧录等待状态

2.2 加载 UART 恢复固件
uart_boot_fw_loader \
--serial-device-name /dev/ttyACM0 \
--firmware ./hailo15_uart_recovery_fw.bin

2.3 烧录 SPI Flash 引导组件
此步骤将引导链各组件写入 SPI Flash,包括 SCU 固件、U-Boot SPL、设备树等:
hailo15_spi_flash_program \
--scu-bootloader ./hailo15_scu_bl.bin \
--scu-bootloader-config ./scu_bl_cfg_a.bin \
--scu-firmware ./hailo15_scu_fw.bin \
--uboot-device-tree ./u-boot.dtb.signed \
--bootloader ./u-boot-spl.bin \
--bootloader-env ./u-boot-initial-env \
--customer-certificate ./customer_certificate.bin \
--uboot-tfa ./u-boot-tfa.itb \
--uart-load \
--serial-device-name /dev/ttyACM0
预期输出:
UART recovery load firmware and script version: 1.4
flash detected, flash jedec_id: 0x9d701700
Programming SCU firmware file: ./hailo15_scu_fw.bin...
Erasing flash from 0x8000 B to 0x39350 B...
Erased successfully
Storage program validation passed successfully
Provided file ./hailo15_scu_fw.bin was successfully programmed
Programming SCU bootloader file: ./hailo15_scu_bl.bin...
Erasing flash from 0x0 B to 0x2c74 B...
Erased successfully
Storage program validation passed successfully
Provided file ./hailo15_scu_bl.bin was successfully programmed
Programming SCU bootloader config file...
Erasing flash from 0x5000 B to 0x502c B...
Erased successfully
Storage program validation passed successfully
Provided file ./scu_bl_cfg_a.bin was successfully programmed
Programming U-Boot SPL file: ./u-boot-spl.bin...
Erasing flash from 0x54000 B to 0x76a2c B...
Erased successfully
Storage program validation passed successfully
Provided file ./u-boot-spl.bin was successfully programmed
Programming U-Boot env file: ./u-boot-initial-env...
Erasing flash from 0x50000 B to 0x54000 B...
Erased successfully
Storage program validation passed successfully
Provided file ./u-boot-initial-env was successfully programmed
Programming Customer certificate file: ./customer_certificate.bin...
Erasing flash from 0x4f000 B to 0x4fa14 B...
Erased successfully
Storage program validation passed successfully
Provided file ./customer_certificate.bin was successfully programmed
Programming u-boot device-tree file: ./u-boot.dtb.signed...
Erasing flash from 0x40000 B to 0x46d84 B...
Erased successfully
Storage program validation passed successfully
Provided file ./u-boot.dtb.signed was successfully programmed
Programming U-Boot & TF-A file: ./u-boot-tfa.itb...
Erasing flash from 0x80000 B to 0x103e80 B...
Erased successfully
Storage program validation passed successfully
Provided file ./u-boot-tfa.itb was successfully programmed


以上为典型输出。不同工具版本的实际输出可能存在大小写或拼写差异(如
Storage program validatation),且 SCU 引导配置可能写入两次(A/B 冗余槽位)。以每个组件最终打印successfully programmed、进程退出码 0 为成功判据;共 8 个组件应全部编程成功。
烧录完成后,引导链已写入 SPI Flash。将拨码开关恢复为正常模式:
- BOOT0: OFF
- BOOT1: OFF

3. 烧录系统镜像
引导链就绪后,通过 U-Boot 菜单将系统镜像写入 eMMC。
3.1 进入 U-Boot 菜单
确认拨码开关处于 正常模式(BOOT0 OFF、BOOT1 OFF,见 §1.4 拨码开关模式;若刚做完 §2,拨码已恢复为正常模式)。通过 RJ45 端口接入 PoE 上电,板载绿色指示灯闪烁。

设备上电后,在串口终端中按 ↑/↓ 键停止自动启动,进入 U-Boot 菜单:

U-Boot 提供以下启动模式:
| 模式 | 说明 |
|---|---|
| Autodetect | 自动检测并启动(已装系统的设备) |
| Boot from eMMC | 从 eMMC 启动 |
| eMMC Board Init | 首次烧录推荐:烧录单系统到 eMMC |
| eMMC AB Board Init | 烧录冗余双系统到 eMMC |
| U-Boot console | 进入命令行模式 |
3.2 配置网络
U-Boot 默认从 serverip 指向的主机拉取镜像——即你在 §1.3 跑 TFTP 服务的那台:设备 IP 默认 10.0.0.1,serverip 默认 10.0.0.2。烧录前需让运行 TFTP 的主机与设备处于同一网段。根据主机所在网段选择以下任一方式。
方式一(推荐):主机改为 10.0.0.x 网段。 直连时给主机网卡配置静态 IP 10.0.0.2,设备保持默认 10.0.0.1,无需进入 U-Boot console:
# Ubuntu(接口名按实际替换,如 eth0 / enp0s25)
sudo ip addr add 10.0.0.2/24 dev eth0
# macOS:系统设置 → 网络 → 以太网 → 手动配置 IPv4
# IP 地址 10.0.0.2 子网掩码 255.255.255.0
方式二:主机保持在其他网段,改设备 IP 与主机匹配。 在 U-Boot 菜单选择 U-Boot console 进入命令行,用 setenv 修改设备环境变量。下面为默认值(用于确认或重置回默认网络):
setenv ipaddr 10.0.0.1 # 设备 IP(默认)
setenv serverip 10.0.0.2 # TFTP 服务器 (主机)IP(默认)
saveenv
reset
若主机在其他网段(如 192.168.93.x),将上面的
ipaddr/serverip替换为主机网段的地址:确保设备ipaddr与主机同网段,serverip为主机 IP。
3.3 执行烧录
返回 U-Boot 菜单,选择 eMMC Board Init。设备将自动:
- 通过 TFTP 下载
fitImage(内核)到内存 - 通过 TFTP 下载
swupdate-image-hailo15-ne503.ext4.gz(根文件系统)到内存 - 验证镜像签名(RSA-3072 + SHA-256)
- 通过 SWUpdate 应用
.swu升级包,将系统写入 eMMC


三个系统镜像文件的关系:
fitImage(内核)与swupdate-image-hailo15-ne503.ext4.gz(根文件系统)被打包进hailo-update-image-hailo15-ne503.swu(SWUpdate 升级包);eMMC Board Init 通过 TFTP 拉取后,由 SWUpdate 校验签名并写入 eMMC。三者都需放在 §1.3 的 TFTP 目录中。
烧录完成后设备自动重启进入 Linux 系统。
4. 接口板 MCU 固件烧录
接口板上的独立 MCU(STM32G0B0RET6,Cortex-M0+)管理镜头、补光灯、IR-CUT、PTZ、RS-485、报警等全部外设,经 UART0 与核心处理板通信。该 MCU 固件独立于 hailo-os 系统镜像——meta-hailo-os 固件包不含 MCU 固件,必须单独烧录。
不烧会怎样: 外设全部失灵——
camera-daemon镜头桥持续报lens_state_get failed: -2810、device-control查询 MCU 超时、GET /api/v1/device/status返回 500(Web 控制台显示 "internal server error")。
何时需要: 首次部署必须烧录;MCU 固件升级同样用本流程。本步独立于 §2 烧录引导链 / §3 烧录系统镜像 的 SoC 烧录,顺序不限,但都需在 §7 验证 前完成。
4.1 准备
- 硬件:ST-LINK 调试器(V2/V3),接到接口板的 SWD 调试口(PA13/SWDIO、PA14/SWDCLK·BOOT0、NRST、GND、3V3 VREF)。引脚定义见 AIPC Board Connection。

- 供电:设备需上电(PoE)——ST-LINK 不给板子供电,MCU 由设备电源供电;SWD 连上后 VREF 应读到约 3.2V。
- 主机工具:STM32CubeProgrammer(见 §1.2),使用 CLI
STM32_Programmer_CLI。 - 固件:
ne503_mcu.elf(见 §1.1 固件包)。
BOOT0 无需设置——SWD 在正常启动模式下即可编程(PA14 为 SWDCLK/BOOT0 复用引脚)。SoC 只能经
H_GPIO_18复位 MCU、不能控制 BOOT0,因此 MCU 固件必须用 ST-LINK/SWD 烧录,无法仅从 SoC 侧完成。
4.2 确认 SWD 连接
STM32_Programmer_CLI -c port=swd
预期输出(确认读到 STM32G0B0):
Device name : STM32G0B0xx/B1xx/C1xx
Flash size : 512 KBytes
Device CPU : Cortex-M0+
Voltage : 3.22V
若报 No STM32 device found:检查 SWD 线序(SWDIO/SWDCLK/NRST/GND)、确认设备已上电、确认主机识别到 ST-LINK(STM32_Programmer_CLI -l 应列出 probe)。
4.3 烧录
STM32_Programmer_CLI -c port=swd -e all -w ./ne503_mcu.elf -v -rst
依次完成:连接 SWD → 全片擦除 → 写入 ne503_mcu.elf → 校验 → 复位运行。以 Mass erase successfully achieved、File download complete、Application is running、退出码 0 为成功。