moh-sarwat/mt6582-linux
GitHub: moh-sarwat/mt6582-linux
一套将联想 A5500-HV(MediaTek MT6582/MT8382)平板上的 Android 替换为 Alpine Linux 的完整实践文档与工具链,包含多个此前无文档的底层硬件发现。
Stars: 0 | Forks: 0
# 基于 MediaTek MT6582 / MT8382 平板的 Linux
在 2013-2015 年的 MediaTek 平板上用 Alpine Linux 替换 Android,已在 **Lenovo A5500-HV**(Tab A8-50,MT8382,主板项目 `lvp5_row_3gfull`)上端到端成功运行。
最终结果:原厂 Lenovo 3.4.67 kernel,Alpine armv7 用户态,基于 framebuffer 的 X11 且触摸屏正常工作,以及通过 USB 线缆进行网络连接。Android 已被移除,而非双系统。
本仓库既包含**实践发现**也包含相关脚本。其中一些发现我在其他任何地方都找不到相关文档,而每一个这样的发现都需要花费一天的时间去重新探索。
## 关键发现
**`dumchar_info` 偏移量需要加上一个基址。** kernel 的分区表报告的偏移量是相对于分区区域的,该区域位于 eMMC 用户区域的某个位置之后(在此设备上为 8 MiB)。如果从扇区 0 开始转储,每个分区看起来都是空的或错误的。参见 `docs/02-partitions.md`。
**MediaTek 在 preloader 中启用了一个硬件 watchdog。** 如果用户态没有触发它(kick),主板就会在几秒钟后重置。Android 通过运行 `sbin/watchdogd` 来处理此问题。你的 init 也必须这样做,并且要作为其首要操作。参见 `docs/05-gotchas.md`。
**mtkfb 仅在 `FBIOPAN_DISPLAY` 时向 panel 传输数据。** 写入 framebuffer 只会改变内存,仅此而已。这会导致 `dd` 失效,破坏所有 framebuffer 程序,并导致 X 崩溃——表现为三种完全不同的症状,且没有任何错误信息。这是此类移植工作中最大的时间黑洞。参见 `docs/04-mtkfb.md`。
## 正常工作的功能
- 通过自定义 initramfs 启动原厂 vendor kernel
- 在原 Android `userdata` 分区上使用 Alpine Linux armv7 rootfs
- 通过 `xf86-video-fbdev` 运行 X11,通过 `evdev` 支持触摸屏
- `jwm` 窗口管理器,屏幕键盘
- 通过 USB(RNDIS gadget)进行网络连接和 SSH
- 大约 950 MB 的可用 RAM;在同一硬件上,Android 需要 512 MB 的 zram
## 无法正常工作的功能
- **无 GPU 加速。** Mali-400 kernel 驱动程序存在,但用户态部分是 Android/bionic blobs。Lima 需要 kernel 5.2+ 的 DRM 驱动程序;而这是仅有 fbdev 的 3.4 版本。一切渲染都在 CPU 上进行。
- **无 WiFi。** MTK combo chip 需要 Android 的 bionic `wmt_loader` 才能启动。网络连接只能通过 USB 线缆进行。
- **暂无音频**,暂无电池状态报告。
- 现实可行的用途:终端、仪表板、信息亭(kiosks)、媒体前端、家庭自动化面板、轻量级复古模拟器。不适合用作现代浏览器。
## 开始之前
- **这会清除 Android。** 请先进行完整转储。
- **这些电池已有十年历史。** 在投入时间之前,请检查后盖是否有任何凸起。更换电池很便宜。
- MediaTek BootROM 是掩模 ROM(mask ROM)且无法被擦除,因此很难变砖——但无论如何都要进行转储。
- `nvram` 和 `protect_*` 保存着你的 WiFi MAC 和 RF 校准数据,并且**无法从任何原厂 ROM 中重现**。请先在设备外部备份它们。
## 工作顺序
1. `docs/01-brom-access.md` —— 获取 BootROM 访问权限,检查你的安全熔丝
2. `docs/02-partitions.md` —— 转储,并找到你的基址偏移量
3. `docs/03-boot-images.md` —— 解包并重新打包 MTK 启动镜像
4. `docs/05-gotchas.md` —— 在首次自定义启动前阅读
5. `rootfs/build_rootfs.sh` —— 为你的设备构建 Alpine 镜像
6. `docs/04-mtkfb.md` —— 当屏幕拒绝显示任何内容时查阅
## 工具
| 工具 | 用途 |
|---|---|
| `tools/scan_a5500.py` | 通过 magic signature 查找真实分区边界 |
| `tools/carve_a5500_v2.py` | 将完整转储拆分为命名分区 |
| `tools/unpack_mtk_boot.py` | 解包 MTK 启动镜像(剥离 MTK 头部) |
| `tools/repack_mtk_boot.py` | 重新打包,带有字节级精确的往返验证 |
| `tools/build_initramfs_v8.py` | 构建可启动的 initramfs |
| `tools/fbprobe.c` | Framebuffer 诊断——报告每个 ioctl 结果 |
| `tools/fbcon.c` | Framebuffer 文本控制台(适用于没有控制台的设备) |
| `tools/fbpan.c` | 保持 mtkfb 持续传输帧,以便 X 保持可见 |
| `rootfs/build_rootfs.sh` | Alpine ext4 镜像,针对 3.4 限制了功能 |
| `host/a5500-net.sh` | 主机端 USB 网络设置 |
## 特定于设备的参数
以下是 A5500-HV 的参数。**你的设备会有所不同**——请使用 `scan_a5500.py` 推导,而不是直接复制。
| | |
|---|---|
| SoC | MT8382(MT6582 系列),4x Cortex-A7 @1.3 GHz |
| 主板项目 | `lvp5_row_3gfull`(ODM 构建 `cci82_tb_lvp_kk`) |
| Panel | AUO `s6d7aa0x04`,800x1280,通过 mtkfb |
| 触摸屏 | Goodix GT9xx (`mtk-tpd`) |
| Kernel | 3.4.67 |
| DRAM 基址 | `0x10000000`(非 `0x80000000`) |
| dumchar 基址偏移量 | `0x800000` |
| boot 分区 | 偏移量 `39321600`,16 MiB |
| recovery 分区 | 偏移量 `56098816`,16 MiB |
## 许可证
参见 `LICENSE`。注意:`tools/fbcon.c` 内嵌了源自 Liberation Mono(SIL OFL)的位图字体。在广泛分发之前,请将其替换为公共域字体或添加适当的署名。
## 致谢
基于 bkerler 的 [mtkclient](https://github.com/bkerler/mtkclient) 构建,该项目提供了这一切所依赖的 BootROM exploit 和 flash 访问权限。
标签:Alpine Linux, Cutter, Linux移植, MediaTek, 云资产清单, 嵌入式系统, 设备驱动, 逆向工具, 逆向工程