准备工具
1. unpackbootimg
git clone https://github.com/anestisb/android-unpackbootimg cd android-unpackbootimg make
2. dtimgextract
git clone https://github.com/s0be/dtimgextract cd dtimgextrace gcc dtimgextract.c -o dtimgextract 或者 make
或者
https://github.com/wuxianlin/dtimg2dtb-python
3.device-tree-compiler Debian系统自带,用apt安装
apt install device-tree-compiler
4. dtbtool
wget https://github.com/CyanogenMod/android_device_qcom_common/blob/cm-14.1/dtbtool/dtbtool.c gcc dtbtool.c -o dtbtool
5. edl
安装方法参考 https://softs.im/msm8916-wifi-dongle/
步骤:
1. 9008模式 读出 boot.img
edl r boot boot.img
2. 解包 boot.img
mkdir boot ./unpackbootimg -i boot.img -o boot
可以看到在boot目录创建了很多文件,其中 boot.img-dtb 就是我们所需要的。
3. 解包 dt.img
将 boot.img-dtb复制到 合适的位置
mkdir unpack cd unpack ../dtimgextract ../boot.img-dtb
4. 反编译 dtb
在上一步的目录执行以下命令
mkdir output for i in $(ls *.dtb);do dtc -I dtb -O dts -o output/$i.dts $i;done
反编译会出来大量警告
5. 查找设备使用的设备树
cd output grep -rn "MSM 8916 512MB MTP" .
可以看见本次查找出了四个文件,经过对比发现四个文件内容完全一致,修改其中一个 然后覆盖另外三个即可。
6. 修改屏幕分辨率
打开ce_8_100_0.dtb.dts文件找到qcom,mdss_spi_st7735s_128128_cmd这一项
其中 qcom,mdss-spi-panel-with 和 qcom,mdss-spi-panel-height 就是
qcom,mdss_dsi_st7796s_320p_video {
qcom,mdss-dsi-panel-name = "st7796s 320p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <0x42>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
qcom,mdss-dsi-panel-framerate = <0x3c>;
qcom,mdss-dsi-virtual-channel-id = <0x00>;
qcom,mdss-dsi-stream = <0x00>;
qcom,mdss-dsi-panel-width = <0x140>;
qcom,mdss-dsi-panel-height = <0x1e0>;
或者
qcom,mdss_spi_st7735s_128128_cmd {
qcom,mdss-spi-panel-name = "st7735s 128128 command mode spi panel";
qcom,mdss-spi-panel-destination = "display_1";
qcom,mdss-spi-panel-controller = <0x45>;
qcom,mdss-spi-panel-framerate = <0x1b>;
qcom,mdss-spi-panel-width = <0x84>;
qcom,mdss-spi-panel-height = <0x84>;
Simulator video 比较正常 640×480 (0x280, 0x1e0)
qcom,mdss_dsi_sim_video {
qcom,mdss-dsi-panel-name = "Simulator video mode dsi panel";
qcom,mdss-dsi-panel-controller = <0x44>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
qcom,mdss-dsi-panel-destination = "display_1";
qcom,mdss-dsi-panel-framerate = <0x3c>;
qcom,mdss-dsi-virtual-channel-id = <0x00>;
qcom,mdss-dsi-stream = <0x00>;
qcom,mdss-dsi-panel-width = <0x280>;
qcom,mdss-dsi-panel-height = <0x1e0>;
可以改成 0x356,0x1e0 也就是
7. 编译dtb
修改完后对已修改的文件进行编译,使用以下命令,其中为ce_8_100_0.dtb.dts修改过的设备树源码,ce_8_100_0.dtb为编译后生成的设备树。
dtc -I dts -O dtb -o ce_8_100_0.dtb ce_8_100_0.dtb.dts
8.打包dt.img
把新生成的dtb文件替换掉第2步解包出来的unpack文件夹中对应的dtb文件,
将替换后的unpack文件夹复制到dtbToolCM文件夹中,
其中的output文件夹删掉,
执行以下命令进行打包。
./dtbToolCM -o boot.img-dtb unpack/
9.打包boot.img
把新生成的boot.img-dtb替换掉第1步解包出来的unpack文件夹中的boot.img-dtb,
并将unpack文件夹复制到mkbootimg所在文件夹,执行以下命令进行打包。
./mkbootimg \ --kernel boot/boot.img-zImage \ --ramdisk boot/boot.img-ramdisk.gz \ --cmdline "$(cat boot/boot.img-cmdline)" \ --board "$(cat boot/boot.img-board)" \ --base "$(cat boot/boot.img-base)" \ --pagesize "$(cat boot/boot.img-pagesize)" \ --dt boot/boot.img-dtb \ --kernel_offset "$(cat boot/boot.img-kerneloff)" \ --ramdisk_offset "$(cat boot/boot.img-ramdiskoff)" \ --second_offset "$(cat boot/boot.img-secondoff)" \ --tags_offset "$(cat boot/boot.img-tagsoff)" \ --os_version "4.4.4" \ --os_patch_level "2023-05-08" \ --hash "$(cat boot/boot.img-hash)" \ --output newboot.img