opsthomaz/samsung-smart-remote-tm2280e-firmware-repair
GitHub: opsthomaz/samsung-smart-remote-tm2280e-firmware-repair
一份三星 Smart Control 2022 遥控器固件的逆向与修复指南,解决 OTA 同步失败问题。
Stars: 0 | Forks: 0
# Samsung Smart Control TM2280E — 固件逆向工程
## ⚠️ 严重警告 — 刷写前务必阅读
**不要将此仓库中的 `controller_fixed5.bin` 刷写到你的遥控器。**
该文件包含与研究者特定硬件单元绑定的数据:
1. **蓝牙地址(BD Address):** `70:09:71:1A:CC:2E` — 刷写此文件会将研究者的蓝牙身份克隆到你的设备,若两个遥控器在同一网络下会导致配对冲突。
2. **RF 校准(约 156 项,标签 `0xC1`):** 这些数值是针对研究者的晶振与天线的物理公差在出厂时测量并写入的。用他人的校准覆盖会严重降低蓝牙通信距离或导致随机掉线。
**正确做法:** 使用 `analysis/patch_your_firmware.py` 对你自己的固件转储应用两位修复,以保留你独有的蓝牙地址与 RF 校准。
```
# 使用 1.8V 适配器先读取自己的闪存!
# 然后修补自己的转储:
python3 analysis/patch_your_firmware.py your_backup.bin
```
`controller_fixed5.bin` 与 `controller_original.bin` 文件仅供**教育分析与对比**使用。
## 设备信息
| 字段 | 值 |
|---|---|
| **产品** | Samsung Smart Control 2022 |
| **型号代码** | TM2280E(`TM2280E_HARV`) |
| **内部名称** | Samsung SC22 |
| **兼容电视** | QN85BA、QN90B、QN95B 及类似 2022 年 QLED/Neo QLED |
| **SoC** | Atmosic ATM3(ARM Cortex-M0,16 MHz) |
| **外部闪存** | Winbond W25Q40EW — 4 Mbit(512 KB),**1.8V** |
| **能源** | 太阳能面板 + 射频能量采集(2.4 GHz) — 无电池,仅电容 |
| **BLE** | 蓝牙 5.0,ATVV(Android TV Voice),HID over GATT |
| **红外** | 三星红外协议,电视开机/关机 |
## 问题描述
在一次失败的 OTA 固件更新后,遥控器停止与电视同步。LED、按键与红外功能均正常。恢复出厂设置(后键 + 播放/暂停键)无效。此前未有公开的固件结构或修复流程文档。
## 固件文件
| 文件 | SHA256 | 说明 |
|------|--------|------|
| `firmware/controller_original.bin` | `433eb1e8...` | 原始转储 — 仅适用于研究者硬件 |
| `firmware/controller_fixed5.bin` | `12b4dfdf...` | 已修补转储 — 仅适用于研究者硬件 |
**用于你自己的修复:在你自己的转储上运行 `patch_your_firmware.py`。**
## 闪存布局
```
Offset Size Region Contents
─────────────────────────────────────────────────────────────────────
0x00000 192 KB Bank A — firmware code App v0.0.0.9 / SDK 4.1.0
0x30000 60 KB NVDS Bank A — primary 187 bytes valid (BD Address, config)
0x3F000 4 KB NVDS Bank A — secondary ❌ BLANK — erased
0x40000 192 KB Bank B — firmware code App v0.2.0.0 / SDK 4.1.1
0x70000 60 KB NVDS Bank B — primary 4085 bytes valid (full calibration)
0x7F000 4 KB NVDS Bank B — secondary ⚠️ Nearly erased (13 bytes)
```
## 根因分析
### 1. 固件更新中断
ATM3 使用**双区机制**与专有的启动头(Atmosic `USR` 格式)。每个区都有一个位于头偏移 `+0x10` 的 1 字节标志位,通过 NOR 闪存逐步编程(`1→0`)完成 OTA 流程:
```
0xFF → 0xFE → 0xFC → 0xF8 → 0xF0 → 0xE0 → 0xC0 → 0x80 → 0x08 → 0x00
PROG VALID DL_OK VRF_OK FIN_OK STARTED STABLE ← here CONFIRMED
```
**区 A 标志:`0xFE`** — 仅设置 `MK_PROGRAMMED`。为出厂/回退状态。
**区 B 标志:`0x08`** — 除位 3(`BOOT_CONFIRMED`)外所有 OTA 步骤已完成。应用从未确认启动。
### 2. NVDS 备用槽被擦除
固件引用的 NVDS 地址如下:
- `0x10030000` → `0x30000`(主槽) — 存在但稀疏
- `0x1003F000` → `0x3F000`(备用槽) — **完全擦除**
由于备用槽被擦除,NVDS 校验在 OTA 后的首次启动时失败,导致 `BOOT_CONFIRMED` 永远无法写入 — 形成永久“未确认 OTA”循环。
## 修复方案(2 次修改,共 188 字节)
| 偏移 | 修改 | 原因 |
|------|------|------|
| `0x40010` | `0x08` → `0x00` | 区 B:编程位 3 → `BOOT_CONFIRMED` |
| `0x3F000–0x3F0BB` | `0xFF...` → NVDS 数据 | 从主槽还原区 A 的 NVDS 备用槽 |
**应用到你自己的转储:**
```
python3 analysis/patch_your_firmware.py your_backup.bin
# 创建:your_backup_fixed.bin
```
## 仓库结构
```
samsung-smart-remote-tm2280e-firmware-repair/
├── README.md
├── LICENSE-MIT ← Python scripts
├── LICENSE-CC-BY-NC-4.0 ← Documentation
├── .gitignore
├── firmware/
│ ├── controller_original.bin ← Researcher's dump (reference only)
│ └── controller_fixed5.bin ← Researcher's patched firmware (reference only)
├── analysis/
│ ├── patch_your_firmware.py ← ✅ USE THIS to fix your own dump
│ ├── nvds_decoder.py ← NVDS TLV decoder
│ ├── flash_layout.py ← Flash region mapper and auditor
│ └── boot_flag_analysis.py ← Boot decision flag analysis
├── docs/
│ ├── repair_procedure.md ← Step-by-step repair guide
│ ├── ota_mechanism.md ← OTA boot flag system documentation
│ └── nvds_format.md ← NVDS structure documentation
└── hardware/
└── ch341a_1v8_note.md ← Critical: W25Q40EW is 1.8V
```
## 快速开始
```
git clone https://github.com/opsthomaz/samsung-smart-remote-tm2280e-firmware-repair
cd samsung-smart-remote-tm2280e-firmware-repair
# 分析任何 TM2280E 固件的转储
python3 analysis/flash_layout.py your_backup.bin
python3 analysis/boot_flag_analysis.py your_backup.bin
python3 analysis/nvds_decoder.py your_backup.bin
# 修补自己的转储
python3 analysis/patch_your_firmware.py your_backup.bin
# → 写入 your_backup_fixed.bin
```
## 所需工具
| 工具 | 用途 | 备注 |
|------|------|------|
| CH341A 编程器 | SPI 闪存读/写 | |
| **1.8V 电平转换适配器** | 电压兼容性 | **必需** — 芯片为 1.8V |
| AsProgrammer / NeoProgrammer | 闪存软件(Windows) | |
| `flashrom` | 闪存软件(Linux/macOS) | |
| Python 3.8+ | 分析脚本 | 无外部依赖 |
## 调查结果
| 调查结果 | 状态 |
|---------|------|
| 已记录 Atmosic ATM3 双区启动标志机制 | ✅ 首次公开文档 |
| NVDS TLV 格式已解码 | ✅ |
| 同步失败的根因已确认 | ✅ 固件更新中断 + NVDS 备用槽被擦除 |
| 自动修复脚本(保留用户唯一数据) | ✅ |
| W25Q40EW 1.8V 电压警告 | ✅ 关键 |
| 公开先例 | ❌ 未发现 |
## 许可证
- **Python 脚本**(`analysis/*.py`):[MIT 许可证](LICENSE-MIT)
- **文档**(`*.md`、`docs/`、`hardware/`):[CC BY-NC 4.0](LICENSE-CC-BY-NC-4.0)
- **固件二进制文件**:仅作为教育/修复参考提供
## 免责声明
本研究仅用于教育与修复目的,针对研究者本人拥有的硬件。所有商标归其各自所有者所有(三星电子、Atmosic Technologies、Winbond Electronics)。
## 贡献
如果你已在 TM2280E(或类似基于 Atmosic ATM3 的三星遥控器)上测试过此修复,请通过问题提交你的结果——包括板卡版本、发现的固件版本以及修复是否生效。来自不同硬件版本的报告尤其有价值。
标签:0xC1, 1.8V, Android TV Voice, ARM Cortex-M0, ATM3, Atmosic, ATVV, BD地址, BLE, boot标志, HID, NVDS, OTA, RF校准, Samsung, TDK, TLV, W25Q40EW, 三星, 云资产清单, 修复, 分析, 双库, 双库OTA, 同步失败, 固件架构, 固件逆向, 太阳能, 射频校准, 嵌入式, 工厂校准, 物联网, 电容器, 电视配对, 能量收集, 蓝牙5.0, 蓝牙MAC, 调试, 逆向工具, 逆向工程, 遥控器, 闪存, 首次公开