本文记录如何修改 GL3224 的 1539 固件,使双通道存储设备在 Windows 中合并为一个 LUN,同时保留新版固件的高速传输能力。
一、改造目标
需要说明的是,本文涉及的固件分析、反汇编、脚本编写、刷写工具调用和调试过程,大量采用了 Vibe Coding 的方式完成。分析过程主要依靠反复实验、运行结果验证和 AI 辅助推理,因此本文更偏向一次完整的工程实践记录,而不是严格意义上的芯片官方技术文档。
这块设备采用 48 脚 GL3224 主控和单颗 eMMC 的 PCB 设计,最初使用 1503 固件。该固件默认工作在合并 LUN 模式,系统能够将设备正常识别为一个磁盘,但实际传输速度最高只有约 37 MB/s。
为了突破旧固件的性能限制,我开始尝试升级固件。网上能够找到的较新版本主要是 1536 和 1539,但直接刷入后设备会被错误地识别为两个 LUN,并且无法正常识别和访问板载 eMMC。
因此,本次研究的目标是:
将设备升级到新版固件;
保留新版固件更高的介质传输速度;
找出 GL3224 的 LUN 合并机制;
让单颗 eMMC 重新以一个完整磁盘的形式被系统识别;
在不改动 PCB 硬件的前提下恢复设备的正常读写功能。
所有偏移、寄存器含义和补丁逻辑,均来自对本次使用的 1503、1536 和 1539 固件进行静态分析及实机验证后的结果,不保证能够直接适用于其他硬件版本或固件批次。
修改过的固件在这里,https://wwbbq.lanzoue.com/imam43yeizmh
下面为修改思路
二、确认速度瓶颈的位置
读取 USB Hub 的 V2 连接信息后,设备状态为:
OPERATING_SS=True
CAPABLE_SS=True
BCDUSB=0x0320说明设备实际运行在 SuperSpeed,性能差异主要来自存储介质侧,而不是 USB 退回到 2.0。
反汇编旧版和 1539 固件后,可以看到明显不同的介质速度档位。
旧版固件的档位主要为:
4、8、12、15、17、18、191539 的对应档位包括:
20、25、26、50、52、75、100、120、150、180因此,最合理的方案不是在旧版合并固件中硬塞高速参数,而是以 1539 为基础,启用其内部已有的通道聚合功能。
三、固件结构分析
GL3224 固件使用 8051 指令集。将 64 KiB 固件交给 disasm51 反汇编后,重点追踪以下 SCSI 命令:
READ CAPACITY(10) = 0x25
READ(10) = 0x28
WRITE(10) = 0x2A通过这些入口,可以观察容量计算、LBA 处理以及物理通道切换逻辑。
分析中发现,1539 固件内部存在一个关键模式标志:
2Ah.1启用该标志后,固件会:
跳过普通的 LUN 到介质类型映射
将两个物理通道作为一个逻辑设备管理
使用累计容量回应
READ CAPACITY根据 LBA 和内部通道状态切换读写目标
屏蔽第二个独立 LUN 的枚举路径
同步两个通道的初始化和错误状态
这说明 1539 已经包含完整的聚合功能,只是默认没有启用。
四、聚合模式的入口
1539 启动时会读取硬件模式寄存器:
C108并根据:
C108 & 0xC2选择不同的硬件拓扑。
部分模式进入普通多 LUN 路径,另一些模式则设置:
SETB 2Ah.1并进入聚合路径。
因此,修改思路是绕过硬件模式分流,直接跳入固件原生的聚合分支。这样可以保留 1539 的全部高速驱动和 SCSI 处理代码。
五、固件修改方案
1539 固件启动时会读取硬件模式寄存器 C108,并根据不同的硬件拓扑选择普通多 LUN 模式或通道聚合模式。
聚合模式由内部标志 2Ah.1 控制。启用后,固件会使用累计容量回应 READ CAPACITY,并在读写过程中根据 LBA 和通道状态切换物理介质。
因此,修改的核心是绕过 C108 的硬件模式判断,直接进入 1539 原生的聚合分支。
强制启用聚合模式
硬件模式判断位于固件偏移 0xC499。
原始指令:
90 C1 08 ; MOV DPTR, #C108修改为:
02 C4 B9 ; LJMP 0xC4B90xC4B9 是 1539 原生聚合模式的入口。进入该分支后,固件会设置 2Ah.1,并初始化双通道共享状态。
这个改动只是强制选择 1539 中已经存在的另一条执行路径,因此可以保留新版固件的高速介质支持。
设置单 LUN
1539 固件在 0xBF80 附近包含 EEP 配置模板,其中 LUN 数量字段位于:
0xBF86普通双 LUN 配置为:
01单 LUN 配置为:
00除了修改 LUN 数量,还需要把原来分别属于两个 LUN 的物理通道位合并到 LUN0,并清空其他 LUN 的通道字段。
EEP 前 20 字节采用 8 位加法校验。修改配置后,需要重新计算校验字节,使这 20 个字节的总和低 8 位为零。
修正固件尾部
代码和 EEP 修改完成后,还需要重新生成固件最后两个校正字节。
官方升级工具会根据前面固件数据的字节和计算一个校正值,并将相同的值写入最后两个位置。修改任何代码或配置后,原来的尾部值都会失效。如果不重新生成,固件即使能够完整写入并通过读回比较,GL3224 启动时仍可能拒绝外部 SPI,并回退到内部固件。
本次强制聚合版本重新计算后的尾部为:
BA BA
# 重新生成固件尾部校正
correction = (0x55 - (sum(image[:-2]) & 0xFF)) & 0xFF
image[-2:] = bytes((correction, correction))
target.write_bytes(image)六、使用官方工具刷写固件
完成固件修改、EEP 校验和尾部校正后,可以使用 GL3224 官方升级工具进行刷写。
开始刷写
运行 FWUpgradeTool.exe
工具会显示:
Current FW version:1503
New FW version:1539确认目标版本为 1539,然后点击 Start
再次确认更新后,等待进度条完成。
刷写成功时,工具会提示:
FW Update Successful!此时重新插拔设备,让 GL3224 从新的外部 SPI 固件启动。
如果此时报错,请参考后续疑难解答。
检查刷写结果
重新枚举后,设备实例应包含:
USB\VID_05E3&PID_0749\000000001539这表示当前运行的是 1539 固件。
合并成功后,Windows 中只应出现一个磁盘实例。
且此时写入速度上涨到80MB/s
七、总结
本次修改的核心不是隐藏第二个盘符,而是启用 1539 原生存在的通道聚合路径。
完整思路可以概括为:
反汇编 1539 固件
从
READ CAPACITY、READ(10)和WRITE(10)反向追踪找到控制聚合模式的
2Ah.1找到由
C108决定模式的启动分支在
0xC499强制跳转到0xC4B9设置单 LUN EEP 配置
重新计算 EEP 和固件尾部校正
使用官方工具完成固件刷写
最终核心代码补丁只有三个字节:
C499: 90 C1 08 → 02 C4 B9但它启用的是一整套已经存在于 1539 中的容量计算、通道切换和共享状态管理机制。
风险提示:固件偏移仅适用于本次分析的 1539 固件。不同版本、不同批次或不同硬件拓扑不能直接套用。刷写前应准备原厂固件和恢复方案,并确保设备具有内部回退能力。