SKINIGHT
发布于 2026-07-24 / 1 阅读
0
0

GL3224 1539 固件 单LUN 合并改造与刷写记录

本文记录如何修改 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、19

1539 的对应档位包括:

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 0xC4B9

0xC4B9 是 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 原生存在的通道聚合路径。

完整思路可以概括为:

  1. 反汇编 1539 固件

  2. READ CAPACITYREAD(10)WRITE(10) 反向追踪

  3. 找到控制聚合模式的 2Ah.1

  4. 找到由 C108 决定模式的启动分支

  5. 0xC499 强制跳转到 0xC4B9

  6. 设置单 LUN EEP 配置

  7. 重新计算 EEP 和固件尾部校正

  8. 使用官方工具完成固件刷写

最终核心代码补丁只有三个字节:

C499: 90 C1 08 → 02 C4 B9

但它启用的是一整套已经存在于 1539 中的容量计算、通道切换和共享状态管理机制。

风险提示:固件偏移仅适用于本次分析的 1539 固件。不同版本、不同批次或不同硬件拓扑不能直接套用。刷写前应准备原厂固件和恢复方案,并确保设备具有内部回退能力。


评论