这块全志F1C100s的开发板躺在我抽屉里大半年,每次想捡起来玩都要先做心理建设。不是它性能不行,ARM926EJ-S老爷芯配32MB DDR1,跑个精简Linux绰绰有余,问题全出在烧录:官方文档清一色Linux下的sunxi-fel命令行,各种参数看得人头大;想用Windows又找不到顺手教程,虚拟机里装Linux再搞烧录,纯属为了吃顿饭先种水稻。后来换了PhoenixSuit这套Windows方案,我才发现原来给F1C100s刷机可以就这么简单:装驱动、进FEL、选镜像、点升级,十分钟内把SPI Flash写满。这篇文章就把这套方法完整拆开,包括驱动翻车现场和镜像格式的坑,给想在Windows下捣鼓F1C100s的朋友做个参考。
1. 为什么F1C100s在Windows下烧录这么别扭
1.1 这颗"国产神U"的烧录生态现状
全志F1C100s(以及它的兄弟F1C200s)是一个把CPU、DDR1和Flash控制器塞进一颗QFP封装里的芯片,不需要外挂内存颗粒,一颗芯片加一颗SPI Flash就能组成一套最小系统。因为这个特性,很多低成本Linux开发板、MP4方案、甚至自制的GameBoy掌机都爱用它,所以在开源社区里它的受众特别杂:有人拿它做NAS,有人做随身Linux终端,有人直接把它当高级单片机用。
但受众杂也带来一个问题:烧录工具链跟不上。全志官方对消费级产品的烧录主要走Windows下的PhoenixSuit,但早年开源社区的玩法普遍是Linux下用sunxi-fel,通过USB在FEL模式下直接读写芯片、烧SPI Flash。所以你在多数教程里看到的都是"sudo sunxi-fel ..."这种命令行操作,Windows用户直接被晾在一边。偏偏F1C100s玩的就是折腾,系统要自己编译,镜像要自己弄,第一步烧录就被卡住,很多人就这么劝退了。
我身边不止一个朋友问过同一个问题:"我电脑只有Windows,到底怎么给这块板子刷系统?"答案其实有,只是散落在论坛角落和英文博客里,新手很难拼出完整链路。这篇文章的初衷,就是把这条链路从头到尾捋清楚。
1.2 sunxi-fel方案到底卡在哪
sunxi-fel本身是个好工具,它能通过USB让F1C100s的FEL模式引导程序把代码加载到DDR里执行,也能直接读写SPI Flash甚至eMMC,支持的操作包括执行内存镜像、写寄存器、烧录固件、备份Flash,功能相当全。但换到Windows上有几道坎,不是工具本身不好,是环境不配合:
- 官方没有发布Windows版,网上能找到的fel.exe基本是第三方编译的,版本新旧不一,有些还缺功能,比如不支持最新的
spiflash-write参数。 - 它依赖libusb驱动,Windows下要用zadig把设备的默认驱动替换成WinUSB或libusb-win32,中间只要操作错一步,设备就成了"Unknown Device",得从头再来。
- 它没有界面,全是命令行参数,比如要烧一个镜像得先搞清楚SPI Flash的起始地址、要不要带
spiflash-write这类选项。对只是想"把镜像刷进去"的普通玩家来说,学习成本确实高。
我不是否定sunxi-fel,它在调试场景里的价值是PhoenixSuit替代不了的。但对大多数只想把Linux跑起来的用户,用它在Windows下烧录属于自己给自己加戏。
1.3 PhoenixSuit恰好在Windows生态里补上了这个缺口
PhoenixSuit是全志官方的固件升级工具,Windows版做了很多年,UI虽然看着有年代感,但功能上完全够用。它做的事情其实就是把sunxi-fel那套"USB进入FEL → 传输镜像 → 写入Flash"的流程封装成了一个图形界面,你只需做三步:连接设备、选择镜像、点升级。
它对驱动也更友好,安装包自带的驱动在老系统上是即插即有的;就算在Win10/11上驱动翻车,配合zadig也能救回来,这个后面专门讲。另外,PhoenixSuit不仅是刷F1C100s能用,全志T113、V3s、R16这些芯片的量产烧录流程里也常见到它的身影,学会一次,同类芯片基本通用。
这里先给一个结论:如果你手上有F1C100s开发板,想解决"Windows下怎么烧录",首选就是PhoenixSuit。它可能不是最酷的方案,但一定是最省事、最不容易半途翻车的方案。
2. 烧录前的准备工作:硬件、软件、驱动三件套
2.1 硬件环境必须先排查到位
烧录前别急着装软件,先确认三样东西。
第一,开发板本身能进FEL模式。F1C100s开发板一般会在板上设计一个FEL按键、BOOT跳线或者单独的焊盘。按下去(或短接到GND)再上电,芯片就会停在FEL阶段,不加载SPI Flash里已有的任何程序。买板子时看清楚说明,有些核心板没按键,需要你从底板上引线把FEL引脚拉到地,这个操作不难,但得知道引哪儿。
第二,一条能传数据的Micro USB线。这点特别容易被忽略,很多线买来就是给充电宝用的,里面只有电源线没有数据线,插上去电脑毫无反应。我一般在抽屉里多备两条,哪根出现"未知USB设备"就换哪根,实测下来比花半小时研究驱动更快。
第三,Windows电脑,最好是Win10或Win11。Win7也能跑,但驱动路径和工具版本跟Win10不太一样,后面讲的内容默认按Win10/11来。
另外如果你打算刷完系统立刻验证,最好准备一根USB转串口线。F1C100s开发板上的调试串口一般是三根线:TX、RX、GND,接上电脑后用PuTTY或MobaXterm连对应COM口,波特率设115200,就能看到U-Boot和内核的启动日志。没有串口也用HDMI接小屏幕看画面输出,只是排查问题不如串口直观。
2.2 PhoenixSuit安装里的几个小坑
PhoenixSuit安装包去全志官方或者社区镜像下载,常见版本是4.0.x,文件不大,几十MB。下载时注意别点到乱七八糟的推广下载站,认准原版压缩包。安装时右键以管理员身份运行,中途如果杀毒软件弹窗报"检测到驱动安装",尽量选择允许。原因很简单:PhoenixSuit要往系统里装USB驱动,这个行为在杀软看来和恶意程序有点像,实际上驱动本身是全志签名的,过了校验就行。如果你装到一半提示"安全软件拦截",关了杀软重新装一遍是常态,装完再开回来。
还有个小细节:安装路径最好别带中文。工具本身界面能显示中文,但内部对路径的处理不太稳,曾经遇到过因为路径带中文导致固件包解析失败的情况,改成英文路径就正常了。
装完桌面会出现一个PhoenixSuit图标,第一次启动时主窗口上方会显示当前的设备状态,现在肯定显示"无设备",先别管它,我们得先把驱动环境弄干净。
2.3 Win10/11下驱动翻车现场的完整解法
这是整个流程里最卡人的一步,我先把标准操作顺序写出来:
- 安装PhoenixSuit,不插板子。
- 打开设备管理器,把窗口停在"端口"和"USB设备"附近,方便观察。
- 按住开发板上的FEL键不松,插入USB线,等两三秒再松手。
- 看设备管理器里出现了什么。
正常情况下会出现两种情况中的一种:要么是一个带黄色感叹号的"未知USB设备"或"USB输入设备",要么是显示"Allwinner"或"USB download gadget"的设备。前者说明驱动没匹配上,后者说明PhoenixSuit自带的驱动已经生效,直接打开PhoenixSuit就能识别。
如果是前者,手动指定驱动:右键设备 → 更新驱动程序 → 选择"浏览我的电脑以查找驱动程序" → 拉到最下面选"让我从计算机上的可用驱动程序列表中选取" → 在弹出的列表里选"WinUSB设备"或"libusb-win32"。如果列表里没有这些选项,就用zadig:下载zadig,打开后在菜单里勾选List All Devices,下拉找到VID_1F3A、PID_EFE8这个设备(这就是全志F1C100s在FEL模式下的USB ID),右侧驱动选WinUSB,点Replace Driver。换好后PhoenixSuit就能认到了。
这里我可以直接给你一张速查表,方便烧录现场照着排查:
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 插入USB无任何新设备 | 线材只有电源线,或USB口供电不足 | 换一条数据线,换USB2.0口 |
| 设备名字显示"未知USB设备(设备描述符请求失败)" | 驱动不对,或端口枚举异常 | 换USB口,手动装WinUSB驱动 |
| 有设备但显示黄色感叹号 | 系统自带驱动版本过旧 | 用zadig替换成WinUSB |
| PhoenixSuit提示"没有发现设备" | 驱动识别正常但工具未识别 | 重新插拔,确认FEL按键是否按住 |
驱动这块我的经验是:先装PhoenixSuit自带驱动,不行再上zadig,不要一上来就zadig。PhoenixSuit自带的驱动在Win10 1809之前的版本上很稳,后来的系统偶尔会提示"驱动未签名",这时候才轮到zadig出场。
3. 核心流程:让PhoenixSuit真正把镜像写进SPI Flash
3.1 进入FEL模式的标准姿势
打开PhoenixSuit前,先让板子进入FEL模式。具体动作:
- 找一把镊子或者直接用指甲,按住开发板上标注FEL的按键,部分板子叫BOOT或UBOOT,也有直接用焊盘标注的。
- 用Micro USB线连接开发板和电脑,插线瞬间保持按键不松,过两三秒再松手。
- 此时芯片不从SPI Flash加载程序,而是等待USB主机来下发数据。
如果板子上没有按键,就用杜邦线把FEL引脚直接短路到GND,短接后上电也能进FEL。插好后开发板的电源指示灯会亮,但屏幕(如果有)不显示、串口不打印任何内容,这都正常,不是砖了,是板子在FEL模式里待机。有的新手一看到串口没输出就以为板子烧了,其实恰恰说明FEL模式起作用了,因为它跳过了正常启动流程。
另外提醒一句:FEL模式下USB设备会以VID_1F3A、PID_EFE8枚举。如果你在设备管理器里看到这个ID,但PhoenixSuit还没识别,多半是工具版本和系统权限的问题,右键以管理员身份运行PhoenixSuit,或者去驱动环节再核对一遍。
3.2 PhoenixSuit界面操作细节
打开PhoenixSuit,如果驱动识别正常,主界面会提示"发现设备"。它有两个烧录入口:一个叫"一键刷机",一个叫"固件升级"。这两个入口对镜像的容忍度有差别。
我自己的习惯是:手上有.img格式的社区镜像,就选"一键刷机",然后把文件类型过滤器切到"所有文件",直接选中那个.img。如果手上有全志官方打包的.fw或带配置文件的分区固件包,才走"固件升级"。别选反了,否则工具会提示镜像格式不合法,容易让人以为镜像坏了。
选完镜像后点击"立即升级",工具会先对镜像文件做一次解析,然后提示你"请插入一个USB设备"之类的提示——其实不用再插,直接确认。这之后它会先通过USB把烧录程序加载到F1C100s的DDR里运行,再由这个运行在DDR里的程序把镜像逐块写入SPI Flash。整个过程界面上会有进度条。
这里有个很多人不知道的细节:PhoenixSuit对.img镜像的处理,不是简单地把文件按字节流写进Flash,而是会解析镜像里的分区结构,按分区地址写入。所以如果你的镜像本身是SD卡启动镜像,带MBR分区表,PhoenixSuit烧进SPI Flash时会忽略MBR里的分区表信息,把U-Boot写到0偏移处,这和sunxi-fel直接写整片Flash的逻辑不完全一样。好在F1C100s的常规Linux镜像就是这么组织的,实际用下来没问题。
3.3 烧录过程中的现象与判断依据
烧录过程中,开发板上的电源指示灯不会灭,但USB会重新枚举一次,电脑里可能听到"叮咚"一声。别慌,这是正常现象,工具在切换工作模式。进度条走到100%后,PhoenixSuit一般会弹一个"烧录成功"的提示,并询问是否要重启设备,选确认后开发板会自动重启进入系统。
如果烧录的是精简Linux镜像,重启后串口(波特率设115200)就能看到U-Boot打印和内核启动日志。就算没有串口线,你也可以用HDMI接个小屏幕看有没有画面输出。判断烧录成没成功,最靠谱的依据是看系统能不能进用户态,而不是只看PhoenixSuit弹出的成功提示。因为有些镜像本身有问题,烧录动作完成但内核起不来,这种不算真成功。
这一步的关键判断点:确认进入FEL模式后USB枚举出来的VID/PID是1f3a:efe8。只要看到这个ID,说明芯片已经准备好被刷写,剩下就是工具层面的事了。如果PhoenixSuit识别不了但设备管理器里有这个ID,优先检查你是不是装了多个版本的驱动,把zadig和全志驱动混着装会产生冲突,设备管理器里把多余设备删掉再重新枚举一次就能解决。
4. 踩坑实录:从设备管理器到Flash写失败的全链路排查
4.1 第一层:插上USB后设备管理器纹丝不动
这是我折腾F1C100s时遇到的第一个坑。板子插上后,Windows完全没有任何反应,设备管理器里也不出现任何新设备。我一度以为是板子挂了,甚至怀疑是不是芯片虚焊。后来排查来排查去,问题出在线材上——那条Micro USB线是某蓝牙音箱送的,只有正负极两根电源线,没有D+/D-数据线。换了三条线才找到能用的。
所以遇到这种情况,第一件事就是换线,不要碰驱动。第二件事是换USB口。有的主板前面板USB口供电或信号质量差,特别是台式机,建议直接插机箱后面板主板自带的USB2.0口。别看USB3.0蓝色口更多,有些主板在3.0口下的枚举兼容性反而不如2.0,尤其对这种老芯片的USB协议栈,2.0口更稳。
还有一个细节容易被忽略:Windows的快速启动和旧版USB驱动偶尔会冲突,导致设备枚举瞬间被掐掉。如果换线换口都无效,试试禁用USB选择性暂停,或者关闭Windows快速启动后再插一次。我遇到过两次,都是关掉快速启动就正常了。
4.2 第二层:未知设备加驱动感叹号
如果设备管理器能看到新设备,但名字是"未知USB设备",大概率是驱动没有匹配上。这时候打开设备属性看一下"硬件ID",如果能看到VID_1F3A和PID_EFE8,那就别折腾什么通用驱动了,直接用zadig按前面的流程把WinUSB装上去。
这里要提醒一句:zadig不能乱装。它会把设备原来的驱动替换掉,仅适用于设备还在FEL模式下的阶段。烧录完成后设备重启进入正常系统,USB功能就变了,这时候如果你再用zadig去动它,反而可能把正常外设搞挂。所以用完zadig就别再动了,等下次需要烧录时再操作。
另一个容易踩的坑是:有些用户在设备管理器里看到"USB下载"或"USB串行设备"几个字就以为驱动没问题,直接打开PhoenixSuit,结果识别不了。这是因为F1C100s在FEL模式下对外表现的是一个自定义USB设备,不是标准串口,PhoenixSuit要访问它必须由专门的驱动接管。如果设备管理器把它识别成了COM口,反而说明驱动被其他软件抢占了,卸载那个串口驱动再重新枚举才能解决。
4.3 第三层:PhoenixSuit能识别,但烧录到一半卡死
PhoenixSuit认到了设备,进度条走到一半卡住不动。我遇到过的原因主要有三个:
第一,镜像文件本身损坏或下载不完整。社区镜像托管在网盘或GitHub Releases上,偶尔传坏,重新下载一遍,最好比对MD5。镜像损坏的典型表现是进度条在同一个位置反复失败,或者直接报"固件校验失败"。
第二,USB信号不稳定。现象是进度条反反复复跳,或者卡在某个百分比上原地不动。解决办法很朴素:换USB2.0口,换一条更短的USB线。线越长,信号衰减越明显,尤其那种2米长的便宜线,插上后高速传输不稳定,烧录中途断连是家常便饭。
第三,板子供电不足。有些F1C100s开发板是纯USB供电,如果你的USB口同时接了一大堆外设,供电可能不够,芯片进入DDR加载阶段后功耗升高,瞬间电压跌落就会导致烧录中断。这时候用一个外接5V电源给板子供电,但注意要跟电脑共地,不然USB枚举会出幺蛾子。我一般会拿个面包板把GND串起来,简单粗暴但有效。
4.4 第四层:烧录显示成功,但板子就是起不来
这是最磨人的场景,烧录成功提示都有了,但重启后死活进不了系统。我这里给一个排查顺序:
第一步,先用串口线连上开发板,看U-Boot有没有输出。如果串口完全没反应,多半是启动介质选错了,比如板子默认从SD卡启动,而你往SPI Flash里写了系统,它根本没去读SPI。F1C100s的启动链路一般是先看SD卡,再看SPI Flash/NAND,最后进FEL,所以如果你SD卡槽里插着一张内容异常的卡,也可能干扰启动。
第二步,如果U-Boot有输出但找不到内核,那基本是镜像本身的问题,或者Flash容量不够,写进去的部分被覆盖了。F1C100s内部是32MB DDR1(F1C200s是64MB),Flash多则几十MB少则几MB,镜像里的内核和rootfs加起来如果超过Flash容量,烧录可能显示成功但启动时读不到完整数据。社区精简Linux镜像一般都能塞进8MB SPI Flash,但你如果加了一些大软件包,就得多注意容量。
第三步,如果U-Boot正常、内核也解压了,但卡在挂载rootfs,检查一下镜像里的rootfs格式和内核是否匹配。这属于镜像制作层面的问题了,跟烧录工具无关,但很常见。
5. PhoenixSuit与sunxi-fel的适用边界
5.1 一张表看懂两个工具的区别
| 对比项 | PhoenixSuit | sunxi-fel |
|---|---|---|
| 运行平台 | Windows图形界面 | Linux命令行,Windows需第三方编译 |
| 官方支持 | 全志官方发布 | 开源社区维护 |
| 驱动要求 | 自带驱动或WinUSB | libusb/WinUSB |
| 典型场景 | 烧录整机镜像、量产升级 | 调试、读写Flash、执行内存代码 |
| 上手门槛 | 低,图形化操作 | 中高,需要记参数 |
| 备份能力 | 有限,部分版本支持导出 | 支持读取Flash内容、寄存器 |
| 适合谁 | 普通玩家、产线装配 | 开发调试、深入研究者 |
这两者其实不冲突,PhoenixSuit覆盖了80%的日常烧录需求,sunxi-fel留给需要细粒度控制的场景。很多开发者的习惯是:平时用PhoenixSuit烧镜好像,到了调内核的阶段再打开sunxi-fel。两条路都会走,不用纠结选哪个。
5.2 什么时候你不得不回到sunxi-fel
有几个场景是PhoenixSuit替代不了的:
- 调试U-Boot阶段,想在PC端直接往F1C100s的DDR里加载一个裸机程序或单次运行的Linux内核,PhoenixSuit做不到,sunxi-fel一条命令就能搞定。
- 只想读出一小段Flash数据来分析,不想整片备份,PhoenixSuit的界面没那么灵活,sunxi-fel的读命令可以指定起始地址和长度。
- 批量生产需要脚本化,sunxi-fel适合放进CI或自动化脚本里,PhoenixSuit只能靠人肉点鼠标,量产效率低。
还有一个特殊场景:万一你的U-Boot或内核开发改动了启动参数,需要频繁重置环境变量,sunxi-fel的写寄存器操作比整个重烧快得多。
5.3 Windows下如果你非要命令行,也有个折中路线
我实测过一条可行的折中路线:在Windows下装好zadig的WinUSB驱动后,用社区编译的sunxi-fel.exe执行类似sunxi-fel spiflash-write 镜像.img这样的命令。注意进入FEL模式的流程和前面完全一样,这里不多说。
好处是可以拿到全部命令行输出和错误码,适合排查问题;坏处是社区版fel.exe更新不及时,对新芯片支持要看运气。F1C100s这种老芯片问题不大,但你要用F1C200s或更新的T113,还是优先PhoenixSuit,因为新版工具对全志新方案的USB协议支持更完整。如果你不想承担这个风险,临时用虚拟机里的Linux跑sunxi-fel,其实也是个办法,只是效率低一点,等你把工具链都配好,可能半小时就过去了。
6. 进阶玩法:备份、救砖与自定义镜像量产
6.1 在Windows下备份SPI Flash原厂固件
PhoenixSuit虽然主打烧录,但部分版本也支持读取设备内的Flash内容,具体操作是在主界面找到类似"导出/备份"的入口,或者用全志的配套工具包来做。不过这个功能不是每个版本都有,而且备份顺序有些反直觉:你要先进入FEL模式,再点备份,让工具通过USB直接读Flash。
如果你在PhoenixSuit里找不到备份入口,最简单可靠的备份方案是:先准备一张SD卡,把我前面说的Linux镜像用Win32DiskImager写进去,插到开发板上让它启动起来,然后在板子的Linux系统里用dd if=/dev/mtd0 of=/tmp/spiflash_backup.bin这类命令把SPI Flash原厂固件读出来,再通过网络或串口传回PC。听起来绕,但很稳,而且你还能顺带把分区表、硬件校准信息这些一并备份下来。
对大多数用户来说,最实用的不是备份整个Flash,而是备份U-Boot环境变量和启动参数。F1C100s的量产镜像里这些信息常常被厂商锁死在某个分区,改错了板子就起不来,有个备份心里就有底。
6.2 救砖:只要FEL还能进,砖就不是真的砖
F1C100s的启动链路是固定的:先尝试从SD卡启动,如果SD卡不在或没有有效启动代码,就尝试从SPI Flash/NAND启动,再不行就进入FEL模式等待USB主机。这意味着只要你的USB枚举还能看到VID_1F3A:EFE8,芯片就永远有一个兜底的恢复通道。
万一刷挂了,别急着扔板子,按住FEL键重新插USB,回到前面第3章的流程重刷一遍完整镜像,基本能救回来。我刷挂过四五次,没有一次是救不回来的,最严重的一次是SPI Flash内容完全擦空,但FEL模式依然正常工作,重新烧进去就活过来了。
唯一要小心的是不要在烧录过程中断电或拔线,那才是把Flash写到一半丢数据的真正凶险时刻,轻则校验失败,重则Flash坏块标记错乱。如果真碰到Flash内容半坏,芯片还能进FEL,那就先做一次整片擦除,再写入新镜像。PhoenixSuit的"升级"动作本身就会做擦除和重写,所以不需要手动干预;但如果你用的是sunxi-fel,记得先执行sunxi-fel spiflash-erase再写。
6.3 自定义镜像:buildroot出来之后怎么烧进去
如果你想自己用buildroot编一套F1C100s的固件,最终产物通常是一个sdcard.img或类似镜像。拿去烧录之前,先确认目标存储介质:
- 烧SD卡:用Win32DiskImager或balenaEtcher直接写卡,最简单,不用进FEL。
- 烧SPI Flash/NAND:用PhoenixSuit选择这个img,点"一键刷机",它会自动把镜像内容写到Flash对应分区里。
这里有个容易踩的细节:buildroot生成的大多数镜像默认带SD卡分区表,PhoenixSuit烧入SPI Flash时会忽略MBR里的分区表信息,而把整个镜像当作连续数据流写入Flash起始地址。所以只要你的镜像里U-Boot在偏移0处,它就能正常启动。如果你的自定义U-Boot是编译成单独文件的,那就得用sunxi-fel先把U-Boot写到SPI Flash的0x0,再单独写内核和rootfs。这种场景PhoenixSuit搞不定,我就老老实实切回命令行。
另外提醒一下镜像容量:buildroot默认生成的文件系统如果不是最小配置,很容易超过你板子上的Flash容量,导致烧录时工具识别为非法镜像。做镜像前先看一眼.config里rootfs选了哪些包,精简掉不必要的工具,烧录成功率会高很多。我自己常用的思路是先在buildroot里关掉文档和调试符号,再用strip瘦身一下二进制,最后压成ext4或jffs2再打包,能省出一大半空间。
6.4 再说一个提升幸福感的小细节
最后聊一个琐碎但影响体验的点:反复烧录会磨损SPI Flash吗?理论上SPI Flash有擦写次数限制,常见规格是10万次级别,但开发阶段一天烧十几次,用一年也就几千次,离上限很远。真正需要担心的是频繁只擦不写导致校验失败,所以每次烧完都跑一遍内核、确认系统能进用户态,再换下一个镜像,才算完整验证。
我自己的习惯是办公室里永远备着两块F1C100s板子:一块接串口和HDMI专门验证新镜像,另一块干干净净留在手边做救砖备份。哪块刷挂了就用另一块做参考,通过串口日志对比启动流程差异,手里有两条退路,心态完全不同。这种操作思路也可以延伸到其他全志芯片开发板上,只要掌握FEL模式这个兜底机制,刷机这件事就从"心惊胆战"变成了"无非再来一次"。