第4章 MTK8678平台配置:SoC架构、驱动与设备树
好,咱们进入正题。这一章要聊的,是MTK8678平台配置的核心三件事:选对架构、配好驱动、搞定设备树。说白了,这三步要是走错了,后面编译出来的内核根本跑不起来。我当年第一次接触MTK平台时,就在设备树路径上栽过跟头,折腾了两天才发现是路径写错了。
4.1 选择正确的SoC架构:ARM64
MTK8678这颗芯片,用的是ARM Cortex-A78核心,64位架构。所以内核配置时,架构必须选ARM64。这个选择看似简单,但我在项目中见过有人选成ARM32,结果编译出来的内核在板子上直接黑屏。
具体操作是这样的:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- mtk8678_defconfig
这里有个细节要注意——交叉编译工具链的前缀。我习惯用aarch64-linux-gnu-,但有些厂商提供的工具链可能叫aarch64-none-linux-gnu-。你最好先确认一下。
核心要点:
- ARCH必须等于arm64,不能是arm或x86
- 交叉编译工具链必须支持AArch64指令集
- 内核源码树下的arch/arm64目录必须存在
为什么会有人选错架构?我分析过,多半是因为习惯了32位平台的开发流程,拿到新芯片后没仔细看文档。嗯,这里要提醒一句:别想当然。
4.2 配置MTK平台特有驱动
MTK平台有三大核心驱动:PMIC、Clock、Pinctrl。这三个驱动要是配不对,板子要么不开机,要么外设不工作。
4.2.1 PMIC驱动配置
PMIC负责电源管理。MTK8678用的PMIC型号是MT6365,内核里对应的驱动路径在drivers/mfd/下。配置方法如下:
Device Drivers --->
Multifunction device drivers --->
[*] MediaTek PMIC MT6365 Support
[*] MediaTek PMIC MT6365 Regulator
我在项目中遇到过一个问题:PMIC驱动编译进去了,但系统启动时电压输出不对。后来发现是regulator的初始化顺序有问题。解决办法是在DTS里加上regulator-boot-on属性。
个人经验:PMIC驱动调试时,先确认I2C通信是否正常。用i2cdetect工具扫一下地址,如果0x34这个地址能读到数据,说明PMIC活着。
4.2.2 Clock驱动配置
时钟系统是SoC的脉搏。MTK8678的时钟驱动在drivers/clk/mediatek/下。配置项是:
Device Drivers --->
Common Clock Framework --->
[*] MediaTek Clock Driver
[*] MTK8678 Clock Support
这里有个坑——时钟驱动依赖PLL的配置参数。如果PLL的倍频系数写错了,CPU频率可能跑不到标称值。我曾经调试一个性能问题,折腾了三天,最后发现是时钟树里一个PLL的divider配错了。
4.2.3 Pinctrl驱动配置
Pinctrl负责管脚复用。MTK的Pinctrl驱动比较特殊,它用了一个叫"mtk-pinctrl"的框架。配置路径:
Device Drivers --->
Pin controllers --->
[*] MediaTek Pinctrl Driver
[*] MTK8678 Pinctrl Support
注意:Pinctrl的配置一定要和硬件原理图对应。我见过有人把UART的TX/RX引脚配反了,结果串口死活打不开。检查方法很简单:用万用表量一下引脚电平,看是不是在正确状态。
4.3 配置DTS(设备树)路径
设备树是Linux内核描述硬件的方式。MTK8678的设备树文件放在arch/arm64/boot/dts/mediatek/目录下。你需要告诉内核去哪里找这个文件。
具体做法是在内核配置中指定:
Device Tree Source --->
(arch/arm64/boot/dts/mediatek/mtk8678-evb.dts) Default Device Tree Source
或者直接在编译命令里指定:
make ARCH=arm64 dtbs
# 生成的文件在 arch/arm64/boot/dts/mediatek/mtk8678-evb.dtb
设备树文件的结构大致是这样的:
/dts-v1/;
#include "mtk8678.dtsi"
/ {
model = "MediaTek MTK8678 EVB";
compatible = "mediatek,mtk8678";
chosen {
bootargs = "console=ttyS0,115200 earlycon";
};
&uart0 {
status = "okay";
};
&mmc0 {
status = "okay";
bus-width = <8>;
};
};
这里要注意#include的路径。我习惯把公共的SoC定义放在mtk8678.dtsi里,板级差异放在mtk8678-evb.dts里。这样复用性更好。
避坑指南:我曾经把DTS文件路径写成了arch/arm64/boot/dts/mtk8678-evb.dts,少写了mediatek/这一级目录。结果编译时提示找不到文件。检查了半小时才发现是路径问题。
4.4 验证配置是否正确
配置完成后,我建议做三步验证:
- 检查.config文件:确认
CONFIG_ARCH_MTK8678=y存在 - 编译测试:执行
make ARCH=arm64 dtbs,看是否生成dtb文件 - 反编译验证:用
dtc -I dtb -O dts mtk8678-evb.dtb查看设备树内容
嗯,这三步走完,基本就能确认平台配置没问题了。剩下的就是烧录到板子上跑起来看看。
说实话,MTK平台的配置比高通要复杂一些,尤其是Pinctrl那块。但只要你按照这个流程来,一步步确认,就不会出大问题。我带的几个新人,按这个步骤操作,基本都能一次通过。