TheB1t/g102-custom-fw
GitHub: TheB1t/g102-custom-fw
针对 Logitech G102/G203 的 STM32F072CB 实现干净室定制固件与 DFU 引导加载程序,替代官方固件并开放底层行为控制。
Stars: 0 | Forks: 0
# g102-custom-fw
Logitech G102 LIGHTSYNC 的定制固件 —
用于 G102/G203 内部 STM32F072CB MCU 的即插即用固件替代
所有内容均基于 libopencm3 从零编写:HID 鼠标服务、编码器驱动、
“1855” 光学传感器驱动、10 位 BCM RGB 灯光栈,以及驻留在
闪存前 16 KB 的 USB DFU 引导加载程序,其余部分可通过 USB 重刷。

## 状态
| 子系统 | 状态 |
| --- | --- |
| USB HID 引导鼠标(5 按键 + 滚轮) | 正常 |
| 编码器(格雷码四倍频) | 正常 |
| “1855” 光学传感器(运动 + DPI) | 正常 — 固件中可重映射轴 |
| 3× RGB LED(10 位 BCM,约 195 Hz,平方呼吸) | 正常 |
| USB DFU 1.1 引导加载程序(`dfu-util` 兼容) | 正常 |
| 3 秒 DPI 长按进入 DFU 模式 | 正常 |
| 前向侧宏按钮退出 DFU | 正常 |
尚未完成:12 位运动累加、闪存中保存的每 LED 色彩配置文件、
板载 DPI 切换、滚动加速度。
## 硬件
- **MCU** — STM32F072CB(ARM Cortex-M0,48 MHz HSI48,128 KB 闪存,16 KB SRAM)。
- **传感器** — 标记为 `1855 Rev 007` 的芯片,Logitech 内部设计,可能是 Mercury 系列
的修订版。以约 1.5 MHz 的 SPI1 模式 3 驱动,使用 PA15 的软片选。
无公开数据手册;请参考
[`docs/SENSOR_1855.md`](docs/SENSOR_1855.md) 获取寄存器映射和
初始化协议(由示波器捕获重构)。
- **RGB** — 3 个共阳 LED,9 路低侧驱动阴极。高电平点亮。
- **按键** — LMB/RMB/MMB + DPI + 两个侧宏按键,均为低电平有效,
内部上拉。
完整的连续性引脚定义位于
[`docs/G102_BOARD.md`](docs/G102_BOARD.md),并与
[`common/board.h`](common/board.h) / [`common/board.hpp`](common/board.hpp) 一致。
## 闪存布局
```
0x08000000 ────────────── bootloader (16 KB) ──────────
0x08004000 ────────────── firmware (112 KB) ─────────
0x08020000 ────────────── (end of internal flash) ─────
```
引导加载程序会自我保护:低于 `0x08004000` 的闪存写入会被拒绝。
它在以下任一情况保持 DFU 模式:
1. `BOOT_MAGIC_ADDR` 持有复位时的跳转值(固件请求重刷),
2. DPI 按键在复位时按下(物理强制),
3. `0x08004000` 处的固件向量表无效(全新芯片或闪存损坏)。
魔法字位于 `0x20003FFC` — 这是 SRAM 的最后一个字,
在链接器脚本的 `ram` 区域中被排除,因此初始 MSP 或 `.bss` 不会
在复位与引导加载程序入口之间清除它。
## 构建
需要 PlatformIO。
```
pio run # default: bootloader
pio run -e firmware # firmware
pio run -e bootloader -e firmware # both
```
输出文件位于 `.pio/build//firmware.{elf,bin}`。
## 烧录
两个辅助脚本位于 [`scripts/`](scripts/):
- [`flash_bootloader.sh`](scripts/flash_bootloader.sh) — OpenOCD + ST-Link,
一次性通过 SWD 烧录。
- [`flash_firmware.sh`](scripts/flash_firmware.sh) — 构建固件并通过 USB DFU 推送。
### 首次烧录(从官方固件到自定义)— 通过 SWD 使用 ST-Link
**SWD 测试点。** 板上未预装排针;你需要在 PCB 底部
焊接或使用探针连接到三个焊盘:
| 信号 | 测试点 |
| --- | --- |
| SWCLK | `TP3` |
| SWDIO | `TP2` |
| NRST | `TP4` |
| GND | 任意接地焊盘 / USB 屏蔽层 |
供电请使用 USB 给板子供电 — 不要从 ST-Link 提供 3V3。
**务必将 ST-Link GND 与板子 GND 相连**,即使不共用 3V3:
SWD 信号以地为参考,没有共地会导致无法识别或读取错误。
**BOOT0 引脚。** 本板通过 `R20` 将 BOOT0 拉低。官方固件在复位时
会保持 SWD 状态无法 halt — 你需要进入 STM32 系统存储器引导加载程序。
通过将 BOOT0 短接到 3V3 抬起它(使用带 1–10 kΩ 电阻的导线连接 VCC
即可)**并在整个 SWD 会话期间保持高电平** — 释放后系统引导加载程序
会退出,SWD 将失去目标。
**步骤。**
1. 焊接或固定三根 SWD 线、ST-Link GND 线以及
BOOT0→3V3 线。
2. 将鼠标插入 USB(为 3V3 供电)。
3. 解锁 RDP — 这将全片擦除闪存并将 RDP 降至 Level 0:
openocd -f interface/stlink.cfg -c 'transport select hla_swd' \
-f target/stm32f0x.cfg \
-c 'init; reset halt; stm32f0x unlock 0; reset halt; exit'
4. 清除 WRP 位(即使 RDP=0 在某些芯片上仍会保持):
openocd -f interface/stlink.cfg -c 'transport select hla_swd' \
-f target/stm32f0x.cfg \
-c 'init; reset halt; flash protect 0 0 15 off; sleep 500; exit'
5. 构建并烧录引导加载程序:
pio run -e bootloader
./scripts/flash_bootloader.sh
6. 断电再上电(拔出 USB)使选项字节生效,然后释放 BOOT0 并拔掉 SWD。
重新插入 USB — 此时应看到引导加载程序已激活。
在插入时按住 DPI 可确认已进入 DFU(LED 以 1/4 亮度循环)。
接着通过 DFU 刷入固件(下一节)。
### 之后 — 通过 DFU 刷写
1. 插入鼠标时按住 DPI,**或在运行固件中按住 DPI 3 秒**。
2. 鼠标将枚举为 `0483:df11`,LED1 → LED2 → LED3 以 1/4 亮度循环,
表示已进入 DFU 模式。
3. 刷写:
./scripts/flash_firmware.sh
刷写完成后,引导加载程序会自动重置并运行新固件 —
无需重新插拔。**前向侧宏按钮**可在不刷写的情况下手动退出 DFU。
## 法律声明
本项目为独立的逆向工程,与 Logitech 无关联、未经授权或合作。
- 本仓库中的原始代码根据 MIT License 发布
(参见 [`LICENSE.md`](LICENSE.md))。
- [`firmware/src/sensor_frames.h`](firmware/src/sensor_frames.h) 和
[`captures/`](captures/)(原始逻辑分析仪追踪、其反汇编以及
`srom_verified_1020.bin` — 线上观测到的 SROM 载荷)为 SPI 总线事务的
逐字节记录,仅用于互操作性与可复现性。并未反编译或包含任何官方固件二进制文件。
- 使用 Logitech 的 VID/PID(`046D:C092`)使设备可作为官方 G102/G203
的即插即用替代品。并非-IF 认证产品,仅限个人与研究使用。
- 链接依赖 [libopencm3](https://libopencm3.org/)(LGPL-3.0-or-later)。
“Logitech”、“G102”、“G203”和“LIGHTSYNC”为 Logitech International S.A.
的商标,仅用于标识。
**不提供任何担保。** 刷写自定义固件可能损坏设备。你需对使用该代码的一切行为负责。
标签:1855 光学传感器, Bootloader, C/C++17, Clean-room 实现, DFU, G203, HID 鼠标, libopencm3, LIGHTSYNC, Logitech G102, RGB LED BCM, STM32F072CB, USB DFU, USB 固件升级, 可刷写固件, 四象限编码器, 固件逆向, 客户端加密, 嵌入式开发, 开源固件, 开源硬件, 自定义固件, 鼠标固件