展锐7870lcd时钟计算

路径:trunk\bsp\kernel5.4\kernel5.4\drivers\gpu\drm\sprd\qogirn6pro\global_dpu.c

const struct dpu_clk_ops qogirn6pro_dpu_clk_ops = {
	.parse_dt = dpu_clk_parse_dt,
	.init = dpu_clk_init,
	.enable = dpu_clk_enable,
	.disable = dpu_clk_disable,
};
static int dpu_clk_init(struct dpu_context *ctx)
{
	int ret;
	u32 dpu_core_val;
	u32 dpi_src_val;
	struct clk *clk_src;
	struct dpu_clk_context *clk_ctx = &dpu_clk_ctx;
	struct sprd_dpu *dpu = (struct sprd_dpu *)container_of(ctx,
				struct sprd_dpu, ctx);

	dpu_core_val = calc_dpu_core_clk();

	if (dpu->dsi->ctx.dpi_clk_div) {
		pr_info("DPU_CORE_CLK = %u, DPI_CLK_DIV = %d\n",
				dpu_core_val, dpu->dsi->ctx.dpi_clk_div);
	} else {
		dpi_src_val = calc_dpi_clk_src(ctx->vm.pixelclock);
		pr_info("DPU_CORE_CLK = %u, DPI_CLK_SRC = %u\n",
				dpu_core_val, dpi_src_val);
		pr_info("dpi clock is %lu\n", ctx->vm.pixelclock);
	}

	clk_src = val_to_clk(clk_ctx, dpu_core_val);
	ret = clk_set_parent(clk_ctx->clk_dpu_core, clk_src);
	if (ret)
		pr_warn("set dpu core clk source failed\n");

	if (dpu->dsi->ctx.dpi_clk_div) {
		clk_src = div_to_clk(clk_ctx, dpu->dsi->ctx.dpi_clk_div);
		ret = clk_set_parent(clk_ctx->clk_dpu_dpi, clk_src);
		if (ret)
			pr_warn("set dpi clk source failed\n");
	} else {
		clk_src = val_to_clk(clk_ctx, dpi_src_val);
		ret = clk_set_parent(clk_ctx->clk_dpu_dpi, clk_src);
		if (ret)
			pr_warn("set dpi clk source failed\n");

		ret = clk_set_rate(clk_ctx->clk_dpu_dpi, ctx->vm.pixelclock);
		if (ret)
			pr_err("dpu update dpi clk rate failed\n");
	}

	return ret;
}
<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、付费专栏及课程。

余额充值