第一章:高通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代码库。我建议你这么做:
- 获取源码:从高通Codeaurora或者芯片厂商的服务器拉取。命令大概是:
repo init -u <manifest_url> -b <branch_name>
repo sync -j8
这里有个坑——repo sync的时候,网络不稳定很容易中断。我曾经在客户现场,用4G热点下载了整整一天。后来学乖了,先下载到本地服务器,再分发给团队。
- 安装工具链:高通平台需要特定的交叉编译工具链。Android源码里自带了,但要注意版本匹配。比如Android 10对应的是Clang 9.0。
- 配置内核:显示驱动相关的内核配置项,我列几个关键的:
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 |
我个人最常用的是dmesg加cat /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。很多坑,前人已经踩过了。
今天就到这儿。下节课见。