什么是 lk2nd?
lk2nd 是社区为 MSM8916 设备开发的二级引导加载程序:
- 不替换原厂 bootloader(aboot/sbl1)
- 打包成 Android boot image 格式,由原厂 bootloader 加载
- 提供标准 Android Fastboot 协议接口
- 自动检测硬件(屏幕、电池等)并生成设备信息
1 | 原厂上电 → PBL → SBL1 → aboot(原厂) → lk2nd → 主线Linux内核 |
安装工具链
1 | # ARM32 交叉编译 (lk2nd/lk1st) |
克隆仓库
1 | cd ~/y927 |
编译刷入第一版lk2nd
背景
高通 MSM8916 平台启动时,aboot/lk2nd 会从硬件读取一个 board-id 值,然后用它来匹配对应的 DTS(设备树)。每个 DTS 里都声明了它适用的 board-id。
巧合
Y927 的硬件 board-id 恰好是 0x01 0x01(QRD 公版 ID),这个值和另一台手机 vivo PD1304完全相同。所以即使不用创建单独的设备树,一样可以正常启动。
编译
1 | cd ~/y927 |
刷入
进入原厂fastboot执行
1 | cd ~/y927/lk2nd |
重启
此时是可以正常进入lk2nd了的
PS: 不过这俩屏幕其实完全不一样,这里能显示完全是因为aboot已经把屏幕初始化好了,lk2nd可以直接往framebuffer里写数据了
| PD1304 (Y13L) | Y927 (PD1410V) | |
|---|---|---|
| 面板 IC | NT35510S | HX8394A |
| 分辨率 | FWVGA (480×854) | 720×1280 |
| DSI | video / cmd mode | video burst, 4-lane, DCDC PHY |
| 触摸 IC | EDT FT5306 | Goodix GT9159 (GT9xx) |
| 背光 GPIO | 8 | 8 ✅ |
| LCD ENP | 无 | GPIO 97 |
| LCD ENN | 无 | GPIO 98 |
为什么 PD1304 的 DTB 能在 Y927 上亮屏?
aboot 残留 + lk2nd 不碰 DSI。
原厂 aboot 启动(加载的是原厂 DTB,包含 HX8394A 参数)
→ 初始化 MDP/DSI 硬件(用 HX8394A 参数)
→ 屏幕点亮,framebuffer 就绪
→ 跳转到 lk2nd
lk2nd 启动(此时的 DTB 写的是 NT35510S)
→ lk2nd 的 panel 驱动极其简单,不去碰 DSI 寄存器
→ 直接复用 aboot 留下的 framebuffer,往里画 fastboot UI
→ 屏幕继续亮,但 lk2nd 以为自己在操作 NT35510S(其实不是)
lk2nd 阶段用 PD1304 没问题(它只是个引导器,不碰 DSI),但内核阶段必须用 Y927 自己的
DTS。
DTS 设备树文件
背景
DTS(Device Tree
Source)是一种硬件描述文件。操作系统通过它知道主板上有哪些硬件、怎么驱动它们。
类比:DTS 就像一台手机的"硬件清单"——CPU 型号、屏幕参数、GPIO
引脚配置等等。操作系统启动时读这份清单,才知道自己跑在什么硬件上。
lk2nd 是一个微型引导器,它也需要自己的 DTS,比 Linux 内核的简单得多。
编译刷入第二版lk2nd
在 lk2nd/lk2nd/device/dts/msm8916/ 下创建:
创建 msm8916-vivo-y927.dts
完整注释版
1 | // SPDX-License-Identifier: BSD-3-Clause |
去除注释版
1 | // SPDX-License-Identifier: BSD-3-Clause |
注册到构建系统
编辑 ~/y927/lk2nd/lk2nd/device/dts/msm8916/rules.mk,添加:
1 | $(LOCAL_DIR)/msm8916-vivo-y927.dtb \ |
提交代码
实测必须提交代码后编译才有效
继续编译和刷写
1 | cd ~/y927/lk2nd |
重启
可以发现现在手机型号已经发生变化
残留问题
下方显示ARM64: unavailable这是因为原厂 tz/hyp 是 32 位,需要 lk1st + qhypstub,将在下一章开始移植




