基础知识

开机 logo 和充电 logo 资源位置

vendor\sprd\release\bmp\unisoc_bmp

根据你的编译选项使用对应 logo bmp

vendor\sprd\release\pac_config\sl9832e_1h10_64b.ini

BootLogo=1@./vendor/sprd/release/bmp/unisoc_bmp/samsung_720_1280_24bit.bmp

Fastboot_Logo=1@./vendor/sprd/release/bmp/unisoc_bmp/samsung_720_1280_24bit.bmp

编译后开机 logo 位置
vendor\sprd\release\IDH\sl9832e_1h10_64b_Natv-user\SHARKLE_9832e_64b_halo

代码流程

正常启动模式和 fastboot 启动模式

最终都是通过 lcd_splash(LOGO_PART); 进行绘制显示 logo

bsp\bootloader\u-boot\common\loader\boot_mode.c


void normal_mode(void)
{#ifndef CONFIG_ZEBUvibrator_hw_init();set_vibrator(1);vlx_nand_boot(BOOT_PART, BACKLIGHT_ON, LCD_ON);
#elsevlx_nand_boot_zebu(BOOT_PART, BACKLIGHT_ON, LCD_ON);
#endifreturn;
}void fastboot_mode(void)
{debugf("enter\n");
#ifdef CONFIG_SPLASH_SCREEN
extern int drv_lcd_init (void);debug("[LCD] Drawing the logo...\n");drv_lcd_init();lcd_splash(LOGO_PART);lcd_enable();vibrator_hw_init();set_vibrator(1);extern void set_backlight(uint32_t value);fastboot_lcd_printf();set_backlight(BACKLIGHT_ON);mdelay(400);set_vibrator(0);
#endif#if (defined CONFIG_X86) && (defined CONFIG_MOBILEVISOR) && (defined CONFIG_SPRD_SOC_SP9853I)tos_start_notify();
#endif
#ifdef CONFIG_SECBOOTif (get_lock_status() == VBOOT_STATUS_UNLOCK){debugf("INFO: LOCK FLAG IS : UNLOCK!!!\n");lcd_printf("\n   INFO: LOCK FLAG IS : UNLOCK!!!\n");}get_secboot_base_from_dt();
#endifdo_fastboot();return;
}

BOOT_PART 其实就是 logo 字符串,搜索找到定义位于

bsp\bootloader\u-boot\include\loader_common.h

#define SPL_PART "spl"
#define LOGO_PART "logo"
#define CHARGER_LOGO_PART "chargelogo"
#define BOOT_PART "boot"
#define RECOVERY_PART "recovery"
#define FACTORY_PART "prodnv"
#define PRODUCTINFO_FILE_PATITION  "miscdata"
#define DT_PART "dt"

继续跟进正常启动模式下,vlx_nand_boot(BOOT_PART, BACKLIGHT_ON, LCD_ON);

bsp\bootloader\u-boot\common\loader\loader_nvm.c

uint32_t uboot_start_time;
void vlx_nand_boot(char *kernel_pname, int backlight_set, int lcd_enable)
{boot_img_hdr *hdr = (void *)raw_header;char *mode_ptr = NULL;uchar *partition = NULL;int i = 0;int j = 0;int ret = 0;uchar *dt_adr = DT_ADR;uint32_t lcd_init_time;uint32_t backlight_on_time;uint32_t uboot_consume_time;#ifdef CONFIG_SOC_IWHALE2aon_lpc_config();
#endifwakeup_source_enable();ap_clk_doze_enable();#ifdef CONFIG_SPLASH_SCREENlcd_init_time = SCI_GetTickCount();printf("lcd start init time:%dms\n", lcd_init_time);if(lcd_enable) {extern void lcd_enable(void);debug("[LCD] Drawing the logo...\n");drv_lcd_init();lcd_splash(LOGO_PART);lcd_enable();}
........

再来看看 lcd_splash(LOGO_PART) 干了啥

bsp\bootloader\u-boot\common\splash.c

int lcd_splash(uchar *logo_part_name)
{int x = 0, y = 0, ret;u8 *addr;u8 *s;s = getenv("splashimage");if (!s) {debugf("%s: failed to get env from splashimage\n");return -1;}addr = (u8 *) simple_strtoul(s, NULL, 16);ret = splash_screen_prepare(logo_part_name, addr);if (ret)return ret;splash_get_pos(&x, &y);return bmp_display(addr, x, y);
}

logo_part_name 值可能是 "logo 或 “chargelogo”,还有显示充电logo的时候

从指定分区中读取出 logo bmp存储地址 addr

其实就是 bmp_image

bsp\bootloader\u-boot\common\cmd_bmp.c

int bmp_display(ulong addr, int x, int y)
{int ret;struct bmp_image *bmp = (struct bmp_image *)addr;void *bmp_alloc_addr = NULL;unsigned long len;if (!((bmp->header.signature[0]=='B') &&(bmp->header.signature[1]=='M')))bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);if (!bmp) {printf("There is no valid bmp file at the given address\n");return 1;}#if defined(CONFIG_LCD)ret = lcd_display_bitmap((ulong)bmp, x, y);
#elif defined(CONFIG_VIDEO)ret = video_display_bitmap((unsigned long)bmp, x, y);
#else
# error bmp_display() requires CONFIG_LCD or CONFIG_VIDEO
#endifif (bmp_alloc_addr)free(bmp_alloc_addr);return ret;
}

最终在 lcd 中绘制 logo

bsp\bootloader\u-boot\common\lcd.c


int lcd_display_bitmap(ulong bmp_image, int x, int y)
{u8 bmp_bpix;u16 width, height, bmp_width, fb_width, hdr_size;u32 colors;u8 *fb, *bmap, *bmap8;u16 *fb16, *bmap16, *cmap_base = NULL;u32 *fb32;rgb24_t *bmap24;rgb32_t *bmap32;struct bmp_image *bmp = (struct bmp_image *)map_sysmem(bmp_image, 0);struct bmp_color_table_entry *palette = bmp->color_table;.....switch (bmp_bpix) {case 1:case 8:cmap_base = configuration_get_cmap();
#ifdef CONFIG_LCD_BMP_RLE8u32 compression = get_unaligned_le32(&bmp->header.compression);debug("compressed %d %d\n", compression, BMP_BI_RLE8);if (compression == BMP_BI_RLE8) {lcd_display_rle8_bitmap(bmp, cmap_base, fb, x, y);break;}
#endifif (cmap_base)BMP_TO_FB(fb16, u16, bmap8, u8, PIXEL8_TO_INT16, cmap_base);elseBMP_TO_FB(fb16, u16, bmap8, u8, PIXEL16_TO_INT16, palette);break;case 16:BMP_TO_FB(fb16, u16, bmap16, u16, RGB16_TO_INT16);break;case 24:BMP_TO_FB(fb32, u32, bmap24, rgb24_t, RGB24_TO_INT32);break;case 32:BMP_TO_FB(fb32, u32, bmap32, rgb32_t, RGB32_TO_INT32);break;default:break;};lcd_sync();return 0;
}

[SPRD] Q 版本开机 logo 显示原理相关推荐

  1. 高通平台android kernel 开机logo显示和传统linux一样

     由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具 ...

  2. 高通平台android kernel 开机logo显示和传统linux一样 .

    由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具真的很 ...

  3. 计算机q启动时有logo,怎么取消电脑开机显示logo

    由于有些电脑开机logo显示持续时间较长,这让用户们有点烦恼.那么怎么取消电脑开机显示logo呢?学习啦小编分享了取消电脑开机显示logo的方法,希望对大家有所帮助. 取消电脑开机显示logo方法 1 ...

  4. 开机logo切换逻辑深入研究

    增加暗码命令切换开关机logo功能 u-boot logo显示原理: 1.----Little Kernel会在platform_early_init阶段首先会获取lcm params,其工作流 程就 ...

  5. 地表最强之Android开机Logo动态替换(附100余款车商原厂高清logo)

    前言 现在很多车载大屏都是基于Android系统,其中都会有一个开机 logo 替换程序,任你选择各大车商 logo 替换,一开机就能查看效果. 一直对这块很感兴趣,研究了发现 MTK 平台可以通过 ...

  6. 开机logo和开关机动画

    转载自:http://blog.csdn.net/u014770862/article/details/52624627 android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于an ...

  7. MTK开机LOGO图片的显示原理

     MTK开机LOGO图片的显示原理 一.图片的定义 1 1.1.update脚本 1 1.2.rules.mk脚本 2 1.3.图片的宏定义cust_display.h(索引序列号) 3 二.LO ...

  8. MT6765开机LOGO图片的显示原理

    概述  Android 开机画面由三部分组成,第一部分在bootloader启动时显示(uboot):第二部分在启动kernel 时显示(kernel):第三部分在系统启动时(bootanimatio ...

  9. 电脑开机只显示计算机界面,电脑开机只显示主板logo进不去系统是什么原因

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:电脑开机只显示主板logo进不去系统是什么原因?回答:说明主板不能读取其他硬件 无法跳过主板LOGO进入下一步 你把键鼠 耳机 头 ...

最新文章

  1. 双字节数据 先低后高_1.4 C++数据类型
  2. neural network ppt for support vector machine
  3. php email 发送,php 发送 Email
  4. 程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
  5. C#面试题(.net开发人员必备)
  6. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
  7. java怎么从后天往前台传参_Java后台解析前台的get中文请求
  8. iOS Runtime运行机制详解
  9. pycharm调试GreenOdoo
  10. 应用内收费--商品列表--子龙山人
  11. Unity3d美颜滤镜
  12. 脑子傻怎么学php,小孩子学习不好脑子不开窍怎么办?4个方法让“笨”孩子聪明起来...
  13. 计算机证英语四六级证驾驶证,学校毕业要求有两个技能证书,计算机二级,四六级,到底算不算技能证?...
  14. 解决VMbox中软连接创建错误的问题
  15. 左侧颜面部起疱,疼痛剧烈2天-牙博士
  16. 绘制2019-nCoV动态疫情地图
  17. 清华博士生导师亲授:高考志愿计算机/AI专业填报指南
  18. 布尔操作符:逻辑或 (||)、逻辑与()、逻辑非(!)
  19. UNIZEN每周洞察第四期:Unizen生态迎来丰富进展
  20. 大数据测试--转载自开源优测

热门文章

  1. JavaScript Web APIs
  2. FPGA--ZCU106通过SFP+/SGMII模块传输数据-第一讲(全网唯一)
  3. 金华驾驶员考试中心 科目二、科目三和科目四
  4. 【宠物商店管理系统】基于SSM的宠物商店系统(ppt+论文+源代码)
  5. 华为路由器静态路由协议配置
  6. java 三维数组 魔方_三维数组的横向/纵向输出
  7. OpenFOAM动态加密网格的负载平衡
  8. 713页鸿蒙巨作《鸿蒙HarmonyOS手机应用开发实战》简介
  9. matlab hsi颜色空间,RGB与HSI颜色空间互换函数(matlab)
  10. 环保数采仪助力绿水青山建设