Victure PC420 刷入 Thingino 固件记录:无 CH341A,仅通过串口完成
一、背景
手里有捡了几个垃圾: Victure PC420 摄像头,原厂固件封闭,可玩性较差。我希望将其刷入开源的 Thingino 固件,用于局域网 RTSP/ONVIF 监控,后续计划接入房车倒车影像或局域网视频系统。
一开始的方案是使用 CH341A 编程器直接夹 SPI Flash 写入固件,这是最稳妥的方法。但我手头没有 CH341A,拆开 PC420 后发现主板上预留了串口焊盘,因此尝试通过 USB-TTL 串口进入 U-Boot,再通过 YMODEM 传输固件并写入 SPI Flash。
最终刷机成功。PC420_Thingino_Flasher-KvmE.exe
二、准备工具
本次使用的工具如下:
PC420 摄像头一台
USB-TTL 串口模块,型号为 CH340
杜邦线若干
MobaXterm,用于串口连接和日志记录
Tera Term 或支持 YMODEM 的串口工具,用于发送固件
Thingino 对应 PC420 的 8MB 完整固件
Windows PowerShell + Python,用于校验 CRC 和转换备份日志
串口参数为:
115200
8 data bits
No parity
1 stop bit
No flow control
接线方式:
摄像头 GND → USB-TTL GND
摄像头 TX → USB-TTL RX
摄像头 RX → USB-TTL TX
摄像头 3V3 → 不接
注意,USB-TTL 不给摄像头供电,摄像头仍使用原电源供电。
三、确认硬件信息
上电后,串口最初出现乱码,说明串口软件参数或接线存在问题。调整为 115200、8N1、无流控后,成功看到 U-Boot 启动日志。
启动日志中确认了硬件信息:
Board: ISVP (Ingenic XBurst T21 SoC)
DRAM: 64 MiB
SF: Detected GD25Q64C
platform:T21,sensor:F23,wifi:8188FTV
由此确认:
主控:Ingenic T21
内存:64MB
Flash:GD25Q64C,8MB SPI Flash
传感器:F23
Wi-Fi:RTL8188FTV
原厂分区信息如下:
mtdparts=jz_sfc:
512K(boot),
1600k(kernel),
2816k(root),
1536k(user),
832k(web),
896k(mtd)
总容量正好是 8MB。
四、进入 U-Boot
启动日志中出现:
Hit any key to stop autoboot: 0
一开始没有及时拦截,系统直接进入 Linux。后来在 MobaXterm 串口窗口中,上电时持续按空格/回车,成功中断启动,进入 U-Boot 命令行:
isvp_t21#
进入后先执行:
help
确认 U-Boot 支持以下关键命令:
sf
loady
crc32
md
setenv
printenv
然后测试 SPI Flash:
sf probe 0
返回:
SF: Detected GD25Q64C
说明可以通过 U-Boot 操作 SPI Flash。
五、读取原厂 Flash 到内存
为了避免刷机失败后无法恢复,先备份原厂固件。
设置内存地址:
setenv baseaddr 0x80600000
读取整片 8MB Flash:
sf probe 0
sf read ${baseaddr} 0x0 0x800000
返回:
SF: 8388608 bytes @ 0x0 Read: OK
计算原厂固件 CRC32:
crc32 ${baseaddr} 0x800000
结果为:
CRC32 for 80600000 ... 80dfffff ==> 5e9bef30
这个 CRC 后面用于判断备份是否完整。
六、通过 MobaXterm 日志导出原厂固件
由于没有 CH341A,不能直接读取 Flash 文件,只能使用 U-Boot 的 md.b 命令将内存内容以十六进制文本方式输出,再保存为日志。
确认 MobaXterm 的日志记录功能正常后,执行:
md.b ${baseaddr} 0x800000
也就是:
md.b 0x80600000 0x800000
这条命令会把 8MB 原厂 Flash 内容以文本形式输出到串口。由于每 16 字节会被展开成一行文本,所以最终日志远大于 8MB。
实际等待较长时间后,终端滚动结束并重新出现:
isvp_t21#
日志文件大小约 40MB,属于正常范围。
七、将日志转换为原厂 bin 备份
在电脑本地新建 Python 脚本 dump_to_bin.py,用于从 MobaXterm 日志中提取十六进制数据,并恢复成真正的 8MB 固件文件。
转换完成后,输出如下:
parsed bytes roughly: 8388608
min addr: 0x80600000
max addr: 0x80dfffff
output file: pc420-original.bin
output size: 8388608
crc32: 5e9bef30
expected crc32: 5e9bef30
OK: backup is valid.
这说明原厂备份完整可信。
关键判断标准:
文件大小:8388608 字节
CRC32:5e9bef30
生成的原厂备份文件为:
pc420-original.bin
这个文件必须单独保存,建议至少备份到 U 盘、移动硬盘或网盘。后续如果刷坏,可以通过 CH341A 或拆 Flash 的方式写回原厂固件。pc420-original.bin dump_to_bin.py
八、校验 Thingino 固件
下载 PC420 对应的 Thingino 完整固件,并重命名为:pc420-thingino.bin
pc420-thingino.bin
使用 PowerShell 和 Python 校验文件大小和 CRC32:
python -c "import zlib, pathlib; d=pathlib.Path('pc420-thingino.bin').read_bytes(); print(len(d)); print(f'{zlib.crc32(d)&0xffffffff:08x}')"
输出:
8388608
cc8b57a7
说明 Thingino 固件大小为 8MB,符合 PC420 的 GD25Q64C Flash 容量。
记录 Thingino 固件 CRC32:
cc8b57a7
九、通过 YMODEM 传输 Thingino 固件
重新进入 U-Boot:
isvp_t21#
设置内存地址:
setenv baseaddr 0x80600000
启动 YMODEM 接收:
loady ${baseaddr}
U-Boot 显示:
## Ready for binary (ymodem) download to 0x80600000 at 115200 bps...
然后在串口工具中选择 YMODEM 发送 pc420-thingino.bin。
传输完成后显示:
## Total Size = 0x00800000 = 8388608 Bytes
检查文件大小变量:
echo ${filesize}
返回:
800000
计算内存中的 Thingino 固件 CRC32:
crc32 ${baseaddr} 0x800000
返回:
CRC32 for 80600000 ... 80dfffff ==> cc8b57a7
这个值与电脑本地计算出的 Thingino 固件 CRC32 一致,说明串口传输没有出错。
十、正式擦写 Flash
确认以下条件全部满足后,才开始擦写:
1. 原厂固件 pc420-original.bin 已成功备份
2. 原厂备份 CRC32 = 5e9bef30
3. Thingino 固件大小 = 8388608 字节
4. Thingino 固件 CRC32 = cc8b57a7
5. YMODEM 传输后 echo ${filesize} = 800000
6. U-Boot 中 crc32 ${baseaddr} 0x800000 = cc8b57a7
正式刷写命令如下:
sf probe 0
sf erase 0x0 0x800000
sf write ${baseaddr} 0x0 0x800000
实际返回:
SF: 8388608 bytes @ 0x0 Erased: OK
SF: 8388608 bytes @ 0x0 Written: OK
至此,Thingino 固件已经写入整片 SPI Flash。
十一、重启和首次配置
刷写完成后重启摄像头。
重启后,摄像头成功启动 Thingino,并可进行配网。配网完成后,摄像头可以在局域网内访问。
至此,PC420 已经成功从原厂固件刷入 Thingino 固件。

十二、刷机后的简单优化
刷入 Thingino 后,局域网查看画面时存在一定卡顿。PC420 的硬件规格有限,T21 主控、RTL8188FTV 2.4G Wi-Fi、8MB Flash 都不适合高码率高帧率视频。
建议优先调整视频参数:
主码流:
分辨率:1280×720 或 1920×1080
帧率:15 fps
码率:1000–1800 kbps
GOP:15 或 30
子码流:
分辨率:640×360 或 640×480
帧率:10 fps
码率:300–600 kbps
如果用于房车倒车影像,建议使用:
分辨率:1280×720
帧率:15 fps
码率:800–1200 kbps
GOP:15
音频:关闭
RTSP 直连
播放器缓存:100–300ms
同时优化 Wi-Fi:
2.4G 固定信道 1/6/11
频宽 20MHz
摄像头固定 IP
路由器尽量靠近摄像头
避免金属车体严重遮挡
十三、关于麦克风和双向通话
刷入 Thingino 后,麦克风是否可用取决于 PC420 的硬件和当前 Thingino 构建是否启用了音频功能。
如果后台有 Audio、Microphone、RTSP Audio 等选项,可以先打开音频,再用 VLC 通过 RTSP 直连测试是否有声音。
双向通话则还需要摄像头板子上有喇叭和功放。如果 PC420 原厂 App 支持对讲,说明硬件上大概率具备双向音频基础;如果只有麦克风、没有喇叭,则只能实现单向拾音,不能实现手机对摄像头喊话。
普通 VLC 不适合测试双向通话,后续可考虑通过 Scrypted、Frigate、Home Assistant + go2rtc 等平台进一步测试。
十四、踩坑记录
一开始串口显示乱码,原因是串口参数或显示模式不正确。最终使用 115200、8N1、无流控后正常。
看到串口日志不代表可以刷机,必须能进入 U-Boot。
只接 TX 和 GND 只能看日志,不能中断 U-Boot;必须接上摄像头 RX 到 USB-TTL TX。
MobaXterm 的 “Start logging” 是软件菜单功能,不是 U-Boot 命令,不能输入到
isvp_t21#后面。U-Boot 命令行必须使用英文半角输入法,中文输入法会导致乱码命令。
一定要先备份原厂固件,并校验 CRC 后再刷。
sf erase 0x0 0x800000是危险命令,执行后原厂系统就被擦除,必须在固件校验通过后再执行。YMODEM 传输完成后,必须检查
filesize和 CRC32,不能只看传输完成提示。串口备份 8MB Flash 会生成约 40MB 文本日志,这是正常现象。
没有 CH341A 时,串口刷机可行,但容错率低,备份和校验更重要。
十五、最终结果
本次刷机最终成功。
关键结果如下:
原厂固件备份:
pc420-original.bin
大小:8388608 字节
CRC32:5e9bef30
Thingino 固件:
pc420-thingino.bin
大小:8388608 字节
CRC32:cc8b57a7
硬件:
主控:Ingenic T21
Flash:GD25Q64C,8MB
传感器:F23
Wi-Fi:RTL8188FTV
刷写结果:
sf erase 成功
sf write 成功
Thingino 启动成功
局域网访问成功
这次最大的经验是:即使没有 CH341A,只要 PC420 能进入 U-Boot,并且 U-Boot 支持 sf、loady 和 crc32,就可以通过 USB-TTL 串口完成完整刷机。但整个过程必须严格执行备份、校验、传输校验、写入校验,不能跳步。