<0>几个lk2nd仓库
1.官方的:https://github.com/msm8916-mainline/lk2nd
2.我自己适配的:GitHub - bzy-080408/lk2nd_unofficial: lk2nd fork,主要为中国手机
<1>lk2nd是个神马东西?
lk2nd是一个在高通MSM设备上面运行的bootloader, 基于 CodeAurora Little Kernel fork. 它提供了一个可定制化fastboot环境(你可以在里面为所欲为比如输出' flash success,fuck you Qualcomm').
lk2nd不会替换原始bootloader(lk1st)。它被打包到Android中引导映像,然后由股票引导加载程序作为“辅助”引导加载程序加载。真正的Android引导映像被放置在具有1MB偏移的引导分区中,然后用lk2nd加载。
由于官方lk1st有很多限制,很多用主线kernel启动的linux系统都用lk2nd作为引导e.g.Postmarketos,Mobian.
FAQ:
1.为啥不直接替换了官方的lk1st?
高通在很多设备上开启了secureboot这会导致lk1st编译完刷上去设备拒绝启动造成黑砖,而且设备初始化(如屏幕初始化)不是每个人都会写的
<2>lk2nd的原理
现说说高通的启动,lk1st启动kernel时候会加载一个东西叫做设备树,同时通过设备树确定是不是可以加载的boot镜像。众所周知kernel是二进制可执行文件,emmc_appboots.mbn也是可执行文件,所以我们就可以“狸猫换太子”把kernel换成lk,并且用设备树骗过lk1st让lk1st引导lk2nd启动。
<3>开始动手
0.你要有一个手机,一个电脑,一根数据线(这不废话),注意是高通Soc,17年以前的,17年以后的直接移植edk2去弄lk2nd干神?
1.解锁bl是肯定的,不然你咋刷进去
然后是几个方案
方案一(官方方案):
把qcom,msm-id 和qcom,board-id从/proc/device-tree/里面dd出来
(在手机上面执行):
dd if=/proc/device-tree/qcom,msm-id of=/sdcard/msm-id
dd if=/proc/device-tree/qcom,board-id of=/sdcard/board-id
然后通过mtp拷到电脑上,以16进制打开,得到文本形式的16进制数值
方案二:
找到手机对应的内核代码
然后在里面找到手机对应的设备树
然后从设备树里面找到board-id和msm-id
// ========================================================
然后就开始移植了
先写个设备树
/dts-v1/;
/include/ "msm8953.dtsi" //只是针对msm8953设备,其他设备找对应的头文件
/ {
model = "这里填设备型号,自己随便编";
compatible = "qcom,msm8953", "qcom,msm8953", "lk2nd,device";
qcom,msm-id= <这里输入刚才得到的数值>;
qcom,board-id= <这里输入刚才得到的数值>;
};
保存到lk2nd项目的dts/里面,文件名自定,后缀.dts
然后把设备树加入rules.mk
在里面加入
$(LOCAL_DIR)/文件名.dtb \
然后代码就改完了,安装依赖,然后编译就行了,