高通学习16--Kernel的编译
目前,高通的编译系统已经是Android 14 + Kernel 6.1 + Bazel + GKI的新架构。
1 编译过程
整体过程是:
build_with_bazel.py
↓
Bazel
↓
Kernel Config
↓
Kernel Build
↓
DTBO
↓
ABL
↓
Boot Image
↓
Dist
最终输出:
boot.img
vendor_boot.img
init_boot.img
dtbo.img
第一阶段生成Kernel Config
make vendor/neo_la-gki_defconfigAR1平台对应neo_la,也就是
neo_la-gki_defconfig此时,三个配置文件合并。
Google GKI
+
Qualcomm SoC Config
+
AR1 Product Config
生成最终.config。
第二阶段:ABI/KMI检查
Kernel Module Interface
现在Vendor Driver只能调用KMI白名单。
第三阶段:真正编译 Kernel
基于bazel封装,最终运行
bazel run生成Image,vmlinux,modules。
第四阶段:编译 DTBO
生成dtbo.img
第五阶段:编译 ABL
生成UEFI,EDK2。
第六阶段:生成 Boot Image
最后生成
boot image-->GKI Kernel
vendor_boot.img-->Vendor Ramdisk
init_boot.img-->Init Ramdisk
第七阶段:Dist导出
把所有输出拷贝到out/msm-kernel-neo_la-gki/dist
在这个代码中,最后需要调用tools/bazel run或者build/build.sh。
最后用build_with_bazel.py完成构建。
2 GKI
GKI = Generic Kernel Image
以前boot.img
├── Qualcomm Kernel
├── Camera Driver
├── Audio Driver
├── WLAN Driver
├── DTS
└── Vendor Ramdisk
现在
boot.img
└── GKI Kernel(Linux Kernel+Google维护部分)
其余的部分,放在vendor_boot.img
通常包含了
Vendor Ramdisk
Vendor Init
Qualcomm Init
DTS/DTB
Vendor Kernel Modules
vendor_boot.img
├── Qualcomm Driver
├── DTS
├── Vendor Ramdisk
└── Vendor Init
vendor_dlkm.img
则是包含具体高通/ODM驱动模块(.ko)
也就是说后续驱动的修改,会放到vendor_boot.img和vendor_dlkm.img。
3 增加驱动
对于你现在这个AR1(Android 14 + GKI + Kernel 6.1 + Bazel)平台,增加一个驱动并最终打包成.ko,流程和老式 Qualcomm BSP 已经不一样了。
大致流程:
新增驱动源码 ↓ Kconfig ↓ Makefile ↓ CONFIG_xxx=m ↓ Bazel编译 ↓ 生成 xxx.ko ↓ 加入 Vendor Module List ↓ vendor_dlkm.img ↓ 刷机验证第一步:增加驱动源码
例如:
kernel_platform/msm-kernel/drivers/my_sensor/ ├── Kconfig ├── Makefile └── my_sensor.cMakefile:
obj-$(CONFIG_MY_SENSOR) += my_sensor.oKconfig:
config MY_SENSOR tristate "My Sensor Driver"其中:
tristate表示:
y = 编进内核 m = 编译ko n = 不编译第二步:打开配置
在 AR1 Log 里你已经看到:
vendor/neo_la-gki_defconfig因此通常修改:
kernel_platform/msm-kernel/arch/arm64/configs/vendor/neo_la-gki_defconfig增加:
CONFIG_MY_SENSOR=m第三步:编译
你们平台实际入口类似:
build/build.sh或者:
build_with_bazel.pyLog里已经显示:
neo-la_gki目标。说明是 Bazel 驱动构建。
编译后会生成:
out/.../my_sensor.ko第四步:加入 Vendor Module 列表
这是 GKI 平台最容易漏的地方。
仅有:
CONFIG_MY_SENSOR=m还不够。
Android 要知道:
这个ko要放到哪个分区Google 官方要求通过:
BOARD_VENDOR_KERNEL_MODULES控制 vendor_dlkm 镜像内容。(Android Open Source Project)
很多 Qualcomm 平台会有类似文件:
vendor_dlkm.modules vendor_boot.modules modules.load例如:
my_sensor.ko加入:
kernel_platform/msm-kernel/modules.vendor(具体文件名每个平台不同)
第五步:决定放 vendor_boot 还是 vendor_dlkm
这一步很重要。
情况1:普通驱动
例如:
I2C Sensor GPIO SPI Device Touch通常:
my_sensor.ko进入:
vendor_dlkm.img这是 Android 11+ 推荐模式。(Android Open Source Project)
情况2:启动阶段必须加载
例如:
UFS Storage Display Early Driver系统还没挂载分区就要使用。
这类模块可能进入:
vendor_boot.img因为 first-stage init 要加载。(Android Open Source Project)
第六步:验证镜像
编译后:
out/dist/一般能看到:
boot.img vendor_boot.img vendor_dlkm.img dtbo.img查看:
unpack_image vendor_dlkm.img或者:
debugfs确认:
/vendor/lib/modules/my_sensor.ko已经存在。
Google 官方说明:
BOARD_VENDOR_KERNEL_MODULES 中的模块最终会安装到 /vendor_dlkm/lib/modules并通过:
/vendor/lib/modules符号链接访问。(Android Open Source Project)
第七步:系统启动加载
通常有:
modules.load文件。
例如:
wlan.ko audio.ko camera.ko my_sensor.ko系统启动:
modprobe自动加载。(Android Open Source Project)
对 AR1 最可能的实际操作
结合你之前的编译日志:
neo-la_gki neo-la_gki_dist vendor_boot.img vendor_dlkm.img我判断 Qualcomm AR1 大概率是:
kernel_platform/ ├── drivers/my_sensor/ ├── vendor/neo_la-gki_defconfig ├── modules.vendor └── build/你需要:
1
新增:
drivers/my_sensor/2
修改:
vendor/neo_la-gki_defconfig CONFIG_MY_SENSOR=m3
修改:
modules.vendor加入:
my_sensor.ko4
重新执行:
build/build.sh或者你们当前使用的:
build_with_bazel.py5
最终得到:
vendor_dlkm.img里面包含:
/vendor/lib/modules/my_sensor.ko这就是 Qualcomm Android 14 BSP 增加新驱动最典型的流程。
