目录
一、环境准备
1. 硬件(二选一):
2. 软件:
2.1. boot.img解包、打包工具
2.2. dt.img解包工具(二选一)
2.3. dtb编译、反编译工具
2.4. dt.img打包工具
2.5. 整合包(不包含随身WiFi工具箱和device-tree-compiler)
二、实战
1. 解包boot.img
2. 解包dt.img
3. 反编译dtb
4. 查找设备使用的设备树
5. 编译dtb
6. 打包dt.img
7. 打包boot.img
三、 参考文档
一、环境准备
1. 硬件(二选一):
一台支持WSL的Windows计算机(1和2均可),WSL中安装Ubuntu20.04或其他Linux发行版。
一台安装了Ubuntu20.04或其他Linux发行版的计算机。
2. 软件:
2.1. boot.img解包、打包工具
2.2. dt.img解包工具(二选一)
2.3. dtb编译、反编译工具
sudo apt install device-tree-compiler
2.4. dt.img打包工具
2.5. 整合包(不包含device-tree-compiler)
二、实战
1. 解包boot.img
将boot.img放入unpackbootimg所在文件夹执行以下代码,其中unpack为解压文件存放目录。
mkdir unpack
./unpackbootimg -i boot.img -o unpack
可以看到在unpack文件夹中生成了很多文件。
其中 boot.img-dtb 为我们本次的目标。
2. 解包dt.img
将boot.img-dtb复制到dtimgextract文件夹中执行以下代码,其中unpack为解压文件存放目录。
mkdir unpack
cd unpack/
../dtimgextract ../boot.img-dtb
从日志中可以看到生成了204个设备树文件。(数量不固定,以实际情况为准)
3. 反编译dtb
在上一步解包的文件夹中执行以下代码进行反编译。
mkdir output
for i in $(ls *.dtb);do dtc -I dtb -O dts -o output/$i.dts $i;done
反编译会报出大量警告,出来的dts存放在output文件夹中,使用你趁手的文本编辑器打开即可修改。
4. 查找设备使用的设备树
以查找MSM 8916为例,使用以下代码进行查找。(字符串"MSM 8916 512MB MTP"为设备描述,具体寻找方法见附录)
cd output/
grep -rn "MSM 8916 512MB MTP" .
可以看见本次查找出了四个文件,经过对比发现四个文件内容完全一致,修改其中一个 然后覆盖另外三个即可。
5. 编译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
同样会报出大量警告。(直接无视)
6. 打包dt.img
把新生成的dtb文件替换掉第2步解包出来的unpack文件夹中对应的dtb文件,将替换后的unpack文件夹复制到dtbToolCM文件夹中,其中的output文件夹删掉,执行以下代码进行打包。
./dtbToolCM -o boot.img-dtb unpack/
7. 打包boot.img
把新生成的boot.img-dtb替换掉第1步解包出来的unpack文件夹中的boot.img-dtb,并将unpack文件夹复制到mkbootimg所在文件夹,执行以下代码进行打包。
./mkbootimg \
--kernel unpack/boot.img-zImage \
--ramdisk unpack/boot.img-ramdisk.gz \
--cmdline "$(cat unpack/boot.img-cmdline)" \
--board "$(cat unpack/boot.img-board)" \
--base "$(cat unpack/boot.img-base)" \
--pagesize "$(cat unpack/boot.img-pagesize)" \
--dt unpack/boot.img-dtb \
--kernel_offset "$(cat unpack/boot.img-kerneloff)" \
--ramdisk_offset "$(cat unpack/boot.img-ramdiskoff)" \
--second_offset "$(cat unpack/boot.img-secondoff)" \
--tags_offset "$(cat unpack/boot.img-tagsoff)" \
--os_version "0.0.0" \
--os_patch_level "2023-05" \
--hash "$(cat unpack/boot.img-hash)" \
--output newboot.img
生成的newboot.img就是新的boot,刷入设备即可。
三、 参考文档
How to pack my own ZImage (kernel) to a new boot.img · Issue #2 · xiaolu/mkbootimg_tools · GitHub