在联发科(MTK)平台的 Android BSP 开发中,我们常常遇到两个核心问题:
-
lunch时到底该选哪个产品目标? -
项目使用的设备树(DTS)到底是怎么被绑定的?
本文基于真实的项目结构,拆解 MTK BSP 的配置体系,帮助你快速定位编译目标和设备树绑定关系。
1. 理解 MTK BSP 的板级配置目录
以 Android 14(或类似版本)的 BSP 为例,板级相关的配置通常位于:
bash
device/mediatek/
├── build/ # 编译脚本,包含 vendorsetup.sh
├── common/ # 公共配置
├── kernel/ # 内核相关模板
├── mt8189/ # 某一芯片公板配置(如 mt8189)
├── vendor/ # 更多产品变体(SKU)的 Vendor 分区配置
└── ...
而我们常见到的 device/mediateksample/ 目录,则存放着备选的硬件参考设计(Reference Design),例如:
bash
device/mediateksample/
├── aiot8391p2_64_bsp
├── aiot8391p3_64_bsp
├── vf_aiot_32_ago
├── vf_aiot_64_ab
└── vf_aiot_64_arm82
这些目录每一个都对应一个独立的 lunch 目标,即一个可以编译的完整产品。
2. 如何确定当前项目应该选择哪个编译目标?
如果你接手一个新项目,需要立刻知道应该 lunch 哪一个,请按以下顺序操作:
2.1 查看 AndroidProducts.mk(最权威的产品列表)
进入 device/mediateksample/ 目录,打开 AndroidProducts.mk 文件:
bash
cd device/mediateksample
cat AndroidProducts.mk
你会看到类似这样的内容:
bash
PRODUCT_MAKEFILES += $(LOCAL_DIR)/aiot8391p2_64_bsp/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/aiot8391p3_64_bsp/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_32_ago/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_64_ab/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_64_arm82/device.mk
每行的目录名就是可用的 lunch 目标名称。通常第一个条目或者带有明显项目代号的就是当前 SDK 的默认目标。
2.2 如果已经执行过 source 和 lunch
直接查看环境变量:
bash
echo $TARGET_PRODUCT
2.3 使用 get_build_var 随时查询
在源码根目录,先加载编译环境,再查询:
bash
source build/envsetup.sh
get_build_var TARGET_PRODUCT
注意 :如果之前没有执行 lunch,$TARGET_PRODUCT 为空,菜单中也可能看不到 MTK 的产品。这是因为 MTK 通常不通过 add_lunch_combo 注册到全局菜单,你必须直接指定产品名:
bash
lunch aiot8391p3_64_bsp
3. 设备树绑定:公版与项目专用 DTS 分离
确定了 lunch 目标后,下一个问题就是:当前项目绑定了哪一个设备树(DTS)?
MTK BSP 的一大特点是:公版 DTS 与项目 DTS 分离管理。
3.1 内核主 Makefile 中看到的都是公版
如果你打开 kernel-6.1/arch/arm64/boot/dts/mediatek/Makefile,会看到诸如:
bash
dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-evb.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt8192-evb.dtb
...
这些是芯片厂商提供的通用评估板(EVB)设备树 ,用于让开发者快速跑通一个基础系统,并不包含你的项目专用设备树。
3.2 项目专用设备树在哪里?
你的项目设备树(例如 aiot8391p3_64_bsp.dtb)一般存在于以下位置之一:
-
vendor/mediatek/kernel_modules/下的某个模块目录 -
vendor/mediatek/dts/或kernel-6.1/drivers/misc/mediatek/dts/ -
甚至是
device/mediatek/mt8189/下的某个子目录
快速搜索方式:
bash
TARGET_BOARD_PLATFORM := mt8189
bash
find . -name "*aiot8391*" -o -name "*mt8391*"
# 或直接查找生成的 dtb
find out/target/product/aiot8391p3_64_bsp/ -name "*.dtb"
3.3 板级配置中如何指定设备树?
进入你的产品目录(如 device/mediateksample/aiot8391p3_64_bsp),查看 BoardConfig-vext.mk 或 BoardConfig-kernel.mk:
bash
grep -E "TARGET_BOARD_PLATFORM|TARGET_KERNEL_DEVICE_TREE" *.mk
通常你会看到:
bash
TARGET_BOARD_PLATFORM := mt8189
但可能没有显式定义 TARGET_KERNEL_DEVICE_TREE。这意味着设备树列表完全由内核构建系统或 Vendor 模块管理,而最终运行时的选择由 Bootloader 根据硬件 ID 完成。
如果想追溯具体的 DTS 文件,需要去查看 vendor/mediatek/ 中的 Android.mk 或 Kbuild,它们可能包含类似:
bash
include $(CLEAR_VARS)
LOCAL_MODULE := aiot8391p3_64_bsp.dtb
LOCAL_SRC_FILES := aiot8391p3_64_bsp.dts
4. 总结:一套清晰的定位流程
-
确定编译目标
→ 查看
device/mediateksample/AndroidProducts.mk,找出符合项目代号的产品名。→ 直接
lunch <产品名>,无需依赖菜单。 -
定位设备树
→ 先看产品目录下的
BoardConfig-vext.mk,确认TARGET_BOARD_PLATFORM。→ 如果未显式指定 DTS,则去
vendor/mediatek/下搜索与产品名相关的.dts或.dtb。→ 内核主
Makefile中的列表仅包含公版,不可作为项目参考。 -
理解分离设计
MTK 将"芯片平台通用配置"与"客户项目特定配置"解耦,保证了上游代码的整洁,也让不同项目的硬件差异被隔离在较小的自定义模块中。
掌握了这套方法,你就能在任何 MTK BSP 项目中快速找到正确的编译目标和设备树绑定,无需再在陌生的目录结构中碰运气。