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 重刷。 ![G102 PCB, top side](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/56742d8150052129.jpg) ## 状态 | 子系统 | 状态 | | --- | --- | | 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 固件升级, 可刷写固件, 四象限编码器, 固件逆向, 客户端加密, 嵌入式开发, 开源固件, 开源硬件, 自定义固件, 鼠标固件