一、背景

手里有捡了几个垃圾: Victure PC420 摄像头,原厂固件封闭,可玩性较差。我希望将其刷入开源的 Thingino 固件,用于局域网 RTSP/ONVIF 监控,后续计划接入房车倒车影像或局域网视频系统。

一开始的方案是使用 CH341A 编程器直接夹 SPI Flash 写入固件,这是最稳妥的方法。但我手头没有 CH341A,拆开 PC420 后发现主板上预留了串口焊盘,因此尝试通过 USB-TTL 串口进入 U-Boot,再通过 YMODEM 传输固件并写入 SPI Flash。

最终刷机成功。PC420_Thingino_Flasher-KvmE.exe


二、准备工具

本次使用的工具如下:

  1. PC420 摄像头一台

  2. USB-TTL 串口模块,型号为 CH340

  3. 杜邦线若干

  4. MobaXterm,用于串口连接和日志记录

  5. Tera Term 或支持 YMODEM 的串口工具,用于发送固件

  6. Thingino 对应 PC420 的 8MB 完整固件

  7. 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 等平台进一步测试。


十四、踩坑记录

  1. 一开始串口显示乱码,原因是串口参数或显示模式不正确。最终使用 115200、8N1、无流控后正常。

  2. 看到串口日志不代表可以刷机,必须能进入 U-Boot。

  3. 只接 TX 和 GND 只能看日志,不能中断 U-Boot;必须接上摄像头 RX 到 USB-TTL TX。

  4. MobaXterm 的 “Start logging” 是软件菜单功能,不是 U-Boot 命令,不能输入到 isvp_t21# 后面。

  5. U-Boot 命令行必须使用英文半角输入法,中文输入法会导致乱码命令。

  6. 一定要先备份原厂固件,并校验 CRC 后再刷。

  7. sf erase 0x0 0x800000 是危险命令,执行后原厂系统就被擦除,必须在固件校验通过后再执行。

  8. YMODEM 传输完成后,必须检查 filesize 和 CRC32,不能只看传输完成提示。

  9. 串口备份 8MB Flash 会生成约 40MB 文本日志,这是正常现象。

  10. 没有 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 支持 sfloadycrc32,就可以通过 USB-TTL 串口完成完整刷机。但整个过程必须严格执行备份、校验、传输校验、写入校验,不能跳步。

PC420_Thingino_Flasher.exe

PC420_Thingino_Flasher.zip