第一章:高通8155平台概述

各位同学好,我是老张。做高通平台显示驱动这块,掐指一算也有七八年了。今天咱们开始聊8155,这个芯片在车载领域有多火,不用我多说。你想想看,现在市面上主流的中高端车型,但凡用高通方案的,8155基本是标配。

我个人习惯,拿到一个新平台,第一件事不是看代码,而是先把芯片的整体架构摸清楚。为什么?因为显示驱动这玩意儿,说白了就是跟硬件打交道。你不了解硬件怎么连的,后面调起来就是瞎子摸象。

1.1 芯片架构概览

高通8155,内部代号SA8155P,属于骁龙汽车第三代平台。它用的是7nm工艺,这在车载芯片里算是相当先进的了。我记得2019年刚拿到样片的时候,第一反应是——这玩意儿发热量控制得真不错。

咱们先看核心模块:

  • CPU:Kryo 485,8核,1+3+4架构。一个大核跑到2.96GHz,三个性能核2.42GHz,四个效率核1.8GHz。说实话,这个性能对于车载座舱来说,绰绰有余。
  • GPU:Adreno 640,频率585MHz。支持Vulkan、OpenGL ES 3.2。显示渲染的主力军。
  • DSP:Hexagon 690,负责音频、传感器、计算机视觉等低功耗处理。
  • VPU:视频编解码单元,支持4K 60fps的H.264/H.265。
  • DPU:显示处理单元,这是咱们的重点。后面会详细讲。

核心要点:8155的显示子系统,核心是DPU + GPU + MDP的组合。这三个模块配合得好不好,直接决定了你的显示效果和性能。

1.2 显示子系统整体框图

好,咱们进入正题。显示子系统长什么样?我画个简化的框图给你看:

应用处理器 (AP)
    |
    ├── GPU (Adreno 640) —— 渲染图层
    |
    ├── DPU (Display Processing Unit)
    |       ├── Layer Mixer (图层混合)
    |       ├── Color Processor (色彩处理)
    |       ├── DSI/DP Controller (接口控制器)
    |       └── Writeback (回写模块)
    |
    ├── MDP (Mobile Display Processor)
    |       ├── VIG (Video Input Gate)
    |       ├── RGB (RGB图层)
    |       └── DMA (直接内存访问)
    |
    └── 显示接口
            ├── DSI (Display Serial Interface) —— 用于LCD屏
            └── DP (DisplayPort) —— 用于外接显示

这个框图看着简单,但里面的门道不少。我挑几个重点说说:

DPU是整个显示子系统的核心。它负责把GPU渲染好的图层,进行合成、处理,然后送到显示接口。你想想看,车载场景下,仪表盘、中控、HUD、副驾屏,可能同时要显示四五个图层。DPU的Layer Mixer就是干这个活的。

MDP呢?它其实是DPU的前身。在早期的骁龙平台上,MDP是独立的。到了8155,MDP的功能被整合到了DPU里。但代码里还是能看到MDP的影子,比如一些寄存器命名还是MDP_xxx。嗯,这里要注意,别搞混了。

个人经验:我在调试一个双屏异显的项目时,发现副屏一直黑屏。查了两天,最后发现是DPU的Layer Mixer配置错了——副屏的图层被分配到了主屏的Mixer上。这种问题,光看代码是看不出来的,必须结合硬件框图去排查。

1.3 开发环境搭建

环境搭建这块,我踩过的坑比走过的路还多。咱们分Android和Linux两个场景来说。

1.3.1 Android BSP环境

高通平台的Android BSP,核心就是那个庞大的LA.UM代码库。我建议你这么做:

  1. 获取源码:从高通Codeaurora或者芯片厂商的服务器拉取。命令大概是:
repo init -u <manifest_url> -b <branch_name>
repo sync -j8

这里有个坑——repo sync的时候,网络不稳定很容易中断。我曾经在客户现场,用4G热点下载了整整一天。后来学乖了,先下载到本地服务器,再分发给团队。

  1. 安装工具链:高通平台需要特定的交叉编译工具链。Android源码里自带了,但要注意版本匹配。比如Android 10对应的是Clang 9.0。
  2. 配置内核:显示驱动相关的内核配置项,我列几个关键的:
CONFIG_FB_MSM=y
CONFIG_MSM_DPU=y
CONFIG_MSM_DSI=y
CONFIG_MSM_HDMI=y (如果支持HDMI)

警告:千万别漏了CONFIG_MSM_DPU。我见过有人只配了CONFIG_FB_MSM,结果DPU驱动根本没编译进去,屏幕死活点不亮。查了两天才发现是内核配置的问题。

1.3.2 Linux BSP环境

Linux环境相对简单一些,但要注意的是,高通对Linux的支持不如Android那么完善。很多显示相关的驱动,在Linux上需要自己移植。

基本步骤:

  • 下载Linux内核源码,建议用5.4或4.19 LTS版本。
  • 打上高通提供的BSP补丁。这些补丁通常包含DPU、DSI、GPU等驱动。
  • 配置设备树。这是Linux下最关键的环节。设备树里要描述清楚:
display-subsystem {
    compatible = "qcom,sa8155p-dpu";
    reg = <0x0 0xae00000 0x0 0x100000>;
    interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
    
    dsi@ae94000 {
        compatible = "qcom,sa8155p-dsi-ctrl";
        reg = <0x0 0xae94000 0x0 0x400>;
        clocks = <&gcc GCC_DISP_AHB_CLK>;
    };
};

设备树写错了,驱动根本加载不起来。我建议你对照高通的参考设计文档,一行一行地核对。

1.4 开发工具与调试手段

工欲善其事,必先利其器。我常用的工具:

工具 用途 备注
QACT 高通音频校准工具 显示调试也能用,看寄存器
Trace32 JTAG调试 硬件级调试,看PC指针
dmesg 内核日志 最基础的,但最有用
SurfaceFlinger dump Android图层信息 dumpsys SurfaceFlinger

我个人最常用的是dmesgcat /sys/kernel/debug/dri/0/下的调试节点。高通在DPU驱动里留了很多debug接口,比如:

# 查看当前图层配置
cat /sys/kernel/debug/dri/0/dpu_crtc

# 手动触发一次显示刷新
echo 1 > /sys/kernel/debug/dri/0/dpu_crtc_commit

这些调试接口,在开发阶段能帮你省不少事。

1.5 本章小结

好,咱们把第一章的内容捋一捋。8155的显示子系统,核心就是DPU+GPU+MDP这个铁三角。开发环境搭建,Android和Linux各有各的坑,但万变不离其宗——先把硬件框图吃透,再动手写代码。

下一章,咱们会深入DPU的内部,看看图层是怎么混合的,色彩是怎么处理的。到时候我会拿一个实际项目中的案例,手把手带你调一遍。

对了,如果你在搭建环境时遇到问题,别硬扛。去高通论坛搜一搜,或者翻翻高通的Release Notes。很多坑,前人已经踩过了。

今天就到这儿。下节课见。