第一章:MTK8678平台概述

各位同学好,我是老张。今天咱们开始第一课,聊聊MTK8678这个平台。说实话,我第一次拿到这颗芯片的datasheet时,也被它的多屏能力吓了一跳。别急,咱们慢慢拆解。

1.1 芯片架构概览

MTK8678是一颗8核处理器,采用4+4的大小核架构。大核是Cortex-A78,主频能跑到2.6GHz;小核是Cortex-A55,主频2.0GHz。GPU部分用的是Mali-G78 MC9,支持Vulkan、OpenGL ES 3.2这些主流图形API。

我个人的习惯是,拿到新芯片先看它的总线架构。MTK8678内部用了三总线设计:

  • 显示总线:专门给显示子系统用的,带宽高达32GB/s
  • 内存总线:连接LPDDR5,支持四通道,最大容量16GB
  • 外设总线:挂载USB、PCIe、SDIO这些外设

为什么要分开?说白了,就是怕显示数据抢内存带宽。我在做上一代MTK8676时,就遇到过因为显示和GPU抢带宽导致的掉帧问题。嗯,这个坑咱们后面会细讲。

1.2 多屏显示能力

MTK8678最多支持4路独立显示输出。你没看错,是4路。具体配置是这样的:

显示接口 最大分辨率 刷新率 典型用途
DP 1.4 (x2) 4K@60Hz 60Hz 主屏、副屏
HDMI 2.1 4K@120Hz 120Hz 电视输出
MIPI DSI (x2) 2K@60Hz 60Hz 内置屏幕
eDP 1.4 4K@60Hz 60Hz 笔记本内屏

这里有个关键点:4路输出可以同时工作,而且每路的内容可以完全独立。我曾经在一个车载项目中,用这颗芯片同时驱动了仪表盘、中控屏、副驾娱乐屏和后排头枕屏——四个屏幕各跑各的应用,互不干扰。

核心能力:MTK8678内置了独立的显示处理单元(DPU),每个显示通道都有自己的图层合成器、色彩管理器和缩放引擎。这意味着你可以在不同屏幕上设置不同的色彩空间和分辨率,而不会影响其他屏幕的性能。

1.3 开发环境搭建

搭建开发环境这事儿,说简单也简单,说复杂也复杂。我建议你按这个步骤来:

  1. 安装Ubuntu 20.04 LTS:别用Windows,也别用太新的Ubuntu版本。我试过22.04,有些工具链兼容性问题。
  2. 安装依赖包sudo apt install git python3 make gcc g++ libncurses5-dev
  3. 下载SDK:MTK官方提供的SDK大概有20GB,包括内核源码、驱动源码、工具链和文档。
  4. 配置工具链:设置环境变量 export PATH=$PATH:/path/to/toolchain/bin

小技巧:我个人习惯把SDK放在 /opt/mtk8678/ 目录下,然后在 ~/.bashrc 里加一行 export MTK_SDK=/opt/mtk8678。这样后面编译时方便引用。

1.4 编译流程

编译MTK8678的镜像,说白了就是三步走:

第一步:配置内核

cd $MTK_SDK/kernel-5.10
make ARCH=arm64 mt8678_defconfig
make menuconfig  # 可选,按需调整配置

第二步:编译内核

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
# 编译完成后,会在 arch/arm64/boot/ 下生成 Image 和 dtb 文件

第三步:编译整个系统

cd $MTK_SDK
source build/envsetup.sh
lunch mt8678-userdebug
make -j8

这里有个坑,我得提醒你:第一次编译大概需要2-3小时。别傻等着,去喝杯咖啡。我当年第一次编译时,盯着屏幕看了半小时,结果发现编译进度才到3%...后来学乖了,直接开个后台任务,该干嘛干嘛。

注意:编译过程中如果报错,多半是依赖缺失。常见的坑包括:

  • 缺少 libssl-dev:内核签名需要
  • 缺少 flexbison:设备树编译需要
  • Python版本不对:建议用Python 3.8-3.10

我曾经因为Python版本问题折腾了一整天,最后发现是系统自带的Python 3.11和SDK不兼容。嗯,从那以后我都在开发机上固定Python版本。

1.5 多屏驱动框架

MTK8678的多屏驱动,核心是DRM(Direct Rendering Manager)框架。每个显示接口对应一个DRM CRTC(CRTC就是显示控制器),每个CRTC可以绑定一个或多个Plane(图层)。

驱动架构大概是这样的:

+------------------+
|  用户空间应用     |
+------------------+
        |
+------------------+
|  DRM核心层        |
+------------------+
        |
+------------------+
|  MTK显示驱动      |
|  (mtk_drm_drv.c) |
+------------------+
        |
+------------------+
|  硬件寄存器层     |
+------------------+

你想想看,为什么MTK要自己写显示驱动,而不是直接用DRM的通用驱动?因为MTK的DPU硬件设计比较特殊,它支持硬件图层合成、硬件旋转、硬件缩放这些高级功能。通用驱动根本发挥不出这些硬件的性能。

我记得第一次调多屏时,发现副屏的画面总是延迟。查了两天,最后发现是DRM的vblank同步没配好。这个经验让我明白:多屏驱动调试,时序同步是第一关

1.6 本章小结

好了,第一课就讲这么多。咱们回顾一下重点:

  • MTK8678是8核处理器,支持4路独立显示输出
  • 开发环境推荐Ubuntu 20.04,SDK约20GB
  • 编译分三步:配置内核、编译内核、编译系统
  • 多屏驱动基于DRM框架,但MTK有自己的硬件加速

下一章,咱们会深入DRM驱动框架,手把手教你写一个最简单的显示驱动。到时候你会看到,那些寄存器操作到底是怎么跟用户空间的API对应起来的。

有什么问题,欢迎在课程群里讨论。我是老张,咱们下节课见。