智能座舱仪表屏驱动解析

方案概述

视频信号从SOC的MIPI DSI接口输出,经过MAX96755加串器转为GMSL信号从控制板输出到屏模块。控制信号从SOC的I2C接口输出,可直接与MAX96755通信,经过MAX96755透传还可与屏模块的MAX96752解串器通信,经过MAX96752透传还可与屏模块的MCU通信。MAX96752会将GMSL信号转为LVDS信号供LCD面板显示。MCU会通过一个GPIO输出PWM来控制LCD背光,SOC只需通过I2C给MCU发送背光控制指令即可。方案架构图如下图所示:

因此,智能座舱仪表屏驱动分为以下几部分:

驱动名称注释
Linux I2C主机驱动芯驰已实现,只需配置设备树
Linux MIPI DSI驱动芯驰已实现,只需配置设备树
Linux I2C设备驱动(MAX96755,MAX96752)需要根据供应商提供的demo移植
Linux I2C设备驱动(MCU)需要根据供应商提供的I2C协议实现背光控制

MIPI DSI协议简介

 关于MIPI DSI协议,可参考下面几篇文章,讲得比较清楚:

液晶接口系列——MIPI之DSI协议讲解_mipi dsi 时序图-CSDN博客

液晶接口系列——MIPI之DSI时钟的计算和常见概念区分_mipi ui是什么-CSDN博客

液晶接口系列——MIPI(三)DSI时序讲解与实际测试_dsi lanes set to lp-11-CSDN博客

MAX96755简介

模块图如下所示:

引脚图如下所示:

MAX96755可以接收单视频流也可以同时接收两个视频流,接收两个视频流的时候可以以不同的模式显示,如下面几张图所示:

  

 MAX96755可以工作在不同的模式以适应不同的应用场景,具体如下面几张图所示:

加串器(MAX96755)和解串器(MAX96752)的初始化

序号

芯片

寄存器地址

读/写

注释

1

MAX96755

0xd

N.A.

① 读取MAX96755的ID。

2

MAX96755

0x1

0xc4

① 使能I2C透传功能。SOC的I2C引脚连接在MAX96755的I2C引脚上,SOC作为I2C主机,因此SOC可以和MAX96755通过I2C进行通信。那SOC如何跟屏模块中的MAX96752和MCU通信呢?这就要使能I2C透传功能,将I2C信号融合到GMSL信号中透传出去,这样MAX96752以及连接在MAX96752上的MCU就能接收到SOC发出的I2C信号了。

② I2C引脚连接到控制模块。与MAX96755直连的I2C主机和通过GMSL通道间接连接的I2C主机都可以与其通信来操作MAX96755内部的控制模块以对芯片进行各种配置。在多主机的情况下,根据实际需求可以关闭MAX96755的I2C引脚与内部控制模块的连接来防止冲突。在本项目中,这是不需要的,保持连接开启。

③ GMSL通道连接到控制模块。含义与②类似,只是针对的是GMSL通道。在本项目中,这是不需要的,保持连接开启。

④ 设置发送速率为3Gbps。

3

MAX96755

0x330

0x4

① 配置为两个MIPI接收port,每个port有4个lane(一组差分接收引脚为一个lane),并且只使能A port,因为本项目SOC连接到了A port。

4

MAX96755

0x10

0x21

① 禁用link自动配置。

② 选择link A,因为本项目中解串器连接到了加串器的GMSL link A上。

③ 复位data path(保留寄存器配置)。

5

MAX96752

0x1

0x1

① 设置接收速率为3Gbps。

6

MAX96752

0x1ce

0x47

① 将输出信号设为VESA格式。oLDI格式和VESA格式都是基于LVDS(低压差分信号)的视频信号。

7

MAX96752

0xe

N.A.

① 读取MAX96752的ID。

8

MAX96752

0x10

0x21

① 禁用link自动配置。

② 选择link A,因为本项目中加串器连接到了解串器的GMSL link A上。

③ 复位data path(保留寄存器配置)。

9

MAX96755

0x1c8

0x83

① 设置输出帧同步信号VS。

10

MAX96755

0x10

0x21

① 禁用link自动配置。

② 选择link A,因为本项目中解串器连接到了加串器的GMSL link A上。

③ 复位data path(保留寄存器配置)。

11

MAX96752

0x1cf

0x9

① 使能展频。展频是硬件中的术语,用于降低电磁干扰。

12

MAX96755

0x380

0b00xxxxxx

① 将MIPI DSI接口的模式设置为使用同步脉冲的非突发模式。Sync pulses 是一种通过脉冲信号来同步视频数据的方式。这些脉冲信号在视频帧的开始和结束时出现,以指示数据传输的边界。Sync events 是一种基于事件触发的同步方式,与 sync pulses 不同,它不依赖于固定的脉冲信号,而是通过检测特定的事件(如帧开始、帧结束等)来同步视频数据。

13

MAX96755

0x385

(根据屏幕参数设置)

① 设置行同步信号HS宽度的低8位。

14

MAX96755

0x386

(根据屏幕参数设置)

① 设置帧同步信号VS宽度的低8位。

15

MAX96755

0x387

(根据屏幕参数设置)

① 设置行同步信号HS和帧同步信号VS宽度的高4位。

16

MAX96755

0x3a5

(根据屏幕参数设置)

① 设置与帧同步信号VS相关的VFP参数的低8位。

17

MAX96755

0x3a7

(根据屏幕参数设置)

① 设置与帧同步信号VS相关的VBP参数的高8位。

18

MAX96755

0x3a6

(根据屏幕参数设置)

① 设置VFP参数的高4位和VBP参数的低4位。

19

MAX96755

0x3a8

(根据屏幕参数设置)

① 设置垂直方向像素点数的低8位。

20

MAX96755

0x3a9

(根据屏幕参数设置)

① 设置垂直方向像素点数的高8位。

21

MAX96755

0x3aa

(根据屏幕参数设置)

① 设置与行同步信号HS相关的HFP参数的低8位。

22

MAX96755

0x3ac

(根据屏幕参数设置)

① 设置与行同步信号相关的HBP参数的高8位。

23

MAX96755

0x3ab

(根据屏幕参数设置)

① 设置HFP参数的高4位和HBP参数的低4位。

24

MAX96755

0x3ad

(根据屏幕参数设置)

① 设置水平方向像素点数的低8位。

25

MAX96755

0x3ae

(根据屏幕参数设置)

① 设置水平方向像素点数的高8位。

26

MAX96755

0x389

0bxxx1xxxx

① 配置控制器0不需要发送端发送EOTP包。EOTP包是MIPI DSI协议中的一种数据包,用于表示高速模式传输即将结束。

27

MAX96755

0x3a4

0xc3

① Select the skewed DE and DOUT output from the DSI controller.

② 使能DPI Deskew,它被用于解决时钟 lane与数据lane间相位差问题,确保高速数据传输的准确性。

28

MAX96755

0x399

0bxxx1xxxx

① 配置控制器1不需要发送端发送EOTP包。EOTP包是MIPI DSI协议中的一种数据包,用于表示高速模式传输即将结束。

29

MAX96755

0x330

0x4

① 配置为两个MIPI接收port,每个port有4个lane(一组差分引脚为一个lane),并且只使能A port,因为本项目SOC连接到了A port。

30

MAX96755

0x331

0x73

① 为port A和port B选择4个lane。

32

MAX96755

0x308

0x7c

① 使能line start information frame。

② 使能port A和port B。

③ port A使用视频管道X和Y,port B使用视频管道U和Z。

33

MAX96755

0x2

0x13

① 使能视频管道X,禁用视频管道U、Z、Y。

34

MAX96755

0x311

0x1

① 开启视频管道X中来自port A的视频传输。

35

MAX96755

0x53

0x10

① 设置视频管道X的视频流ID为0。

MIPI DSI接口的初始化

MIPI DSI接口由于在SOC内部,因此驱动代码芯驰已经写好了,我们要做的就是根据屏幕参数进行一些配置,具体如下表:

配置项

注释

dp_res

1

DP为display processor的简称,它可以通过自身的硬件进行一些图形运算。芯驰X9HP有3个DP,值”1“表示选择第二个DP。

dc_res

1

DC为display controller的简称,它可以通过自身的硬件进行一些图形运算,功能比DP要弱一些。芯驰X9HP有4个DC,值”1“表示选择第二个DC。

if_res

2

选择视频接口,值”2“表示使用第二个MIPI DSI接口,这个要根据原理图确定。

pixel_bpp

2

像素格式,如RGB888、RGB565等等,值”2“表示选择RGB888格式,因为本项目的液晶屏使用RGB888格式。

width_mm

292

屏幕宽度为292mm。

height_mm

109

屏幕高度为109mm。

fps

60

帧率设为每秒60帧。

display_timing

hactive

1280

本项目使用的液晶屏水平方向有1280个像素点。

hfront_porch

56

本项目使用的液晶屏HFP参数(参见RGB显示接口时序)为56个时钟周期。

hback_porch

26

本项目使用的液晶屏HBP参数(参见RGB显示接口时序)为26个时钟周期。

hsync_len

6

本项目使用的液晶屏行同步信号的宽度为6个时钟周期。

vactive

720

本项目使用的液晶屏竖直方向有720个像素点。

vfront_porch

12

本项目使用的液晶屏VFP参数(参见RGB显示接口时序)为12个显示一行所需的时间。

vback_porch

10

本项目使用的液晶屏VBP参数(参见RGB显示接口时序)为10个显示一行所需的时间。

vsync_len

10

本项目使用的液晶屏帧同步信号宽度为10个时钟周期。

pll_clk

413000000

此值是使用芯驰提供的工具根据hactive、hfront_porch、hback_porch、hsync_len、vactive、vfront_porch、vback_porch、vsync_len、fps计算出来的,具体什么意思不用纠结,如果是别的微处理器没有这个参数。这里重点是掌握像素时钟和MIPI DSI位时钟的计算方法,参考《液晶接口系列——MIPI之DSI时钟的计算和常见概念区分_mipi ui是什么-CSDN博客》。

mipi

burst_mode

2

设置MIPI DSI传输模式为burst模式,三种传输模式参考《液晶接口系列——MIPI之DSI协议讲解_mipi dsi 时序图-CSDN博客》。

video_bus_width

24

表示一个像素使用的位数,由于本项目使用的液晶屏是RGB888格式的,所以表示一个像素就要用24位。

lane_number

4

使用4个lane(一组差分引脚为一个lane)传输图像数据。

关于显存

存储一帧或者多帧图像像素数据的RAM就是显存,它可以放在微处理器的外部RAM中,也可以放在内部RAM中。显示控制器会从显存中读取像素数据,并通过MIPI DSI接口发出,这样一帧帧的图像就在液晶屏上显示出来了。需要配置显示控制器的相关寄存器来告诉它显存的基地址在哪。在Linux中,芯片厂商已经将显示控制器的驱动写好了,我们只需在设备树中配置显存的物理地址和大小即可。驱动会生成一个帧缓冲设备(命名类似于/dev/fb0之类的),在应用程序中操作这个设备文件即可访问显存。

<think>好的,用户问的是关于UIS7870平台在Android 13上适配多屏显示的修改点。首先,我需要确认UIS7870是什么芯片,可能属于某家国产车规级SoC,常用于智能座舱系统。多屏显示在车载场景中很常见,比如中控屏、仪表盘、后排娱乐屏等,所以适配多屏显示是关键需求。 接下来,用户提到Android 13,所以需要了解Android 13在显示系统方面的更新,比如DisplayManager、SurfaceFlinger的变化,以及多屏支持的API是否有变动。可能涉及HDMI、DisplayPort或虚拟显示的输出配置。 然后,适配多屏通常涉及内核驱动、HAL层、SurfaceFlinger配置、WindowManager策略等。需要检查显示驱动是否支持多路输出,HAL层是否有必要的接口实现,比如hwcomposer的配置。Android 13可能引入了新的多屏管理特性,比如动态分辨率切换、热插拔处理的改进,或者对多独立显示的支持。 另外,多屏显示在车载环境下可能有特殊需求,比如不同屏幕的不同DPI、方向、安全区域等,需要确认DisplayPolicy和WindowManager如何管理不同屏幕的窗口。Android 13的窗口管理是否有新API或行为变化,比如对Activity嵌入(ActivityEmbedding)的支持,或者分屏多任务的改进,这些都可能影响多屏适配。 还要考虑权限和安全方面,Android 13加强了隐私保护,多屏显示是否需要新的权限,比如投射内容到副屏是否需要用户授权。同时,系统服务如DisplayService是否需要调整,以确保多屏的生命周期管理正确。 可能还需要修改框架层的配置,比如config.xml中关于多屏的配置项,或者叠加层(overlay)的资源调整,比如分辨率和布局适应不同屏幕。另外,测试多屏时的性能优化,比如GPU渲染多路输出的性能,是否启用硬件加速合成等。 最后,参考Android官方文档中关于多屏支持的更新,以及芯片厂商(如UIS7870的供应商)提供的BSP更新,是否有针对Android 13的驱动或框架层补丁需要应用。可能需要查阅相关平台的开发文档或社区讨论,寻找适配案例。 总结步骤:1. 确认内核驱动支持多输出;2. 更新HAL层实现;3. 调整SurfaceFlinger和WindowManager配置;4. 处理热插拔和动态配置变更;5. 适配新的Android 13 API和安全策略;6. 测试和优化多屏性能及用户体验。</think>针对UIS7870车规级芯片在Android 13上适配多屏显示的关键修改点,以下是系统级的适配路径和技术细节: ### 一、显示子系统驱动层 1. **内核DRM/KMS驱动适配** - 需扩展`drm_driver`实现多CRTC/Encoder/Connector支持 - 配置`dts`文件定义多路显示管线: ```dts display-subsystem { ports = <&vop_out0>, <&vop_out1>; route { route_hdmi: route-hdmi { connect = <&vop_out0_hdmi>; }; route_lvds: route-lvds { connect = <&vop_out1_lvds>; }; } }; ``` - 实现`drm_panel`驱动对第二/第三屏幕的EDID解析 2. **GPU合成优化** - 启用`AFBC`(Arm Frame Buffer Compression)减少带宽占用 - 配置`MALI_GPU`分时复用策略: ```c mali_gpu_data.split_rsc_mgmt = MALI_SPLIT_RSC_MGMT_ENABLED; ``` ### 二、HAL层适配 1. **HWComposer 2.x扩展** - 实现`HWC2::Layer`的多显示上下文分离 - 配置`hwc_display_contents_1`结构体数组: ```cpp hwc_display_contents_1_t* displays[HWC_NUM_DISPLAY_TYPES]; displays[HWC_DISPLAY_PRIMARY] = &primary_display; displays[HWC_DISPLAY_EXTERNAL] = &ext_display; ``` 2. **Gralloc内存分配策略** - 针对不同屏幕设置`GRALLOC_USAGE`标志: ```cpp const uint64_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_TEXTURE | (is_secondary ? GRALLOC_USAGE_EXTERNAL_DISP : 0); ``` ### 三、Framework层修改 1. **DisplayManagerService增强** - 重写`LogicalDisplayMapper`处理动态显示拓扑: ```java public void configureLocked(int changes) { if ((changes & WindowManagerPolicy.DISPLAY_CHANGED_TOPOLOGY) != 0) { reconfigureDisplayLocked(); } } ``` 2. **WindowManager策略** - 在`DisplayPolicy.java`中定义多屏窗口策略: ```java void configureSecondaryDisplay(DisplayContent display) { display.getDisplayInfo().type = Display.TYPE_EXTERNAL; display.getDisplayRotation().setOrientation(DisplayInfo.ROTATION_90); } ``` 3. **SurfaceFlinger多显示合成** - 启用`MultiDisplayComposition`模式: ```cpp sp<DisplayDevice> dispDev = new DisplayDevice( surfaceFlinger, displayType, hwcDisplayId, ... ); surfaceFlinger->mDisplays.add(dispDev); ``` ### 四、Android 13新特性适配 1. **Display切换策略文件** - 新增`config_multipleDisplaySupport`资源配置: ```xml <!-- res/values/config.xml --> <bool name="config_supportsMultiDisplay">true</bool> <integer name="config_maxNumberOfDisplays">3</integer> ``` 2. **动态刷新率适配** - 实现`DisplayModeDirector`多显示实例: ```java for (Display display : displayManager.getDisplays()) { DisplayModeDirector director = new DisplayModeDirector( display.getDisplayId(), ... ); } ``` ### 五、车规级特殊需求 1. **ASIL-B安全显示** - 在`SurfaceControl`中设置安全层级: ```cpp surface->setLayer(SECURE_LAYER_BASE + displayId); surface->setSecure(true); ``` 2. **QoS带宽保障** - 配置显示带宽分配策略: ```shell echo "display0:4000 display1:2000" > /sys/class/devfreq/dmc/qos ``` 该适配方案需配合UIS7870的BSP包进行验证,重点测试多屏异源信号输出(如主屏2560x1600@60Hz + 副屏1920x720@120Hz)下的图形稳定性。建议使用Android 13新增的`dumpsys display`命令进行拓扑分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值