当前位置: 首页 > news >正文

高通学习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_defconfig

AR1平台对应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.c

Makefile:

obj-$(CONFIG_MY_SENSOR) += my_sensor.o

Kconfig:

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.py

Log里已经显示:

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=m

3

修改:

modules.vendor

加入:

my_sensor.ko

4

重新执行:

build/build.sh

或者你们当前使用的:

build_with_bazel.py

5

最终得到:

vendor_dlkm.img

里面包含:

/vendor/lib/modules/my_sensor.ko

这就是 Qualcomm Android 14 BSP 增加新驱动最典型的流程。

http://www.jsqmd.com/news/1110758/

相关文章:

  • 2026深度实测:AI编程工具vibe coding能力对比,创业团队必看选型指南
  • 大模型稀疏激活原理与工程实践:从GPT-4的2%激活率说起
  • 深度解析智能云客服与普通在线客服技术差异:落地踩坑、代码实战与优化方案
  • NHS-PEG-DSPE 二硬脂酰磷脂酰乙醇胺-聚乙二醇-活性脂 DSPE-PEG-NHS 基团功能知识科普
  • Angular端到端测试实战:用TestCafe替代Protractor
  • Ubuntu 20.04下用SSH隧道安全访问Jupyter Notebook实战
  • TM4C1294与DS28EC20的EEPROM存储方案设计与优化
  • Java毕业设计-基于 SpringBoot 的高校摄影社团招新活动管理系统的设计与实现 基于 SpringBoot 的校园摄影社团作品投稿与展(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • LV30条码扫描器与PIC18F46K40微控制器的嵌入式解决方案
  • Debian 8 上安全部署 Django 1.11 的完整实践指南
  • WAIC 2026 今日开幕,Hermes 混合智能体评分超越 GPT-5.5——Agent 比模型更重要
  • 带你认识P10636(HSPA8)热休克蛋白
  • 嵌入式13DOF传感器融合与PIC18F4680导航系统开发
  • 网盘直链下载助手终极指南:2025年最实用的9大网盘高速下载解决方案
  • 乘AI东风,华工科技股价飞升市值近2000亿,商业化能力短板待补!
  • 联想 T200 Pro 投影仪完整使用手册!参数、投屏、侧投、遥控器故障一次性讲透
  • 大模型稀疏激活原理与MoE实战:参数量≠计算量
  • Ubuntu上FastAPI连接PostgreSQL生产部署全指南
  • 终极Markdown阅读解决方案:浏览器插件三分钟快速入门指南
  • DigitalOcean Marketplace一键部署Mastodon实操指南
  • 深圳两企业同日称“大湾区首个”,“最像特斯拉”的智平方200亿估值能否实至名归?
  • SLO2016与TM4C1299KCZAD的LED驱动系统设计与优化
  • 智驾行业淘汰赛打响,“华舟魔”凭量产突围,向物理AI和全球化进发!
  • Ubuntu 16.04 手动部署 Prometheus 实战指南
  • AI Agent智能体开发实战4
  • Angular异步测试核心:fakeAsync与waitForAsync原理与选型指南
  • Gemini 3.1 Pro六边形能力解析:多模态、长上下文与推理协同工作流
  • 北京华恒智信:以流程责任制助力企业管理从人治转向法治
  • 2026深度实测:两款主流AI编程工具vibe coding能力全维度对比
  • Claude新Layer:中间层归零的架构革命