第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 验证配置是否正确

配置完成后,我建议做三步验证:

  1. 检查.config文件:确认CONFIG_ARCH_MTK8678=y存在
  2. 编译测试:执行make ARCH=arm64 dtbs,看是否生成dtb文件
  3. 反编译验证:用dtc -I dtb -O dts mtk8678-evb.dtb查看设备树内容

嗯,这三步走完,基本就能确认平台配置没问题了。剩下的就是烧录到板子上跑起来看看。

说实话,MTK平台的配置比高通要复杂一些,尤其是Pinctrl那块。但只要你按照这个流程来,一步步确认,就不会出大问题。我带的几个新人,按这个步骤操作,基本都能一次通过。