高通学习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.imgvendor_boot.imginit_boot.imgdtbo.img第一阶段生成Kernel Configmake vendor/neo_la-gki_defconfigAR1平台对应neo_la也就是neo_la-gki_defconfig此时三个配置文件合并。Google GKIQualcomm SoC ConfigAR1 Product Config生成最终.config。第二阶段ABI/KMI检查Kernel Module Interface现在Vendor Driver只能调用KMI白名单。第三阶段真正编译 Kernel基于bazel封装最终运行bazel run生成Imagevmlinuxmodules。第四阶段编译 DTBO生成dtbo.img第五阶段编译 ABL生成UEFIEDK2。第六阶段生成 Boot Image最后生成boot image--GKI Kernelvendor_boot.img--Vendor Ramdiskinit_boot.img--Init Ramdisk第七阶段Dist导出把所有输出拷贝到out/msm-kernel-neo_la-gki/dist在这个代码中最后需要调用tools/bazel run或者build/build.sh。最后用build_with_bazel.py完成构建。2 GKIGKI Generic Kernel Image以前boot.img├── Qualcomm Kernel├── Camera Driver├── Audio Driver├── WLAN Driver├── DTS└── Vendor Ramdisk现在boot.img└── GKI KernelLinux KernelGoogle维护部分其余的部分放在vendor_boot.img通常包含了Vendor RamdiskVendor InitQualcomm InitDTS/DTBVendor Kernel Modulesvendor_boot.img├── Qualcomm Driver├── DTS├── Vendor Ramdisk└── Vendor Initvendor_dlkm.img则是包含具体高通/ODM驱动模块(.ko)也就是说后续驱动的修改会放到vendor_boot.img和vendor_dlkm.img。3 增加驱动对于你现在这个AR1Android 14 GKI Kernel 6.1 Bazel平台增加一个驱动并最终打包成.ko流程和老式 Qualcomm BSP 已经不一样了。大致流程新增驱动源码 ↓ Kconfig ↓ Makefile ↓ CONFIG_xxxm ↓ Bazel编译 ↓ 生成 xxx.ko ↓ 加入 Vendor Module List ↓ vendor_dlkm.img ↓ 刷机验证第一步增加驱动源码例如kernel_platform/msm-kernel/drivers/my_sensor/ ├── Kconfig ├── Makefile └── my_sensor.cMakefileobj-$(CONFIG_MY_SENSOR) my_sensor.oKconfigconfig 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_SENSORm第三步编译你们平台实际入口类似build/build.sh或者build_with_bazel.pyLog里已经显示neo-la_gki目标。说明是 Bazel 驱动构建。编译后会生成out/.../my_sensor.ko第四步加入 Vendor Module 列表这是 GKI 平台最容易漏的地方。仅有CONFIG_MY_SENSORm还不够。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_SENSORm3修改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 增加新驱动最典型的流程。