MTK (android 开机)Android开机流程解析

本文介绍了嵌入式系统的早期初始化过程,包括平台硬件初始化、UART初始化、中断配置等,并详细解释了启动模式的选择和相应的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//平台相关早期初始化,如获取板级信息,初始化时钟、中断、定时器等
/*
      平台硬件早期初始化,包括irq、timer,wdt,uart,led,pmic(电压管理芯片),i2c,gpio等,
       初始化平台硬件,建立lk基本运行环境。
    */

1.  void platform_early_init(void)

{

    /* initialize the uart */
    uart_init_early();
    platform_init_interrupts();
    platform_early_init_timer();
    mt_gpio_set_default();


     mtk_wdt_init();
    #ifdef LK_PROFILING
    dprintf(INFO,"[PROFILE] ------- WDT Init  takes %d ms -------- \n", (int)get_timer(time_wdt_early_init));


    g_fb_size = mt_disp_get_vram_size();
    g_fb_base = memory_size() - g_fb_size + DRAM_PHY_ADDR;

    dprintf(INFO, "FB base = 0x%x, FB size = %d\n", g_fb_base, g_fb_size);



    //FIXME: Disable for MT6582 FPGA Ealry Porting
    #ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
    if (!(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode ==CMD_MODE))
        {printf("tony:will  mt_disp_init...000\n");
        mt_disp_init((void *)g_fb_base);
        }
     #endif



}



/*
包括nand/emmc,显现相关驱动,启动模式选择,加载logo资源 检测是否DA模式,
检测分区中是否有KE信息,如果就KE信息,就从分区load 到DRAM, 点亮背光,
显示logo,禁止I/D-cache和MMU,跳转到DA(??),配置二级cache的size 获取bat电压,
判断是否低电量是否显示充电logo等
*/

2.void platform_init(void)
{

    #ifdef MTK_EMMC_SUPPORT
    mmc_legacy_init(1);
    #else
    #ifndef MACH_FPGA
    nand_init();
    nand_driver_test();



      #ifdef MTK_KERNEL_POWER_OFF_CHARGING  ///关机充电模式
       if((g_boot_arg->boot_reason == BR_USB) && (upmu_is_chr_det() == KAL_FALSE))
       {
        printf("[%s] Unplugged Charger/Usb between Pre-loader and Uboot in Kernel Charging Mode, Power Off \n",  

       __func__);
        mt6575_power_off();
       }
       #endif


        env_init();
        print_env();





       mboot_common_load_logo((unsigned long)mt_get_logo_db_addr(), "logo");///加载logo

       mt_disp_fill_rect(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, 0x0);//0->f///显示背景图片
       mt_disp_power(TRUE);
       mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
       mt_disp_wait_idle();
       mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
       mt_disp_wait_idle();
       mt_disp_power(1);           //power on display related modules 

       mt65xx_backlight_on();    ///delete by tony    /////////////打开背光


       boot_mode_select();//////////////选择启动模式!!!--很重要



       if (g_boot_arg->boot_mode == DOWNLOAD_BOOT)///////若是DOWNLOAD_BOOT模式

     {
    printf("[LK] boot mode is DOWNLOAD_BOOT\n");

      #ifdef MTK_SECURITY_SW_SUPPORT
       /* verify da before jumping to da*/
       if (sec_usbdl_enabled()) {
        u8  *da_addr = (u8 *)g_boot_arg->da_info.addr;
        u32 da_len   = g_boot_arg->da_info.len;
        u32 sig_len  = g_boot_arg->da_info.sig_len;
        u8  *sig_addr = (unsigned char *)da_addr + (da_len - sig_len);

        if (da_len == 0 || sig_len == 0) {
        printf("[LK] da argument is invalid\n");
        printf("da_addr = 0x%x\n", da_addr);
        printf("da_len  = 0x%x\n", da_len);
        printf("sig_len = 0x%x\n", sig_len);
        }

        if (sec_usbdl_verify_da(da_addr, (da_len - sig_len), sig_addr, sig_len)) {
        /* da verify fail */
                video_printf(" => Not authenticated tool, download stop...\n");
        while(1); /* fix me, should not be infinite loop in lk */
        }
    }
    else
#endif
    {
        printf(" DA verification disabled...\n");
    }
        mt_disp_show_boot_logo();
        video_printf(" => Downloading...\n");
        mt65xx_backlight_on();
        mtk_wdt_disable();//Disable wdt before jump to DA
        platform_uninit();
#ifdef HAVE_CACHE_PL310
        l2_disable();
#endif

#ifdef ENABLE_L2_SHARING
        config_shared_SRAM_size();
#endif
        arch_disable_cache(UCACHE);
        arch_disable_mmu();
        jump_da(g_boot_arg->da_info.addr, g_boot_arg->da_info.arg1, g_boot_arg->da_info.arg2);
    }

}

   


       mt65xx_bat_init();  //电池初始化




       if(kernel_charging_boot() == 1)///////若是DOWNLOAD_BOOT模式

       {
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
        charging_get_charger_type(&CHR_Type_num);
        if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
        ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER)))
        {
            dprintf(INFO, "[PROFILE] ------- g_boot_mode = %d -------- \n", g_boot_mode);
#endif
        mt_disp_power(TRUE);
        mt_disp_show_low_battery();
        mt_disp_wait_idle();
        mt65xx_leds_brightness_set(6, 110);
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        }
#endif
    }




           if(kernel_charging_boot() == 1)   ///////若是关机充电模式
    {
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
        charging_get_charger_type(&CHR_Type_num);
        if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
        ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER)))
        {
            dprintf(INFO, "[PROFILE] ------- g_boot_mode = %d -------- \n", g_boot_mode);
#endif
        mt_disp_power(TRUE);
        mt_disp_show_low_battery();
        mt_disp_wait_idle();
        mt65xx_leds_brightness_set(6, 110);
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        }
#endif
    }



       else if(g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT && g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT)     ///////若是正常的模式
    {
#ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
        if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT))
        {      
                printf("tony:in 2222:will mt_disp_show_boot_logo\n");
            mt_disp_show_boot_logo();
        }
#endif
    }


      #else    ///////若是其他的模式
#ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
    if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT))
    {      //printf("tony:in 3333:will mt_disp_show_boot_logo \n");
        mt_disp_show_boot_logo();
    }
#endif
#endif



     printf("tony:will invoke sw_env( )\n");////打印出各种启动模式:normal mode,fastboot mode,meta mode,etc
     sw_env(); ====>>>>具体实现:

      #ifndef USER_BUILD
      switch (g_boot_mode)
                                                                 {
      case META_BOOT:
          video_printf(" => META MODE\n");
          break;
      case FACTORY_BOOT:
          video_printf(" => FACTORY MODE\n");
          break;
      case RECOVERY_BOOT:
          video_printf(" => RECOVERY MODE\n");
          break;
      case SW_REBOOT:
          //video_printf(" => SW RESET\n");
          break;
      case NORMAL_BOOT:
          printf("tony:in  sw_env( )==>> case NORMAL_BOOT.... \n");
          //if(g_boot_arg->boot_reason != BR_RTC && get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
          if(get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
              video_printf(" => HIBERNATION BOOT\n");
          else
              video_printf(" => NORMAL BOOT\n");
          break;
      case ADVMETA_BOOT:
          video_printf(" => ADVANCED META MODE\n");
          break;
      case ATE_FACTORY_BOOT:
          video_printf(" => ATE FACTORY MODE\n");
          break;
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
    case KERNEL_POWER_OFF_CHARGING_BOOT:
        video_printf(" => POWER OFF CHARGING MODE\n");
        break;
    case LOW_POWER_OFF_CHARGING_BOOT:
        video_printf(" => LOW POWER OFF CHARGING MODE\n");
        break;
#endif
      case ALARM_BOOT:
          video_printf(" => ALARM BOOT\n");
          break;
      case FASTBOOT:
          video_printf(" => FASTBOOT mode...\n");
          break;
      default:
          video_printf(" => UNKNOWN BOOT\n");
    }
    return;
#endif

<think>我们正在分析版本号 "BRZ_MT6899_15.0.0" 的含义。通常,在嵌入式系统和移动设备(如安卓手机)的开发中,版本号会包含多个部分,每个部分都有特定含义。根据常见的命名规范,我们可以将其拆解为几个部分: 1. **前缀(BRZ)**:通常代表项目代号、产品系列或客户代码。例如: - "BRZ" 可能是某个产品线的缩写,或者特定客户的定制版本标识。 - 在芯片厂商(如联发科)的代码库中,前缀有时表示目标设备型号或品牌。 2. **芯片型号(MT6899)**:联发科(MediaTek)芯片的命名规则通常是 "MT" 开头,后接数字型号。这里 "MT6899" 指代具体的芯片平台: - MT6899 是联发科天玑系列的一款5G芯片(例如天玑1100/1200的迭代型号)[^1]。 - 该部分明确驱动或固件所服务的硬件平台。 3. **版本号(15.0.0)**:遵循语义化版本规范(Major.Minor.Patch): - **主版本(15)**:重大更新,可能涉及架构调整或不兼容的API变更。 - **次版本(0)**:功能更新,向下兼容。 - **修订版本(0)**:错误修复或小幅度优化。 ### 完整含义总结 > "BRZ_MT6899_15.0.0" 表示这是一个针对 **联发科MT6899芯片平台** 的软件版本,属于 **BRZ项目系列**,主版本号为 **15**(可能对应Android大版本或其他基础框架的重大迭代)[^1]。 ### 扩展说明 - **关联性验证**:在联发科代码库中,类似命名(如 `MT6873_12.0.0`)常见于内核驱动或HAL实现路径中,例如: ```bash /vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6899 ``` - **Android版本映射**:主版本号 "15" 可能与Android 15(API级别35)相关,但需结合具体代码上下文确认(如 `PLATFORM_VERSION := 15.0.0` 在Makefile中的定义)[^2]。 ### 典型应用场景 1. **驱动适配**:该版本号可能出现在屏幕、摄像头等模块的驱动文件中: ```c // 背光驱动初始化示例 static int __init brz_backlight_init(void) { printk(KERN_INFO "BRZ_MT6899_15.0.0 Backlight Driver Loaded\n"); return platform_driver_register(&brz_bl_driver); } ``` 2. **系统构建标识**:在编译配置文件(如 `BoardConfig.mk`)中定义设备特性: ```makefile # BoardConfig.mk TARGET_BOARD_PLATFORM := mt6899 PRODUCT_MODEL := BRZ_Phone_V15 ``` ### 调试建议 若需验证该版本的具体功能,可检查以下系统属性: ```bash adb shell getprop | grep -iE 'version|platform' # 输出示例 [ro.build.version.release]: [15] [ro.mediatek.platform]: [MT6899] ``` §§相关问题§§ 1. 联发科MT6899芯片的主要技术参数是什么? 2. Android 15有哪些新特性? 3. 如何根据项目代号(如BRZ)查找对应的手机型号?</think>### BRZ_MT6899_15.0.0 版本号含义解析 #### 1. **版本号结构分解** ```mermaid graph LR A[BRZ] -->|项目代号| B[MT6899] -->|芯片平台| C[15.0.0] -->|软件版本| ``` #### 2. **各字段详细解释** 1. **BRZ(项目代号)**: - 设备型号/项目名称缩写(如:小米12代号为"zeus") - 示例:`BRZ` 可能代表特定手机型号(如Redmi Note系列) - 开发中的内部标识,用于区分不同产品线 2. **MT6899(硬件平台)**: - **MT**:联发科(MediaTek)芯片标识 - **6899**:具体芯片型号(天玑系列5G SoC) - 对应硬件规格: - CPU:Cortex-A78/A55架构 - GPU:Mali-G77 MC9 - 制程:6nm工艺 - 支持LPDDR5/UFS 3.1 3. **15.0.0(软件版本)**: - **主版本15**:Android大版本(Android 15) - **次版本0**:功能更新批次(如QPR季度更新) - **修订版本0**:补丁级别(安全更新/Bug修复) - 完整对应关系: $$ \text{Android\ API\ Level} = \begin{cases} 34 & \text{Android\ 14} \\ 35 & \text{Android\ 15} \end{cases} $$ #### 3. **典型应用场景** 在驱动开发中的体现: ```c // 内核驱动文件示例 (如:mtk_disp_drv.c) #define HW_VERSION "MT6899" #define SW_VERSION "15.0.0" static int mtk_display_probe(struct platform_device *pdev) { pr_info("Initializing BRZ project, HW:%s SW:%s\n", HW_VERSION, SW_VERSION); // 版本相关初始化 if (strstr(SW_VERSION, "15.")) { init_android15_features(); // Android 15专属优化 } } ``` #### 4. **版本号演进规则** 在开发分支中的表现: ```bash # 代码仓库分支命名 git branch -a * brz_mt6899_android15_main # 主开发分支 brz_mt6899_15.1.0_test # 功能测试分支 brz_mt6899_15.0.1_security # 安全补丁分支 ``` #### 5. **调试与验证** 1. 系统属性查看: ```bash adb shell getprop | grep -iE 'version|platform' [ro.build.version.release]: [15] [ro.mediatek.platform]: [MT6899] [ro.product.device]: [BRZ] ``` 2. 内核日志确认: ```bash adb shell dmesg | grep -i project [ 0.000000] Project: BRZ_MT6899_15.0.0 ``` 此版本号完整反映了**硬件平台(MT6899)+软件基线(Android 15)+项目代号(BRZ)**的三元组关系,是嵌入式系统开发的标准命名规范[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值