bitplane/nokia-dct3-re
GitHub: bitplane/nokia-dct3-re
在 MAME 中逆向模拟诺基亚 DCT3 系列手机硬件,使原始固件能在桌面端运行与分析的逆向工程工具包。
Stars: 1 | Forks: 0
# Nokia DCT 平台模拟
本项目对 Nokia 早期的数字蜂窝电话平台进行逆向工程,并在
[MAME](https://github.com/mamedev/mame) 中进行模拟。参考机型是 Nokia 3210 (NSE-8/9),
这是一款基于 MAD2 基带 ASIC 构建的 DCT3 手机。长期的愿景是建立一个可重用、
易于维护的 DCT 系列架构,能够运行来自 DCT1、DCT2、
DCT3、DCTL,以及最终在硬件被充分理解后的 DCT4 手机的未经修改的固件。
这是一个研究方向,而不是兼容性承诺。Nokia 的产品代际在
ASIC、flash 布局、显示屏、 companion 芯片、RF、DSP 固件、产品数据和应用
软件方面各不相同。实际的方法是渐进式的:
1. 观察真实的固件/硬件边界。
2. 在静态和运行时对其进行映射。
3. 为缺失的对端实体构建原型,但不宣称该原型即为硬件。
4. 用寄存器、总线、邮箱或设备模型替换原型。
5. 在将其视为共享平台行为之前,根据另一个 ROM 验证该组件。
最初的里程碑是在 Nokia 3210 上运行 Snake。这仍然是一个有用的垂直测试,但
预期目标是实现一个平台,使得 Snake、T9、铃声、地址簿、
运营商 logo、设置以及手机固件的其余部分成为普通固件行为,而
不是特殊情况。
## 当前状态
3210 固件的执行已经足够深入,能够初始化 CPU、MAD2 外设、CCONT、显示屏、
EEPROM 路径、RTOS 任务、外部服务机制以及大量的 SIM 交互。已验证的
CCONT、DSP 服务、外部服务和 SIM 设备由 3210 机器配置文件启用,
而不是通过环境变量栈。一个显式的缺失硬件负面配置文件
受语义引导谓词保护,无需特定的失败画面。
这个连贯的建模配置文件达到了经过验证的交互式桌面。SIM
完成了普通的非 CPHS 初始化,预置的身份数据移除了
手机锁提示,物理左软键按下可打开固件的
`Phone book` 菜单。Task 1 保持在 `0x0004` 模式;该模式记录了随后的
电源/关机延续,且不会阻塞 UI。正确的 MAD2 IRQ0 键盘
连线到达固件矩阵扫描器和解码后的按键资源。
未预置的 Security-code 编辑器也接受物理 `12345` 序列。
报告代码 7 是随后的电源/关机报告。映射的回调、descriptor、
定时器和 task-6 选择器路径是有条件的固件生命周期,而
不是缺失的硬件确认。详细的契约位于
[`docs/mmi_layer.md`](docs/mmi_layer.md)。
`make verify-frontier RUN_DIR=run_frontier` 是权威的 3210 硬件
基线。它使用请求驱动的外部服务对端
和普通的 SIMI/FIQ6 卡模型,最终停留在模式 `0x0004`,服务会话状态为
`0x49`,no-SIM 清除,并设置了 SIM 使能。键盘交互通过
MAD2 IRQ0 和固件矩阵扫描器独立覆盖。`make verify-mmi-menu`
添加了预置身份并保护交互式菜单事务。
对于直接使用,`make run-interactive` 会打开一个普通的 MAME 窗口,包含标准的
可重映射输入和持久化的 NVRAM;它不会驱动脚本按键。
DSP、radio、GSM-network 和外部服务 HLE 设备在明确的
传输边界做出反应。它们是可执行的协议模型,而不是完成的硅片
模拟,但不会调用固件处理程序或写入注册状态。
Firmware-PC 条件仅限于诊断跟踪;产品预置
通过 EEPROM 和其他普通设备边界进入。
## 成熟度
以下标签具有确切的含义:
- **Mapped**:固件所有权和边界已被记录。
- **Prototype**:存在足够的对端行为来测试契约,通常通过研究 hook 实现。
- **Partial hardware**:固件使用普通的寄存器或总线,但行为不完整。
- **Component-ready**:契约足够稳定,可以提取到 MAME 设备中。
- **Validated**:该组件通过了 3210 回归测试和 second-ROM 置信度检查。
| 子系统 | 状态 | 证据 / 下一步 |
|---|---|---|
| ARM7、flash、RAM 映射 | Partial hardware | 3210 可靠执行;产品布局需要跨 ROM 验证。 |
| MAD2 定时器、睡眠和 IRQ/FIQ | Partial hardware | 启动关键路径正常工作;配对的 ROM 和针对性测试覆盖了 ARM clock-stop、定时器/按键唤醒和 save-state 恢复,而确切的分频器和过渡时序仍有待解决。 |
| PCD8544 LCD 和键盘 | Partial hardware | 固件渲染出真实的帧;MAD2 IRQ0 到达矩阵扫描器和解码的输入资源。 |
| 24C128 EEPROM | Partial hardware | MAME 的原生 I2C 设备通过 GenIO 连接并通过了 oracle;预置和并行别名需要验证。 |
| CCONT 电源/ADC/RTC | Partial hardware | 提取的 MAME 设备通过了 oracle;物理 ADC 延迟、RTC 编码、watchdog 时钟和板级模拟信号仍有待解决。 |
| GENSIO serial/SELECT | Partial hardware | 提取的 endpoint/status/LCD/CCONT 传输通过了两个 3210 ROM;物理时序和 SELECT 附加的对端仍有待解决。 |
| SIMI 控制器和 SIM 卡 | Partial hardware | 独立的设备通过 byte/reset 回调组合;原生的 SIMI/FIQ6 和 T=0 初始化工作正常,并且 GSM 11.11 线性记录路径持久存储固件写入的 ADN 联系人。时序、错误、安全性和更广泛的文件覆盖范围仍不完整。 |
| DSP 邮箱/服务角落 | Prototype | Bootstrap、服务时序、packet rings、两个固件编程的语音和孤立的 GSM-FR 语音后端通过 HLE 工作;DSP 核心和 DSP 本地 COBBA 控制解释仍未被模拟。 |
| 启动/服务/网络对端 | Prototype | 独立的服务、Nokia L1 和符合标准的 GSM 设备通过 DSPIF 组合;一个实验性 cell 支持驻留、位置更新、释放和运营商显示。更广泛的对端契约仍不完整。 |
| 交互式启动 | Mapped | 预置的引导到达待机屏幕,并通过受保护的物理键盘 oracle 打开 `Phone book`。模式 4 与 UI 兼容;跨 ROM 的显示一致性仍有待解决。 |
| MMI/RTOS 内部机制 | Mapped | 由固件拥有;应观察它们而不是模拟它们。 |
| 音频、RF、网络 | Partial HLE | 实验性 cell 支持原生注册、寻呼、MT 呼叫/SMS 控制、双向 GSM-FR TCH/F 媒体、FACCH/SACCH 共存、降级帧和跨越两个 3210 ROM 的拆解。物理 RF、移动性、MO 呼叫、更广泛的服务和 DSP 本地 COBBA 多路复用/控制解码仍有待解决。 |
只有当固件通过其普通接口到达组件、它不执行固件状态写入、时序表示为设备行为、支持 save state 并且通过参考和可移植性检查时,该组件才被视为已被完全封闭。
## 路线图
### 参考 3210 里程碑
1. 稳定的默认和建模引导回归。
2. 原生 SIM 初始化和离线桌面。
3. 可靠的键盘导航和持久化设置。
4. 地址簿编辑和文本/T9 输入。
5. 铃声播放和音频输出。
6. 运营商 logo 和其他同期内容工作流。
7. Snake 和其他内置游戏。
### 平台工作
1. 恢复 MAD2 剩余的 clock-divider、transition-latency、extended-interrupt
和 rail-sequencing 契约。
2. 仅在受控的固件消费者或硬件测量提供单位时,替换校准过的 CCONT ADC/serial 时序和板级模拟值。
3. 从原生的固件请求或针对性的协议一致性测试中,扩展 SIMI/卡时序、错误、移除、CHV 和文件行为。
4. 将 DSPIF 保持为仅用于传输的挂载点,同时仅根据已验证的流量扩展 HLE;未来的 C54x 后端将在同一接口处替换该 HLE。
5. 使用经过验证的 3210、3310、3330 和 3410 配置文件,将共享的 DCT3 行为与特定于产品的显示、flash、存储和对端契约区分开来。
新手机支持最初只是一个可移植性探针。提前失败的 ROM 在
识别出 3210 特定假设时仍然具有价值。
## 仓库布局
```
driver/ MAME driver and extracted Nokia devices
tools/ Thumb-1 disassembly and cross-ROM helpers
ghidra/scripts/ headless analysis and symbol-export scripts
ghidra/symbols/ firmware-specific symbol maps
docs/ hardware atlas and RE reports
roms/ ignored, user-supplied firmware plus verification instructions
```
开始阅读:
- [`docs/README.md`](docs/README.md) 查看文档地图和权威规则。
- [`docs/hardware_atlas.md`](docs/hardware_atlas.md) 查看固件/硬件边界。
- [`docs/driver_structure.md`](docs/driver_structure.md) 查看实现规则。
- [`docs/driver_vision.md`](docs/driver_vision.md) 查看组件下线路径。
- [`docs/service_bootstrap.md`](docs/service_bootstrap.md) 查看服务会话启动。
- [`docs/mmi_layer.md`](docs/mmi_layer.md) 查看经过验证的键盘、idle/menu、security-editor 和电源生命周期。
- [`docs/sim_registration.md`](docs/sim_registration.md) 查看 SIM 初始化和相邻会话固件映射。
- [`docs/tooling.md`](docs/tooling.md) 查看分析工具。
## 固件政策
此处不分发任何 Nokia 固件、EEPROM 镜像、专有工具或派生的反编译产物。
请携带合法获取的镜像并将其放置在被忽略的 `roms/` 目录下。本仓库
仅出于可复现性目的记录文件名和哈希值;请参阅 [`roms/README.md`](roms/README.md)。
绝对地址和导出的 3210 符号映射专用于 NSE-8/9 v6.00。其他 ROM
即使在实现相同硬件契约的情况下,也可能会移动函数和数据。
## 构建与复现
Makefile 锁定了上游 MAME 版本,并将 Nokia 源码覆盖到本地检出目录中。
安装所需的 3210 文件后:
```
make build
make verify
make swap16
```
`make verify` 会引导显式的缺失硬件配置文件并检查其语义谓词。
正常的产品组合是类型化的机器配置。命名的 `HWCFG` 和
`DIAGCFG` fixture 选择负面组合和控制器一致性测试;
被动诊断使用 MAME 日志记录。`NOKIA_DCT3_*` 变量仅限于
外部 Lua 工具,用于脚本输入、捕获和测试输出。之前的
`NOKI3210_*` 前缀不再保留作为兼容性别名。
## 工程规则
- 硬件行为应属于设备或普通的内存映射处理程序。
- 产品差异是机器配置或数据,而不是 Firmware-PC 条件。
- 研究 hook 是可选的、明确标记的,并且必须随着契约变为设备而减少。
- 失败的探针应被记录和移除,而不是作为兼容性路径保留。
- 3210 oracle 在每次行为更改后运行。
- 在声明行为在 DCT3 范围内共享之前,使用第二个 ROM 进行验证。
## 许可证
原始项目代码为 BSD-3-Clause;请参阅 [`LICENSE`](LICENSE)。MAME 单独获取,作为
整体遵循 GPL-2.0-or-later 协议。受版权保护的手机固件不属于本项目的一部分。
标签:MAME, rizin, 云资产清单, 固件分析, 嵌入式系统, 硬件驱动, 逆向工程