烧写与量产工具
本文档介绍 fw-AC63_GP_MCU SDK 中与固件烧写、产测与量产相关的工具链及其使用流程,覆盖 sdk/bsp/<芯片型号>/tools/ 目录下的下载脚本、配置文件与产物生成链路,以及量产烧写器(一拖二 / 一拖八 / 蓝牙测试盒)的固件兼容性约束。
Purpose and Scope
本文档面向需要使用 AC63 系列芯片(AC632N / AC635N / AC636N / AC638N)进行固件下载、裸片烧写或量产交付的开发与产线工程人员,说明:
- SDK 内置的烧写工具链组成(
isd_download.exe、fw_add.exe、ufw_maker.exe及配套 loader / uboot / 脚本文件); download.bat从 ELF 编译产物到可烧写镜像(app.bin→.fw→.ufw)的完整流水线;isd_config.ini中影响下载行为、flash 分区、uboot 配置与量产工具版本校验的关键配置项;- 量产工具(一拖二烧写器、一拖八烧写器、蓝牙测试盒)与固件的版本匹配机制。
烧录后运行时的设备行为(uboot 启动、OTA 升级、VM 分区读写)属于运行时固件范畴,不在本文档展开;如需了解 OTA 升级流程,请参见 SDK 开发文档中"升级"相关章节。生产烧写工具硬件的申请入口见 README.md。
Overview
AC63 系列通用 MCU 的固件烧写采用"上位机工具 + 芯片内置引导"的模式:PC 端通过 isd_download.exe 与芯片建立通信,将 uboot 引导程序和应用程序(app.bin)写入片外 SPI NOR Flash,再生成可被量产工具识别的固件包(.fw)与升级包(.ufw)。
整个烧写体系围绕 tools/ 目录组织,每个芯片型号(AC632N、AC635N 等)都有独立的一套工具文件,其中最关键的是两个入口:
download.bat— 一键式下载脚本,开发者编译出sdk.elf后双击即可完成"切段 → 合并 → 下载 → 打版本 → 生成升级包"的完整流程;isd_config.ini— 下载工具的配置文件,声明芯片型号、程序入口地址、PID/VID、下载通道(USB/串口)、uboot 的 SPI flash 参数、flash 空间分区策略以及量产工具最低版本要求。
设计意图上,这种"脚本 + 配置文件"分离的结构让开发者无需修改工具本身,即可通过编辑 .ini 适配不同方案(不同 flash、不同 IO、不同波特率),同时通过 TOOL_CONFIG 段强制产线工具版本与固件特性对齐,避免旧版烧写器因不认识新版分区/选项而产生坏片。
Architecture
下图展示烧写工具链的整体架构:左侧为 SDK 编译产物,中间为 tools/ 目录中的工具与配置,右侧为输出的固件产物及其消费方(量产烧写器 / OTA 升级)。
flowchart TD
subgraph sg_Build["编译产物 (../output)"]
ELF["sdk.elf"]
end
subgraph sg_Tools["tools 目录 (sdk/bsp/AC63xx/tools)"]
OBJCOPY["llvm-objcopy.exe"]
ISD["isd_download.exe"]
FWADD["fw_add.exe"]
UFWMAKER["ufw_maker.exe"]
CFG["isd_config.ini"]
UBOOT["uboot.boot / uboot_no_ota.boot"]
LOADER["bd19loader.bin / br23loader.bin"]
VER["script.ver"]
end
subgraph sg_Out["烧写产物"]
APPBIN["app.bin"]
FW["jl_isd.fw"]
UFW["update.ufw"]
end
subgraph sg_Prod["产线工具"]
T2["一拖二烧写器 (>= 2.25.8)"]
T8["一拖八烧写器 (>= 3.1.7)"]
BTBOX["蓝牙测试盒 (>= 1.2.7)"]
end
ELF -->|"objcopy 按段切出"| OBJCOPY
OBJCOPY -->|"text/data/data_code 合并"| APPBIN
ISD -->|"读取烧写参数"| CFG
ISD -->|"加载引导/uboot"| LOADER
ISD -->|"加载 uboot 镜像"| UBOOT
ISD -->|"写入"| APPBIN
ISD -->|"生成"| FW
FWADD -->|"注入 script.ver"| FW
UFWMAKER -->|"fw_to_ufw 转换"| FW
UFWMAKER -->|"生成"| UFW
FW -->|"量产烧写固件"| T2
FW -->|"量产烧写固件"| T8
UFW -->|"产测/升级"| BTBOX
各环节职责如下:
| 环节 | 角色 | 职责 |
|---|---|---|
llvm-objcopy.exe | 段切分工具 | 从 sdk.elf 中按 .text / .data / .data_code 段导出二进制 |
isd_download.exe | 核心下载工具 | 依据 isd_config.ini 通过 USB/串口将 uboot 与 app 写入片外 Flash,并产出 .fw 固件包 |
fw_add.exe | 版本注入工具 | 将 script.ver 配置脚本版本信息写入 .fw 文件 |
ufw_maker.exe | 升级包生成工具 | 将 .fw 转换为 .ufw 升级文件(即 update.ufw) |
isd_config.ini | 配置中心 | 定义芯片型号、入口地址、下载通道、uboot SPI 参数、flash 分区与量产工具版本门槛 |
*loader.bin / uboot*.boot | 引导镜像 | 下载器与芯片建立通信后先加载的引导/uboot 代码 |
| 量产烧写器 / 测试盒 | 产线消费方 | 直接烧写 .fw 或通过 .ufw 做产测升级 |
说明:
download.bat与isd_config.ini在 AC632N 与 AC635N 的tools/目录下各有一份,二者流程一致,仅芯片型号、loader 与启动参数(-boot)不同。本文以 AC635N 为例详细讲解,AC632N 的差异在相应小节说明。
烧写流水线详解
1. ELF 段切分与 app.bin 合成
download.bat 的第一步是检查工具链与编译产物是否存在,然后调用 llvm-objcopy 将 sdk.elf 中的三个关键段分别导出为独立二进制:
if not exist %OBJCOPY% goto download
if not exist %ELFFILE% goto download
%OBJCOPY% -O binary -j .text %ELFFILE% ../output/text.bin
%OBJCOPY% -O binary -j .data %ELFFILE% ../output/data.bin
%OBJCOPY% -O binary -j .data_code %ELFFILE% ../output/data_code.bin
%OBJDUMP% -section-headers -address-mask=0x1ffffff %ELFFILE%
%OBJSIZEDUMP% -skip-zero -lite -enable-dbg-info %ELFFILE% >symbol_tbl.txt
copy /b ..\output\text.bin+..\output\data.bin+..\output\data_code.bin ..\output\app.bin
copy ..\output\app.bin app.bin
Source: download.bat
设计意图:
- 按段切分再合并 而不是直接
objcopy -O binary sdk.elf app.bin,是为了精确控制三个段的链接顺序与边界,保证.text(代码)、.data(已初始化数据)、.data_code(可放 RAM 执行的代码)在 flash 中的布局与链接脚本一致; -address-mask=0x1ffffff使llvm-objdump输出 25 位地址掩码下的段头信息,配合symbol_tbl.txt符号表用于异常地址定位(对应 tools 目录中的定位异常地址.bat);if not exist守卫让脚本在缺少工具链或未编译时跳过切段,直接进入下载分支,避免报错中断。
2. isd_download 下载与 .fw 生成
第二步调用 isd_download.exe 完成实际烧写,并生成固件包:
set output_base_name=jl_isd
isd_download.exe isd_config.ini -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -output %output_base_name% -uboot uboot.boot -app app.bin -uboot_compress
Source: download.bat
命令行关键参数含义:
| 参数 | AC635N 取值 | AC632N 取值 | 说明 |
|---|---|---|---|
-tonorflash | — | — | 目标介质为片外 SPI NOR Flash |
-dev | br23 | bd19 | 芯片/loader 型号,决定使用 br23loader.bin 或 bd19loader.bin |
-boot | 0x12000 | 0x2000 | uboot 在 flash 中的起始地址 |
-div8 | — | — | 下载时钟分频(配合低速/兼容性场景) |
-wait 300 | — | — | 等待/超时时间(毫秒级) |
-output jl_isd | — | — | 输出文件基名,生成 jl_isd.fw |
-uboot uboot.boot | — | — | 指定写入的 uboot 镜像 |
-app app.bin | — | — | 指定写入的应用程序镜像 |
-res p11_code.bin | 无 | 有 | 附加资源文件(仅 AC632N) |
-uboot_compress | — | — | uboot 镜像压缩写入 |
-reboot 500 | 无 | 有 | 下载完成后延时 500ms 复位芯片 |
download.bat 中还注释了常用的扩展烧写命令,例如 -format vm(擦除 VM 区域)与 -format 0x3f0-2(从第 0x3f0 个 sector 起连续擦除 2 个 sector),用于产线定制化擦除。
3. 版本注入与升级包生成
@rem 添加配置脚本的版本信息到 FW 文件中
fw_add.exe -noenc -fw %output_base_name%.fw -add script.ver -out %output_base_name%.fw
ufw_maker.exe -fw_to_ufw %output_base_name%.fw
copy %output_base_name%.ufw update.ufw
del %output_base_name%.ufw
Source: download.bat
fw_add.exe -noenc将script.ver中的版本信息以明文方式追加进.fw文件(-noenc表示不加密),产线工具/测试盒据此识别固件版本;ufw_maker.exe -fw_to_ufw把.fw转换为update.ufw升级文件,并复制为update.ufw供 OTA 升级或产测使用;- 使用
copy + del而非rename,保证工作目录中始终存在名为update.ufw的标准升级包。
isd_config.ini 配置解析
isd_config.ini 是下载工具的配置中心,按 [段] 组织,采用 KEY=VALUE; 语法(// 或 # 为注释)。文件头部注释明确说明:配置数据按照"长度 + 配置名字 + 数据"的方式存储,即工具解析时按固定格式读取,因此段内键的顺序不可随意调整(尤其 [SYS_CFG_PARAM] 段注释有"请勿随意调整顺序"的警告)。
[EXTRA_CFG_PARAM] — 芯片与产品标识
[EXTRA_CFG_PARAM]
NEW_FLASH_FS=YES;
FORCE_VM_ALIGN=YES;
CHIP_NAME=AC635N;//芯片型号
ENTRY=0x1E00100;//程序入口地址
PID=AC635N_GP;//长度16byte,示例:芯片封装_应用方向_方案名称
VID=0.01;
SDK_VERSION=AC635N_GP_V1.1.0;
Source: isd_config.ini
ENTRY是程序入口地址,与链接脚本一致,下载器据此校验镜像合法性;PID(产品标识,16 字节)与VID(版本)用于产线区分不同方案固件,PID命名规范为"芯片封装_应用方向_方案名称"(如AC635N_GP);NEW_FLASH_FS/FORCE_VM_ALIGN控制新版 flash 文件系统与 VM 对齐策略,二者开启后要求烧写器与固件配套,这也是TOOL_CONFIG中版本门槛存在的原因之一。
[SYS_CFG_PARAM] — uboot 与硬件参数
[SYS_CFG_PARAM]
SPI=2_3_0_1; #width_clk_mode_port;
RESET=PB01_00_0; //port口_长按时间_有效电平
UPDATE_JUMP=0; //是否支持升级过程中维持IO电平
VLVD=4;//VDDIO_LVD挡位
FLASH_BIN_CNT=6;
EOFFSET=1;//n*4k
Source: isd_config.ini
SPI=width_clk_mode_port:uboot 识别片外 flash 的四元组,3表示 data width 为 3 时 uboot 自动识别 2/4 线;port决定片选/时钟/数据线端口组(A 口或 B 口),注释中给出了 A/B 端口的引脚映射;RESET:复位引脚与长按时间、有效电平配置(长按时间可选 00/01/02/04/08 秒,00关闭长按复位);UPDATE_JUMP:升级过程中是否维持 IO 电平,用于依赖 IO 口供电的方案;VLVD:VDDIO 低压检测挡位(0~7 对应 1.9V~2.6V);FLASH_BIN_CNT、EOFFSET:flash 分区粒度(4K 对齐)相关的镜像计数与偏移。
[RESERVED_CONFIG] — flash 空间分区
[RESERVED_CONFIG]
PRCT_ADR=0;
PRCT_LEN=CODE_LEN;
PRCT_OPT=2;
VM_ADR=0;
VM_LEN=8K;
VM_OPT=1;
Source: isd_config.ini
每个区域由 XXX_ADR(起始地址,AUTO 表示由工具自动分配)、XXX_LEN(长度,CODE_LEN 表示等于代码长度)、XXX_OPT(操作属性)三个键描述。OPT 取值:0 = 下载代码时擦除该区域,1 = 下载时不操作该区域,2 = 下载时给该区域加上保护。上例中:
PRCT(产品码区域)长度为代码长度且加保护(OPT=2),保证产品标识不被下载覆盖;VM(虚拟机参数区)固定 8K 且下载时不操作(OPT=1),避免重烧时丢失用户参数。
[TOOL_CONFIG] — 量产工具版本门槛
[TOOL_CONFIG]
1TO2_MIN_VER = 2.25.8 # 一拖二烧写器最低版本
1TO8_MIN_VER = 3.1.7 # 一拖八烧写器最低版本
BTBOX_MIN_VER = 1.2.7 # 蓝牙测试盒最低版本
Source: isd_config.ini
该段定义了支持本固件的产线工具最低版本,注释标明"请勿修改"。这是固件与工具之间的兼容性契约:当固件引入了新的 flash 分区选项、uboot 参数或加密方式时,通过提高门槛强制产线升级烧写器,防止旧工具烧出功能缺失或损坏的固件。[BURNER_CONFIG] SIZE=32 则定义了烧写器相关容量参数。
[CHIP_VERSION] 与下载通道
[CHIP_VERSION]
SUPPORTED_LIST=A,B,D
#DOWNLOAD_MODEL=SERIAL;//usb
DOWNLOAD_MODEL=usb;
SERIAL_DEVICE_NAME=JlVirtualJtagSerial;
SERIAL_BARD_RATE=1000000;
Source: isd_config.ini
SUPPORTED_LIST声明匹配的芯片版本,注释明确"请勿随意修改";DOWNLOAD_MODEL=usb选择 USB 下载通道(可切换为SERIAL);串口通道下还需配置虚拟串口设备名JlVirtualJtagSerial、波特率(SERIAL_BARD_RATE/SERIAL_INIT_BAUD_RATE9600 /LOADER_BAUD_RATE)、命令选项SERIAL_CMD_OPT及BEFORE_LOADER_WAIT_TIME等参数,用于兼容不同 JTAG/串口桥接硬件。
Core Flow — 从编译到可烧写产物的完整流程
flowchart TD
Start([编译工程]) --> ELF["生成 sdk.elf"]
ELF --> CHECK{"objcopy/elf 存在?"}
CHECK -->|"否"| SKIP["跳过切段, 直接下载"]
CHECK -->|"是"| SPLIT["objcopy 切出 text.bin / data.bin / data_code.bin"]
SPLIT --> SYM["objdump/objsizedump 输出符号表 symbol_tbl.txt"]
SYM --> MERGE["copy /b 合并三段 -> app.bin"]
MERGE --> ISD["isd_download.exe 读取 isd_config.ini"]
ISD --> LOAD["加载 loader 与芯片握手 (USB/串口)"]
LOAD --> UBOOT_W["写入 uboot.boot (压缩)"]
UBOOT_W --> APP_W["写入 app.bin 至片外 NOR Flash"]
APP_W --> FW["生成 jl_isd.fw"]
FW --> VER["fw_add.exe 注入 script.ver 版本"]
VER --> UFW["ufw_maker.exe 转 update.ufw"]
UFW --> PROD["量产烧写器/测试盒消费 .fw / .ufw"]
SKIP --> ISD
各步骤说明(按调试/扩展时的排查顺序):
- 编译:工程编译产出
../output/sdk.elf,是后续一切产物的唯一来源; - 守卫检查:
download.bat通过if not exist判断llvm-objcopy与sdk.elf是否存在,缺失时跳过切段直接进入:download标签,保证脚本在未编译或工具链未安装时也能给出明确的下载尝试而非中断; - 段切分与符号表:
.text/.data/.data_code分别导出,同时生成symbol_tbl.txt符号表,供定位异常地址.bat在产线异常时反查崩溃地址对应的函数; - 合并:
copy /b按二进制模式按.text + .data + .data_code顺序拼接成app.bin,顺序必须与链接脚本的内存布局一致; - 下载:
isd_download.exe依据isd_config.ini先通过 loader(bd19loader.bin/br23loader.bin)与芯片建立通信,再写入压缩后的 uboot 与应用镜像; - 固件打包:
jl_isd.fw是量产烧写器直接使用的固件包,fw_add.exe将script.ver版本信息附加进.fw,使产线工具能校验/展示版本; - 升级包:
ufw_maker.exe将.fw转成update.ufw,供 OTA 与蓝牙测试盒产测使用。
Usage Examples
示例 1:AC635N 一键烧写脚本(完整)
实际项目中,开发者编译完成后直接运行 sdk/bsp/AC635N/tools/download.bat 即可完成全部烧写与打包:
@echo off
Setlocal enabledelayedexpansion
@echo ********************************************************************************
@echo SDK AC635N
@echo ********************************************************************************
@echo %date%
cd /d %~dp0
set OBJDUMP=C:\JL\pi32\bin\llvm-objdump.exe
set OBJCOPY=C:\JL\pi32\bin\llvm-objcopy.exe
set ELFFILE=../output/sdk.elf
set OBJSIZEDUMP=C:\JL\pi32\bin\llvm-objsizedump.exe
if not exist %OBJCOPY% goto download
if not exist %ELFFILE% goto download
%OBJCOPY% -O binary -j .text %ELFFILE% ../output/text.bin
%OBJCOPY% -O binary -j .data %ELFFILE% ../output/data.bin
%OBJCOPY% -O binary -j .data_code %ELFFILE% ../output/data_code.bin
%OBJDUMP% -section-headers -address-mask=0x1ffffff %ELFFILE%
%OBJSIZEDUMP% -skip-zero -lite -enable-dbg-info %ELFFILE% >symbol_tbl.txt
copy /b ..\output\text.bin+..\output\data.bin+..\output\data_code.bin ..\output\app.bin
copy ..\output\app.bin app.bin
:download
set output_base_name=jl_isd
isd_download.exe isd_config.ini -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -output %output_base_name% -uboot uboot.boot -app app.bin -uboot_compress
@rem 常用命令说明
@rem -format vm //擦除VM 区域
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector
fw_add.exe -noenc -fw %output_base_name%.fw -add script.ver -out %output_base_name%.fw
ufw_maker.exe -fw_to_ufw %output_base_name%.fw
copy %output_base_name%.ufw update.ufw
del %output_base_name%.ufw
Source: download.bat
示例 2:AC632N 与 AC635N 的芯片差异
对比两个型号的下载命令,可看出工具链如何通过命令行参数适配不同芯片:
:: AC632N —— loader 型号 bd19,boot 地址 0x2000,附加资源 p11_code.bin,下载后延时复位
isd_download.exe isd_config.ini -tonorflash -dev bd19 -boot 0x2000 -div8 -wait 300 -output %output_base_name% -uboot uboot.boot -app app.bin -res p11_code.bin -uboot_compress -reboot 500
:: AC635N —— loader 型号 br23,boot 地址 0x12000,无附加资源参数
isd_download.exe isd_config.ini -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -output %output_base_name% -uboot uboot.boot -app app.bin -uboot_compress
Sources:
为什么存在差异? -dev 决定使用哪个 loader(bd19loader.bin 对应 AC632N,br23loader.bin 对应 AC635N),-boot 是 uboot 在 flash 中的链接地址,-res 是 AC632N 特有的附加资源段。这些参数与各芯片的 isd_config.ini 中 CHIP_NAME、ENTRY 一一对应,修改芯片型号时必须同步修改脚本与配置文件,否则下载器握手或地址校验会失败。
示例 3:产线定制擦除
download.bat 中注释给出了产线常用的扩展命令,可直接追加在 isd_download.exe 命令行后:
@rem 擦除 VM 区域(保留用户参数区,用于返工重烧)
isd_download.exe isd_config.ini ... -format vm
@rem 从第 0x3f0 个 sector 开始连续擦除 2 个 sector
@rem 第一个参数支持 16 进制或 10 进制,第二个参数必须是 10 进制
isd_download.exe isd_config.ini ... -format 0x3f0-2
Source: download.bat
Configuration Options
下表汇总 isd_config.ini 中影响烧写行为的关键配置项(以 AC635N 为例,AC632N 仅芯片相关键不同):
[EXTRA_CFG_PARAM]
| 配置项 | 类型 | 默认值(示例) | 说明 |
|---|---|---|---|
NEW_FLASH_FS | 枚举 | YES | 启用新版 flash 文件系统,需烧写器支持 |
FORCE_VM_ALIGN | 枚举 | YES | 强制 VM 区域 4K 对齐 |
CHIP_NAME | string | AC635N | 芯片型号,工具校验目标芯片 |
ENTRY | hex | 0x1E00100 | 程序入口地址,与链接脚本一致 |
PID | string | AC635N_GP | 产品标识(16 字节,格式:芯片封装_应用方向_方案名称) |
VID | string | 0.01 | 方案版本号 |
SDK_VERSION | string | AC635N_GP_V1.1.0 | SDK 版本标识 |
[CHIP_VERSION] / 下载通道
| 配置项 | 类型 | 默认值(示例) | 说明 |
|---|---|---|---|
SUPPORTED_LIST | string | A,B,D | 匹配的芯片版本列表,勿随意修改 |
DOWNLOAD_MODEL | 枚举 | usb | 下载通道:usb 或 SERIAL |
SERIAL_DEVICE_NAME | string | JlVirtualJtagSerial | 虚拟串口设备名 |
SERIAL_BARD_RATE | int | 1000000 | 串口波特率(1M) |
SERIAL_INIT_BAUD_RATE | int | 9600 | 初始握手波特率 |
LOADER_BAUD_RATE | int | 1000000 | loader 加载后波特率 |
BEFORE_LOADER_WAIT_TIME | int | 100 | 进入 loader 前等待时间(ms) |
[SYS_CFG_PARAM](uboot 硬件参数,键顺序不可调整)
| 配置项 | 类型 | 默认值(示例) | 说明 |
|---|---|---|---|
SPI | string | 2_3_0_1 | flash 参数:width_clk_mode_port;width=3 时自动识别 2/4 线 |
LRC | int | -1 | LRC 时钟源选择 |
PLL_SRC | string | LRC | PLL 时钟源 |
RESET | string | PB01_00_0 | 复位引脚_长按时间_有效电平(长按时间 00/01/02/04/08 秒,00 关闭) |
UPDATE_JUMP | int | 0 | 升级过程中是否维持 IO 电平 |
VLVD | int | 4 | VDDIO_LVD 挡位(0~7 = 1.9V~2.6V) |
FLASH_BIN_CNT | int | 6 | flash 镜像数量 |
EOFFSET | int | 1 | 区域偏移粒度(n*4k) |
[RESERVED_CONFIG](flash 分区,每组由 ADR/LEN/OPT 三元组构成)
| 配置项 | 类型 | 默认值(示例) | 说明 |
|---|---|---|---|
PRCT_ADR / PRCT_LEN / PRCT_OPT | hex/int/int | 0 / CODE_LEN / 2 | 产品码区域:从 0 起、长度=代码长度、加保护 |
VM_ADR / VM_LEN / VM_OPT | hex/int/int | 0 / 8K / 1 | VM 参数区:固定 8K、下载时不操作 |
OPT 取值:0 下载时擦除、1 下载时不操作、2 下载时加保护。
[TOOL_CONFIG](量产工具版本门槛,勿修改)
| 配置项 | 类型 | 默认值(示例) | 说明 |
|---|---|---|---|
1TO2_MIN_VER | string | 2.25.8 | 一拖二烧写器最低版本 |
1TO8_MIN_VER | string | 3.1.7 | 一拖八烧写器最低版本 |
BTBOX_MIN_VER | string | 1.2.7 | 蓝牙测试盒最低版本 |
[BURNER_CONFIG] SIZE | int | 32 | 烧写器容量参数 |
Failure Modes, Edge Cases & Concurrency
以下故障与边界情况均能从仓库中的脚本与配置得到印证:
1. 工具链缺失 / 未编译
download.bat 对 %OBJCOPY% 与 %ELFFILE% 做了 if not exist 守卫。若 C:\JL\pi32\bin 工具链未安装或 sdk.elf 未生成,脚本会跳过切段直接进入 :download 分支——此时 app.bin 可能是旧文件或不存在,isd_download.exe 会因找不到 -app 指定的镜像而报错。排查顺序:先确认编译成功,再确认 JL pi32 工具链已安装。
2. 芯片型号不匹配
isd_config.ini 中 CHIP_NAME / SUPPORTED_LIST 与 download.bat 中 -dev(bd19/br23)、-boot 地址必须一致。误用会导致 loader 握手失败或入口地址校验失败。两个芯片的 tools/ 目录互相独立(AC632N/tools 与 AC635N/tools),不要跨目录混用脚本与配置文件。
3. 产线工具版本过旧
固件若启用了 NEW_FLASH_FS=YES、FORCE_VM_ALIGN=YES 等新特性,但产线烧写器版本低于 [TOOL_CONFIG] 中对应门槛,工具会拒绝烧写(或烧出非预期布局)。这是"固件 ↔ 工具"的强制契约,升级固件时须同步升级产线工具。
4. 分区保护与返工烧写
PRCT_OPT=2(产品码区加保护)与 VM_OPT=1(VM 区不操作)意味着普通下载不会覆盖产品码与用户参数。若返工需要彻底擦除,必须显式使用 -format vm 或 -format 0x3f0-2 等命令——直接重烧可能保留旧数据,导致"烧写成功但行为异常"的隐性故障。
5. 并发/多机烧写
量产场景由一拖二、一拖八烧写器并行烧写多片,BURNER_CONFIG SIZE 与版本门槛保证多路烧写的一致性;脚本本身是单机工具,不涉及并发控制。多片并行时的差异仅来自 flash 个体差异,由 uboot 的 SPI 自动识别(width=3 时自动识别 2/4 线)兜底。
6. 串口通道稳定性
切到 SERIAL 下载通道时,需保证 SERIAL_INIT_BAUD_RATE(9600)→ LOADER_BAUD_RATE(1M)的波特率切换时序与 BEFORE_LOADER_WAIT_TIME 匹配;虚拟串口名 JlVirtualJtagSerial 必须与驱动安装一致,否则握手失败。
Performance & Operational Notes
- 下载速率:
-div8分频与-wait 300超时是速度与兼容性的平衡点;对低规格 flash 或长走线产线,可适当降低时钟(保持-div8)换取稳定性; - 镜像压缩:
-uboot_compress压缩 uboot 镜像,减少下载数据量,缩短产线节拍; - 符号表留档:
symbol_tbl.txt每次下载都会重新生成,配合定位异常地址.bat(tools 目录内)可把产线异常死机 PC 值反查为函数名,是量产问题分析的关键一手资料; - 产物规范:
update.ufw固定命名,供测试盒与 OTA 升级统一引用;.fw文件名由-output基名决定(默认jl_isd),产线脚本中可通过修改基名区分不同方案固件。
Extension Points
- 新增芯片型号:复制某型号的
tools/目录,修改isd_config.ini的CHIP_NAME/ENTRY/PID与download.bat的-dev/-boot/loader 文件名,即可生成新的烧写套件; - 自定义分区:在
[RESERVED_CONFIG]按XXX_ADR/_LEN/_OPT三元组追加区域(如序列号区、校准数据区),OPT决定下载时的擦除/保护行为; - 定制下载动作:在
isd_download.exe命令行追加-format参数实现产线擦除策略,无需改动工具本体; - 版本契约管理:固件引入新烧写特性时,通过提高
[TOOL_CONFIG]中对应工具的最低版本,强制产线工具链同步升级。