
贴片厂打样回来的板子Flash里通常一个字都没有。上电后串口终端静悄悄没有任何打印这几乎是每个做SigmaStar SSC335方案的工程师最先遇到的场面。这时候你需要把固件“塞”进这颗空片而最直接的办法就是用原厂提供的Flash_Tool走一遍USB下载烧写流程。这篇文章我会从启动链路讲起把空片烧写的前置准备、工具操作、失败排查和批量产线经验一次说清给刚接触SSC335平台的硬件、嵌入式以及量产导入的工程师一份能直接照着做的参考。1. 拿到空片先别慌先搞清楚SSC335从Flash启动的完整链路1.1 空片上电芯片内部到底在执行什么很多人第一次烧空片时会很疑惑明明Flash里什么都没有为什么USB接上电脑后能被烧录工具识别这其实得益于芯片内部固化的BootROM。SSC335内部有一块出厂后不可修改的BootROM。上电后CPU首先执行BoootROM里的代码BootROM会按照芯片设计时确定的顺序去检测外部启动介质常见的有USB、SD卡、SPI NOR Flash、SPI NAND Flash等。如果Flash完全空白BootROM在Flash上读不到任何有效的启动头就会自动回退到USB下载模式等待PC端的烧录工具通过USB协议向它发送数据。这个“空片状态”正是Flash_Tool能够介入的前提。另外一部分板子可能没有把Flash接上或者Flash的供电/片选有问题BootROM在某个介质上卡住导致USB下载设备不出现。后面排查部分我会专门说这个。1.2 空片烧写和普通固件升级为什么完全是两回事我们常说的固件升级是指设备已经能启动系统跑在Linux或RTOS里然后通过网络TFTP、串口、SD卡等方式去更新某个分区的镜像。整个过程依赖当前系统自身运行起来才能执行写入动作。而空片烧写属于最底层的下载流程Flash没有任何可执行代码系统是不可能自己起来的只能依靠芯片BootROM与PC端工具通信由工具把uboot、内核、文件系统等镜像直接写入外部Flash。这个过程中相当于PC端短暂“接管”了芯片的存储控制器把Flash当作一个需要烧录的裸存储器来操作。这也是为什么空片烧写一旦失败只能重新用Flash_Tool或者SD卡启动方式再救不能指望设备自己恢复。1.3 哪些实际场景必须走空片烧写流程我整理了下工作中真正会碰到需要用Flash_Tool烧空片的情况基本逃不出这几类新板贴片回板PCB上Flash是全新的没有任何数据这是最常见的场景。Flash物料更换原来用8MB NOR因为供货问题换成了新的Flash芯片新片是空的需要重新烧写。误擦除或Flash损坏调试过程中把整个Flash擦空了导致无法启动此时需要当空片重新处理。没有SD卡引导条件部分板卡硬件上没有接SD卡卡座或者固件包里没有SD卡启动版本只能走USB下载模式。原始固件缺失的救砖从客户手里拿回来的板子Flash里内容被清空需要重新烧录正确固件。1.4 动手前必须确认Flash是NOR还是NAND容量多少SSC335对SPI NOR和SPI NAND都支持但两种介质在Flash_Tool里的配置、擦除命令、坏块策略完全不同。烧写前必须从原理图和物料BOM确认三件事Flash具体型号、容量大小、接口模式标准SPI还是Quad模式。例如常见搭配是SPI NOR Flash容量8MB或16MB地址空间0x000000 ~ 0x800000或者0x1000000。如果工具配置里选的Flash容量比实际小地址范围限制就会把后面分区截掉校验还好说但启动一定会出问题如果选的容量比实际大工具可能会去操作不存在的地址烧完一样起不来。这个确认动作看起来简单但我在实际产线里发现很多工程师在拿到一把新Flash时习惯按之前的型号配置结果W25Q128换成W25Q64之后烧录一直失败浪费了大半天时间。所以开头多花两分钟查一下Datasheet后面能省一大截。2. 烧写准备连接线、驱动和固件这三件事一样都不能少2.1 硬件连接的正确顺序和接线细节Flash_Tool烧写一般通过USB接口连接PC同时还建议接一路调试串口用来观察启动日志。具体接线顺序我建议这样板子断电。用USB线把PC和板子上的烧写USB口连接起来。如果板子有串口调试口也接上USB转串口并打开串口终端软件波特率先用115200。最后给板子上电。为什么最后一步才上电因为很多情况下USB下载设备是在“上电瞬间”被BootROM枚举出来的如果你先上电再插USBBootROM在检测启动介质时可能已经跳过了USB模式再插USB就不会有设备识别了。有的核心板或开发板设计了拨码开关或者跳线帽用来强制进入下载模式。这种板子需要在上电前把拨码拨到对应位置。查看一下板子原理图里Download Mode相关引脚即可。2.2 安装USB驱动设备管理器里出现问号还是未知设备连接板子并上电后Windows设备管理器里如果出现带感叹号的未知设备说明驱动没有正确安装。Flash_Tool正常工作依赖底层USB驱动驱动版本不对或者没有安装工具就会一直提示“No Device”。驱动安装我有几个建议优先使用烧录工具包自带的驱动文件夹里面有官方INF文件右键更新驱动时选择“浏览我的电脑以查找驱动程序”然后指向驱动目录。如果安装时提示“驱动签名无法验证”Win10上可以进入“设置 更新和安全 恢复 高级启动”选择“禁用驱动程序强制签名”后再安装。装完后重新插拔USB并再次上电看设备管理器里是否出现类似“SigmaStar USB Download Device”的名称。如果设备仍然不出现换个USB线再换一个USB口。我实测主板后置USB2.0口兼容性最好USB3.0口有些机器反而容易掉线。2.3 固件材料清单一套完整的SSC335固件包含哪些文件严格来说“固件”不是单指某一个文件而是一组镜像的集合。通常SigmaStar发布包里会包含bootloader镜像常见文件名u-boot.bin负责硬件初始化、引导内核。内核镜像uImage或zImageLinux内核。设备树文件*.dtb描述板级硬件差异。根文件系统镜像rootfs.squashfs、rootfs.cpio.gz或者ext4镜像等。DDR初始化固件有些烧录流程会先用一个小的DDR初始化程序下到片内RAM把DDR跑起来再向Flash写数据。这个文件通常由工具自动加载不需要手工选择。分区表/配置文件一些工具包以xml或cfg形式保存各镜像的烧写地址非常重要。这些文件必须来自同一套SDK编译产物不能随便从网上下载混用。版本不对轻则烧完启动不了重则写入的过程中工具报错中断把空片擦得一半一半。2.4 Flash_Tool版本与芯片型号匹配面向SSC335开发的Flash_Tool版本很多有些旧版本工具不支持SSC335DE这类衍生型号有些新版本则可能改进了Flash算法但默认配置不兼容。我的做法是先看SDK包里的文档说明找到配套的烧录工具目录优先用当前SDK里带的那一版Flash_Tool。工具界面中的芯片选择项一般会列出SSC335、SSC333、SSC337等注意选择正确的系列。如果选错芯片即使设备能连上工具发送的协议命令也可能不对导致响应超时或校验失败。3. Flash_Tool手工烧写实操步骤以NOR Flash空片为例3.1 启动Flash_Tool并建立与设备之间的连接双击运行Flash_Tool.exe后界面一般分为左右两部分左侧是烧写列表右侧是运行日志。先在顶部或者设置菜单里把芯片型号选成SSC335连接方式选择USB。这时把板子用USB线连上PC确保串口终端已经打开然后给板子上电。上电后点击工具上的“刷新”或“列出设备”正常日志窗口会打印类似“USB device found”或“device online”的信息左侧状态栏会亮起来。如果点击开始烧写时报错通常是因为设备没有经过这一步刷新。我习惯的做法是先点一次“列出设备”确认在线后再去加载镜像不要上来直接点烧写。3.2 配置分区表与烧写地址最容易被忽略也最容易翻车的一步烧写列表里需要添加每一个要写入的分区。SigmaStar官方配置包通常会提供一个默认分区表比如分区镜像文件起始地址说明bootloaderu-boot.bin0x000000BootROM从这里读取启动头dtbssc335.dtb0x100000设备树文件kerneluImage0x200000内核镜像rootfsrootfs.squashfs0x500000根文件系统以上只是一组常见示例实际地址一定要以你自己项目的分区表为准。U-boot打印里的mtdparts信息可以看到实际分区也可以在SDK源码include/configs/xxx.h里查看到。如果工具支持导入配置文件直接加载官方的xml/cfg让工具自动填充镜像和地址既省事又不容易错。但导入后也必须逐个核对一遍尤其是rootfs大小和Flash容量是否匹配。手动添加分区时注意以下几点地址必须十六进制填写不要出现拼写错误。各分区之间至少留一个扇区通常4KB或者64KB的空隙防止地址重叠或边缘擦除影响相邻分区。首批烧写建议勾选“Write and Verify”烧完自动读回校验虽然慢一点但能第一时间发现Flash问题。如果Flash只有8MB而rootfs是10MB那这个固件本身就不匹配不是工具能解决的。3.3 执行烧写从DDR初始化到Flash擦除写入点击“开始”烧写后工具的第一件事通常是把一个DDR初始化固件下载到片内RAM然后通知芯片执行把外部DDR初始化好。因为后续工具需要借用DDR来缓存镜像数据才能用满USB速度去写Flash。接着工具会通过SPI控制器对Flash发起擦除命令。如果地址区间较大这个阶段耗时较长日志里会出现“Erasing offset ...”。NOR Flash按扇区擦除容量越大、擦除范围越多耗时越久这很正常。擦除完成后开始逐个分区写入每个分区写入时进度条会刷新。整个烧写过程中不要拔线、不要给板子断电。我见过有人看到擦除阶段时间太长觉得卡住了直接断电结果Flash处于已擦除未写入的中间状态BootROM依然什么也启动不了只能重新走一遍完整流程白白浪费时间。3.4 烧写完成后的判断依据和首次启动验证当工具界面显示“烧写成功”或“PASS”时先不要高兴太早。此时断电把板子重新上电如果串口终端出现了U-boot启动日志说明bootloader已经能从Flash自举这是最可靠的成功标志。U-boot起来后还可以手动敲几个命令检查Flash内容sf probe sf read 0x22000000 0x100000 0x200000 md 0x22000000以上示例是把内核分区读出来放到DDR地址然后查看头部内存数据确认烧写内容不是全FF。如果读出来的内容能看到内核镜像头部特征比如UImage的魔数等说明烧写内容基本没问题。首启时注意串口波特率SSC335默认有很多种常见115200和921600如果日志乱码就切换波特率再试。4. 烧写失败时的排查思路日志是关键而不是乱点按钮4.1 设备无法识别或连接超时到底卡在哪一层Flash_Tool一直提示“No Device”是最常见的问题。遇到这种情况不要反复点开始烧写按以下顺序排查换USB线。很多Micro USB线只能充电内部没有数据线这种情况占了最多比例。确认板子处于下载模式。有的板子BootROM在检测不到合法启动头才会进入USB下载模式。如果Flash不是完全空但里面有损坏的启动头BootROM可能卡在Flash读取阶段根本没走到USB枚举。这时候需要把Flash清空或者强制下载模式引脚。看设备管理器。上电后有没有“未知设备”出现。如果完全没有新的USB设备说明BootROM没有枚举USB问题在硬件链路或启动条件上。量电源。空片时芯片虽然能跑BootROM但DDR、SPI、USB PHY这些模块供电的不正常也可能导致USB不工作。用万用表确认各主要电源轨输出电压都正确。我遇到过一台机器换芯片型号的时候烧录线插在了一个复用为GPIO的USB口上工具自然无法识别。烧录前一定要对照原理图找对烧写专用的USB口。4.2 擦除失败、校验失败多半是Flash配置和硬件细节的锅日志里如果出现“Erase fail”或“Verify fail”问题基本在Flash侧。我建议按优先级排查Flash型号选择错误。在Flash_Tool的Flash参数列表里选择与实物一致的型号。某些兼容Flash虽然命令集一致但ID可能不同工具可能识别不了。可以在工具允许的情况下手动输入Flash ID或者在“Flash Info”里读一下实际ID。SPI工作模式不匹配。如果工具用QSPI四线模式访问Flash而板子上Flash的IO2、IO3引脚没有接好或者电路上有其他用途干扰通信就会失败。可以强制工具改用标准SPI模式试试。写保护引脚和HOLD引脚。Flash的WP#和HOLD#引脚在PCB上必须正确处理WP#要上拉到高电平HOLD#也要保持高电平否则擦写命令会被忽略或SPI通信被打断。这两个引脚在量产板子上很容易漏上拉值得重点检查。SPI速率过快。不同Flash支持的SPI频率不同特别是一些工规Flash最高只有几十MHz。工具里可以降低SPI时钟频率比如从50MHz降到25MHz再试一次。不要一上来就怀疑Flash本身坏了。大部分第一次烧写失败都是配置或引脚问题。4.3 烧写成功但无法启动先检查地址和启动介质这种问题比烧写失败更隐蔽。明明流程走完校验通过但上电后串口什么都没打印容易让人怀疑芯片坏了。第一步确认烧写地址。如果U-boot镜像没有烧到Flash的0x000000起始地址BootROM不可能找到合法的启动头。比如有人分区时给bootloader设了偏移0x100000工具也照做这在启动逻辑上是致命的。第二步确认启动介质选择引脚。SSC335可能有多组启动模式配置引脚如果硬件上这些引脚被拉成了“从SD卡启动”或“从UART启动”而SD卡上没有程序BootROM就会一直等待或尝试从SD卡引导不会去读Flash。查原理图找到这些启动配置引脚在上电时量一下电平状态。第三步确认串口本身没问题。如果串口接错TX/RX或者电脑上选错COM口一样的现象也是“无日志”。这种属于低级错误但很容易在忙乱中踩中。4.4 换一片Flash就“废”了硬件兼容性里面的经典坑随着芯片缺货现在工程师经常需要替换Flash物料。SSD335平台上替换Flash时由于不同厂商Flash的规格差异会出现以下现象旧的W25Q128烧写正常新换的镁光或旺宏同容量Flash烧写时擦除/写入速度特别慢甚至超时。新Flash烧写成功但上电启动后U-boot识别不到容量或读写数据出错。低功耗模式下Flash漏电严重休眠唤醒后内容丢失。遇到这些情况先看Flash_Tool的Flash列表里有没有对应型号。如果没有选一个兼容型号但必须用工具的“读取ID”功能确认实际ID是否匹配。再不行就降低SPI速率并在U-boot中确认Flash驱动也支持该型号因为BootROM烧进去了U-boot起来后如果驱动不识别这枚Flash照样无法挂载根文件系统。5. 从手工烧写到批量产线烧写的几个经验点5.1 能正常启动后先做一次全量备份很多工程师烧完系统能跑就立刻去调功能等到某天固件突然崩溃才发现手上没有原始镜像只能到处找原厂要。最好的习惯是在板子正常启动后用Flash_Tool的“Read”功能把整个Flash内容读出来保存成一个全量镜像文件。读取时把起始地址设为0x000000读取长度设为整个Flash容量比如8MB就填0x800000。全量镜像一定要和硬件版本、Flash型号一起归档命名格式建议包含项目名、硬件版本、Flash大小、日期。后面不管哪里出问题只要Flash硬件一样都能用这个全量镜像一把烧回去。5.2 用命令行或批处理脚本提高产线效率手工点鼠标烧一块板子当然可以但量产一天烧几百块就受不了。Flash_Tool一般支持命令行调用大致写法类似FlashTool.exe -chip SSC335 -port USB -cfg partition.xml -run具体参数名以工具版本为准。产线使用时把命令封装成一个批处理脚本每片板烧完检查日志文件中的PASS关键词自动记录结果没通过的单独隔离。命令行模式下要注意给每条USB烧录线单独分配端口避免多台设备同时插入时工具不确定选哪一台。一些量产治具会用USB HUB接多块板子但大部分Flash_Tool并不能同时烧写多块板只能单通道安装驱动后按顺序操作这一点要提前评估。5.3 批量烧写时的校验和防错机制量产烧录不比手工调试少一次校验可能在市场上多一片返修板。我建议至少做到两层校验工具烧完后的硬件校验能保证Flash里的内容和PC端镜像完全一致。对关键数据区做额外一致性检查比如在根文件系统里放一个包含版本号的明文文件启动后让产测程序读取并打印确认系统实际使用的分区与烧写脚本一致。对于NAND Flash坏块是天然存在的工具在烧写时一般会跳过坏块并建立坏块表。但一定要检查日志看是否有过多的坏块被跳过。如果同一位置反复出现坏块说明该Flash芯片可能已经不健康建议换料。5.4 维护好分区表别让产线和研发脱节研发在调试过程中经常会调整分区大小比如rootfs增大了需要把起始地址往后挪。这时候如果产线烧写脚本没有同步更新烧出来的机器就会出现内核找不到根文件系统、U-boot环境变量分区覆盖等问题。所以项目里一定要指定一个人专门维护烧写配置文件和产线脚本每次固件版本发布时同步更新分区表核对清单。我见过最惨的一次是研发改了U-boot分区表产线用了旧配置烧了一整批结果所有板子回来开机都卡在内核panic最后全数返工。5.5 一点个人体会空片烧写看似只是把镜像写进Flash但背后涉及BootROM行为、Flash特性和工具匹配等多个环节。SSC335这套流程走顺后再接触其他SigmaStar芯片原理基本是一样的。建议新手先找一片带完整SDK的裸板用Flash_Tool反复烧写、读取、对比全量镜像把工具的操作手感练出来后面遇到量产或救砖问题就心里有底了。最后提一句烧写工具和固件包务必从可靠渠道获取并保持版本归档网络上随意下载的版本很可能少文件或带病毒这种不必要的风险最好从一开始就规避掉。