[SPRD] Q 版本开机 logo 显示原理
基础知识
开机 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 显示原理相关推荐
- 高通平台android kernel 开机logo显示和传统linux一样
由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具 ...
- 高通平台android kernel 开机logo显示和传统linux一样 .
由于高通8k平台lk下只有2s多点 故直接在kernel显示logo,这篇文章转载过来制作linux logo,其实这个当时学习就会,只不过忘记了.在这里重提一下ubuntu下的GIMP图片工具真的很 ...
- 计算机q启动时有logo,怎么取消电脑开机显示logo
由于有些电脑开机logo显示持续时间较长,这让用户们有点烦恼.那么怎么取消电脑开机显示logo呢?学习啦小编分享了取消电脑开机显示logo的方法,希望对大家有所帮助. 取消电脑开机显示logo方法 1 ...
- 开机logo切换逻辑深入研究
增加暗码命令切换开关机logo功能 u-boot logo显示原理: 1.----Little Kernel会在platform_early_init阶段首先会获取lcm params,其工作流 程就 ...
- 地表最强之Android开机Logo动态替换(附100余款车商原厂高清logo)
前言 现在很多车载大屏都是基于Android系统,其中都会有一个开机 logo 替换程序,任你选择各大车商 logo 替换,一开机就能查看效果. 一直对这块很感兴趣,研究了发现 MTK 平台可以通过 ...
- 开机logo和开关机动画
转载自:http://blog.csdn.net/u014770862/article/details/52624627 android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于an ...
- MTK开机LOGO图片的显示原理
MTK开机LOGO图片的显示原理 一.图片的定义 1 1.1.update脚本 1 1.2.rules.mk脚本 2 1.3.图片的宏定义cust_display.h(索引序列号) 3 二.LO ...
- MT6765开机LOGO图片的显示原理
概述 Android 开机画面由三部分组成,第一部分在bootloader启动时显示(uboot):第二部分在启动kernel 时显示(kernel):第三部分在系统启动时(bootanimatio ...
- 电脑开机只显示计算机界面,电脑开机只显示主板logo进不去系统是什么原因
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:电脑开机只显示主板logo进不去系统是什么原因?回答:说明主板不能读取其他硬件 无法跳过主板LOGO进入下一步 你把键鼠 耳机 头 ...
最新文章
- 双字节数据 先低后高_1.4 C++数据类型
- neural network ppt for support vector machine
- php email 发送,php 发送 Email
- 程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
- C#面试题(.net开发人员必备)
- java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
- java怎么从后天往前台传参_Java后台解析前台的get中文请求
- iOS Runtime运行机制详解
- pycharm调试GreenOdoo
- 应用内收费--商品列表--子龙山人
- Unity3d美颜滤镜
- 脑子傻怎么学php,小孩子学习不好脑子不开窍怎么办?4个方法让“笨”孩子聪明起来...
- 计算机证英语四六级证驾驶证,学校毕业要求有两个技能证书,计算机二级,四六级,到底算不算技能证?...
- 解决VMbox中软连接创建错误的问题
- 左侧颜面部起疱,疼痛剧烈2天-牙博士
- 绘制2019-nCoV动态疫情地图
- 清华博士生导师亲授:高考志愿计算机/AI专业填报指南
- 布尔操作符:逻辑或 (||)、逻辑与()、逻辑非(!)
- UNIZEN每周洞察第四期:Unizen生态迎来丰富进展
- 大数据测试--转载自开源优测