高通平台bootloader显示logo图片的过程

2024-05-27 11:48

本文主要是介绍高通平台bootloader显示logo图片的过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

platform:  mtk8937

以下为开机后调用关系:

根据不同的平台,这个函数所在的文件不同; 我们项目属于msm8952系列;

void target_display_init(const char *panel_name)
{struct oem_panel_data oem;int32_t ret = 0;uint32_t panel_loop = 0;set_panel_cmd_string(panel_name);oem = mdss_dsi_get_oem_data();if (!strcmp(oem.panel, NO_PANEL_CONFIG)|| !strcmp(oem.panel, SIM_VIDEO_PANEL)|| !strcmp(oem.panel, SIM_CMD_PANEL)|| oem.skip) {dprintf(INFO, "Selected panel: %s\nSkip panel configuration\n",oem.panel);return;}do {target_force_cont_splash_disable(false);ret = gcdb_display_init(oem.panel, MDP_REV_50, (void *)MIPI_FB_ADDR);if (!ret || ret == ERR_NOT_SUPPORTED) {break;} else {target_force_cont_splash_disable(true);msm_display_off();}} while (++panel_loop <= oem_panel_max_auto_detect_panels());if (!oem.cont_splash) {dprintf(INFO, "Forcing continuous splash disable\n");target_force_cont_splash_disable(true);}
}

再调用以下函数:

int gcdb_display_init(const char *panel_name, uint32_t rev, void *base)
{int ret = NO_ERROR;int pan_type;dsi_video_mode_phy_db.pll_type = DSI_PLL_TYPE_28NM;pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),&dsi_video_mode_phy_db);if (pan_type == PANEL_TYPE_DSI) {if (update_dsi_display_config())goto error_gcdb_display_init;target_dsi_phy_config(&dsi_video_mode_phy_db);mdss_dsi_check_swap_status();mdss_dsi_set_pll_src();if (dsi_panel_init(&(panel.panel_info), &panelstruct)) {dprintf(CRITICAL, "DSI panel init failed!\n");ret = ERROR;goto error_gcdb_display_init;}panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db;panel.pll_clk_func = mdss_dsi_panel_clock;panel.dfps_func = mdss_dsi_mipi_dfps_config;panel.power_func = mdss_dsi_panel_power;panel.pre_init_func = mdss_dsi_panel_pre_init;panel.bl_func = mdss_dsi_bl_enable;panel.dsi2HDMI_config = mdss_dsi2HDMI_config;/** Reserve fb memory to store pll codes and pass* pll codes values to kernel.*/panel.panel_info.dfps.dfps_fb_base = base;base += DFPS_PLL_CODES_SIZE;panel.fb.base = base;dprintf(SPEW, "dfps base=0x%p,d, fb_base=0x%p!\n",panel.panel_info.dfps.dfps_fb_base, base);panel.fb.width =  panel.panel_info.xres;panel.fb.height =  panel.panel_info.yres;panel.fb.stride =  panel.panel_info.xres;panel.fb.bpp =  panel.panel_info.bpp;panel.fb.format = panel.panel_info.mipi.dst_format;} else if (pan_type == PANEL_TYPE_EDP) {mdss_edp_panel_init(&(panel.panel_info));/* prepare func is set up at edp_panel_init */panel.clk_func = mdss_edp_panel_clock;panel.power_func = mdss_edp_panel_power;panel.bl_func = mdss_edp_bl_enable;panel.fb.format = FB_FORMAT_RGB888;} else {dprintf(CRITICAL, "Target panel init not found!\n");ret = ERR_NOT_SUPPORTED;goto error_gcdb_display_init;}panel.fb.base = base;panel.mdp_rev = rev;ret = msm_display_init(&panel);error_gcdb_display_init:display_enable = ret ? 0 : 1;return ret;
}

再调用下面函数: //  配置lcd.

int msm_display_init(struct msm_fb_panel_data *pdata)
{int ret = NO_ERROR;panel = pdata;if (!panel) {ret = ERR_INVALID_ARGS;goto msm_display_init_out;}/* Turn on panel */if (pdata->power_func)ret = pdata->power_func(1, &(panel->panel_info));if (ret)goto msm_display_init_out;if (pdata->dfps_func)ret = pdata->dfps_func(&(panel->panel_info));/* Enable clock */if (pdata->clk_func)ret = pdata->clk_func(1, &(panel->panel_info));if (ret)goto msm_display_init_out;/* Read specifications from panel if available.* If further clocks should be enabled, they can be enabled* using pll_clk_func*/if (pdata->update_panel_info)ret = pdata->update_panel_info();if (ret)goto msm_display_init_out;/* Enabled for auto PLL calculation or to enable* additional clocks*/if (pdata->pll_clk_func)ret = pdata->pll_clk_func(1, &(panel->panel_info));if (ret)goto msm_display_init_out;/* pinfo prepare  */if (pdata->panel_info.prepare) {/* this is for edp which pinfo derived from edid */ret = pdata->panel_info.prepare();panel->fb.width =  panel->panel_info.xres;panel->fb.height =  panel->panel_info.yres;panel->fb.stride =  panel->panel_info.xres;panel->fb.bpp =  panel->panel_info.bpp;}if (ret)goto msm_display_init_out;ret = msm_fb_alloc(&(panel->fb));if (ret)goto msm_display_init_out;fbcon_setup(&(panel->fb));display_image_on_screen();if ((panel->dsi2HDMI_config) && (panel->panel_info.has_bridge_chip))ret = panel->dsi2HDMI_config(&(panel->panel_info));if (ret)goto msm_display_init_out;ret = msm_display_config();if (ret)goto msm_display_init_out;ret = msm_display_on();if (ret)goto msm_display_init_out;if (pdata->post_power_func)ret = pdata->post_power_func(1);if (ret)goto msm_display_init_out;/* Turn on backlight */if (pdata->bl_func)ret = pdata->bl_func(1);if (ret)goto msm_display_init_out;msm_display_init_out:return ret;
}

再调用,下面函数;

void display_image_on_screen(void)
{
#if DISPLAY_TYPE_MIPIint fetch_image_from_partition();dprintf(INFO, "display_image_on_screen-1\n");if (fetch_image_from_partition() < 0) {display_default_image_on_screen();} else {/* data has been put into the right place */fbcon_flush();}
#elsedisplay_default_image_on_screen();
#endif
}

再调用显示logo函数:

void display_default_image_on_screen(void)
{unsigned i = 0;unsigned total_x;unsigned total_y;unsigned bytes_per_bpp;unsigned image_base;
#if DISPLAY_TYPE_MIPIchar *image = NULL;
#endifif (!config) {dprintf(CRITICAL,"NULL configuration, image cannot be displayed\n");return;}fbcon_clear(); // clear screen with Black colortotal_x = config->width;total_y = config->height;bytes_per_bpp = ((config->bpp) / 8);image_base = ((((total_y/2) - (SPLASH_IMAGE_HEIGHT / 2) - 1) *(config->width)) + (total_x/2 - (SPLASH_IMAGE_WIDTH / 2)));#if DISPLAY_TYPE_MIPI
#if ENABLE_WBCimage = (pm_appsbl_charging_in_progress() ? image_batt888 : imageBuffer_rgb888);
#elseimage = imageBuffer_rgb888;
#endifif (bytes_per_bpp == 3) {for (i = 0; i < SPLASH_IMAGE_HEIGHT; i++) {memcpy (config->base + ((image_base + (i * (config->width))) * bytes_per_bpp),image + (i * SPLASH_IMAGE_WIDTH * bytes_per_bpp),SPLASH_IMAGE_WIDTH * bytes_per_bpp);}}fbcon_flush();
#if DISPLAY_MIPI_PANEL_NOVATEK_BLUEif(is_cmd_mode_enabled())mipi_dsi_cmd_mode_trigger();
#endif#elseif (bytes_per_bpp == 2) {for (i = 0; i < SPLASH_IMAGE_HEIGHT; i++) {memcpy (config->base + ((image_base + (i * (config->width))) * bytes_per_bpp),imageBuffer + (i * SPLASH_IMAGE_WIDTH * bytes_per_bpp),SPLASH_IMAGE_WIDTH * bytes_per_bpp);}}fbcon_flush();
#endif
}

在以上函数中,fbcon_clear() 是清屏。

	fbcon_clear();  // clear screen with Black color
        config->width;  // screen total width
        config->height  // screen total high
        image_base      // 显示的screen的中心基准。

改变这个image_base 的中心基准值,可以改变图片的显示位置。


这篇关于高通平台bootloader显示logo图片的过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007390

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图