booting logo & booting animation

本文详细解析了MTK平台设备上开机Logo显示的原理及过程,包括第一张和第二张Logo的图片位置、文件名、显示代码,以及开机动画的资源位置。深入探讨了从bootloader到android init阶段的Logo展示机制。

 

 

 

開機第一張圖片:

 

圖片位置:

linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo

 

因為 project 選用 FHD 屏幕所以

在linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/fhd

 

file name is :

fhd_uboot.bmp

 

code 位置:

第1圖是在 lk phase 顯示的。

linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/platform.c

 538 void platform_init(void)
 539 {

...
...
...
 793 #endif 
 794         } else if (g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT && g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) { 
 795                 if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) { 
 796 #ifndef MACH_FPGA_NO_DISPLAY 
 797                 // 
 798                 // here display
 799                 // 
 801                         mt_disp_show_boot_logo(); 
 802 #endif 
 803                 } 
 804         } 
 805 #else 
 806         if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) { 
 807 #ifndef MACH_FPGA_NO_DISPLAY 
 812                 mt_disp_show_boot_logo(); 
 813 #endif 
 814         } 
 815 #endif 
 816 #ifdef LK_PROFILING 
 817         time_backlight = get_timer(0); 
 818 #endif 
...
...
...
}

 

 

 linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/mt_logo.c

267 void mt_disp_show_boot_logo(void)                                                                                                                                  
268 {
269         int logo_index = 0;
270         int x = 0;
271         char* test = NULL;
272 
273         dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
274         mt_logo_get_custom_if();
275 
276 #if defined(MTK_CARRIEREXPRESS_PACK)
277 #if 0   // test
278         test = (char *)get_env("VAIBHAV");
279         if (test == NULL) {
280                 dprintf(INFO, "[lk logo: SysEnv is not set]\n");
281                 if (set_env("VAIBHAV","5") == 0) {
282                         dprintf(INFO, "[lk logo: SysEnv set to 5 Succesfully]\n");
283                         x = 1;
284                 } else {
285                         dprintf(INFO, "[lk logo: SysEnv set fails!!!]\n");
286                         return;
287                 }
288         } else {
289                 dprintf(INFO, "[lk logo: SysEnv already set to %d]\n",atoi(test));
290         }
291 #endif
292         logo_index = get_logo_index();
293         /*if(x == 1){
294             logo_index = 0;
295             dprintf(INFO, "[lk logo: First Boot So show OM logo]\n");
296         }*/
297         dprintf(INFO, "[lk logo: Final logo_index: %d]\n",logo_index);
298 #endif
299 
300         if (logo_cust_if->show_boot_logo) {
301                 
306                 logo_cust_if->show_boot_logo();
307         } else {
308                 //
309                 // here display logo
310                 //
312 ///show_logo(0); 313 init_fb_screen(); 314 fill_animation_logo(logo_index, mt_get_fb_addr(), mt_get_tempfb_addr(), logo_addr, phical_screen); 315 mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT); 316 } 317 318 return; 319 }

 

 


 

第二張開機圖片

 

 

圖片位置:

linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo

 

因為 project 選用 FHD 屏幕所以

在linux_repo/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/fhd

 

file name is :

fhd_kernel.bmp

 


 

 

第2張圖是在 android init 時顯示的。

 

init process 呼叫,顯示第2張 開機圖片


linux_repo/device/mediatek/mt6755/init.mt6755.rc

819 # Update the second boot logo 820 service bootlogoupdater /vendor/bin/boot_logo_updater 821 class core 822 oneshot

 

 

// 若第一張圖片和第二張圖片是一樣的,

// 則可以將 下列部份 display 圖片 的 code mark 掉,

// 可以減少約 0.1 second 的 開機時間。

linux_repo/vendor/mediatek/proprietary/external/boot_logo_updater/boot_logo_updater.c

183
int main(void) 184 { 185 SLOGD("[boot_logo_updater %s %d]boot_logo_updater,\n",__FUNCTION__,__LINE__); 186 int ret = update_boot_reason(); 187 if (ret == 1) { 188 SLOGE("[boot_logo_updater]skip the boot logo!\n"); 189 set_int_value(LCD_BACKLIGHT_PATH, 120); 190 return 0; 191 } else if (ret == 2) { 192 SLOGD("[boot_logo_updater]schedule on\n"); 193 } 194 // set parameter before init 195 set_draw_mode(DRAW_ANIM_MODE_FB); 196 anim_init(); //
// here display logo
//
198 show_kernel_logo(); 199 anim_deinit(); 200 201 return 0; 202 }

 

 

 

linux_repo/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp


984 /* 985 * Show kernel logo when phone boot up 986 * 987 */ 988 void show_kernel_logo() 989 { 990 if (MTK_LOG_ENABLE == 1) { 991 SLOGD("[libshowlogo: %s %d]show kernel logo, index = 38 \n",__FUNCTION__,__LINE__); 992 } 993 if (error_flag == 0) { 994 #if defined(MTK_CARRIEREXPRESS_PACK) 995 anim_show_logo(get_logo_index(false)); 996 #else //
// here display logo
// 997 anim_show_logo(kernel_logo_position); 998 #endif 999 } 1000 }

 

 

 


 

 

開機動畫

linux_repo/frameworks/base/core/res/assets/images/

file name : 

android-logo-mask.png

 

android-logo-shine.png

 

 


 

 

 

未完待續

 

转载于:https://www.cnblogs.com/youchihwang/p/6215352.html

<think>我们正在讨论计算机系统的启动过程(booting process)。根据引用内容,我们可以整合相关信息来回答这个问题。计算机启动过程是指从开机到操作系统完全加载并运行的过程。这个过程涉及多个阶段,包括硬件自检、加载引导程序、加载内核以及初始化系统等。根据引用[1]和[3],我们可以将Linux系统的启动过程分为以下几个步骤:1.**BIOS/UEFI启动**:当计算机通电时,首先运行的是主板上的固件(BIOS或UEFI)。它进行硬件初始化,并执行POST(上电自检)以检测关键硬件是否正常工作(如内存、CPU等)。如果POST失败,则会出现启动失败错误(引用[2])。2.**加载引导程序**:POST完成后,BIOS/UEFI将控制权交给引导程序。在Linux系统中,常用的引导程序是GRUB2(引用[3])。引导程序可能会显示一个菜单让用户选择要启动的操作系统,或者自动启动默认的操作系统。3.**加载内核和initramfs**:引导程序加载Linux内核以及initramfs(初始RAM文件系统)。initramfs包含启动过程中必需的驱动程序模块和初始化脚本(引用[3])。在RHEL7/CentOS7中,initramfs甚至包含一个完整的操作系统环境,可用于故障排除。4. **启动systemd**:内核加载完成后,会启动系统的第一个进程(在传统的SysV init系统中是init进程,而在RHEL7/CentOS7中则是systemd)。systemd负责初始化系统,包括挂载文件系统、启动服务等(引用[3])。5.**系统初始化**:systemd会按照其配置文件启动目标(target),例如multi-user.target或graphical.target,从而启动所有必要的系统服务,最终用户登录界面出现。此外,引用[5]也提到了booting是操作系统的一部分,属于系统启动过程。为了更清晰地展示,我们可以用步骤描述:步骤1:电源开启,BIOS/UEFI运行,进行POST(引用[1][2])。步骤2:引导加载程序(如GRUB2)被加载(引用[3])。步骤3:内核和initramfs被加载到内存中(引用[3])。步骤4:内核初始化,挂载根文件系统,并启动init/systemd(引用[3])。步骤5: systemd初始化系统,启动服务,进入运行级别或目标(引用[3])。注意:不同操作系统和固件(BIOS vsUEFI)的启动过程可能有所不同,但基本思想相似。下面,我们将按照用户的要求,生成相关问题。</think>### 计算机系统启动过程详解 计算机启动过程(Booting Process)是从通电到操作系统完全就绪的完整流程,主要分为以下阶段: #### 1. **电源通电与硬件自检(POST)** - 通电后主板固件(BIOS/UEFI)初始化硬件组件 - 执行**POST(上电自检)**:检测关键硬件(CPU/内存/存储设备)状态 - 若检测失败:触发启动错误(如蜂鸣告警或屏幕报错)[^2] - 成功则进入下一阶段 #### 2. **引导加载程序阶段(Bootloader)** - BIOS/UEFI按预设顺序(硬盘>USB>网络)查找引导设备 - 加载**引导程序**(如GRUB2)到内存[^3] - GRUB2显示启动菜单供用户选择操作系统内核 #### 3. **内核加载与初始化** - 引导程序加载**Linux内核**和**initramfs**(临时根文件系统) - initramfs包含启动必需的驱动模块(如磁盘控制器驱动)[^3] - 内核初始化硬件,挂载真正的根文件系统 #### 4. **系统初始化(systemd启动)** - 内核启动首个用户空间进程 **systemd**(PID=1)[^3] - systemd核心任务: ```mermaid graph LR A[systemd] --> B[挂载文件系统] A --> C[启动基础服务] A --> D[激活目标单元] ``` - 按需启动multi-user.target(命令行)或graphical.target(图形界面) #### 5. **用户登录阶段** - 启动显示管理器(如GDM) - 加载桌面环境 - 呈现登录界面等待用户认证 > 关键点:整个启动过程形成**硬件→固件→内核→系统服务→用户空间**的接力链[^1][^5],任何环节故障都会导致启动失败[^2]。 --- ### 相关问题 1. **BIOS与UEFI在启动过程中的核心区别是什么?** 2. **如何诊断并修复GRUB2引导失败问题?** 3. **initramfs损坏会导致哪些具体故障现象?** 4. **为什么systemd要替代传统的init进程?** 5. **如何优化Linux系统的启动速度?** [^1]: Linux Booting Process: A step by step tutorial for understanding Linux boot sequence [^2]: If the computer cannot boot, we will get a boot failure error [^3]: CentOS / RHEL 7 : Booting process [^5]: ECE550 Fundamentals of Computer Systems and Engineering final review
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值