• 高通XBL阶段读取分区


    【需求】:
    在某些场景下,需要在XBL阶段读取分区数据,需要验证xbl阶段方案

    这里主要以裸分区为例,比如oem分区。
    1、创建一个1MB大小的oem.img,写入内容“test oem partition”
    创建方式:

    dd if=/dev/null of=oem.img bs=1024 count=1
    
    • 1

    oem.img内容:
    在这里插入图片描述
    2、XBL阶段读分区方案
    2.1、创建oem_partition_id
    在https://www.guidgenerator.com/online-guid-generator.aspx网站自动生成,生成后加入boot_images/QcomPkg/XBLLoader/boot_gpt_partition_id.c文件:

    diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/XBLLoader/boot_gpt_partition_id.c b/BOOT.XF.4.1/boot_images/QcomPkg/XBLLoader/boot_gpt_partition_id.c
    index bd0b029739..51e7c294da 100755
    --- a/BOOT.XF.4.1/boot_images/QcomPkg/XBLLoader/boot_gpt_partition_id.c
    +++ b/BOOT.XF.4.1/boot_images/QcomPkg/XBLLoader/boot_gpt_partition_id.c
    @@ -223,5 +223,6 @@ struct coldplug_guid aop_recovery_partition_id =
           /*{B8B27C4C-4B5B-8AB2-502F-A792B590A896}*/
           { 0xB8B27C4C, 0x4B5B, 0x8AB2, { 0x50, 0x2F, 0xA7, 0x92, 0xB5, 0x90, 0xA8, 0x96 } };        
     
    -
    +struct coldplug_guid oem_partition_id = 
    +	  { 0x1B15724C, 0x4447, 0x438C, { 0x9B, 0xCB, 0x70, 0x7C, 0x0E, 0x77, 0x5F, 0x6B } };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.2、增加oem分区
    partition_r_ext.xml文件增加oem分区:

    diff --git a/QCM2290.LA.3.0/common/config/emmc/partition_r_ext.xml b/QCM2290.LA.3.0/common/config/emmc/partition_r_ext.xml
    index 97660152ae..0d53760192 100755
    --- a/QCM2290.LA.3.0/common/config/emmc/partition_r_ext.xml
    +++ b/QCM2290.LA.3.0/common/config/emmc/partition_r_ext.xml
    @@ -95,6 +95,7 @@
     		<partition label="super" size_in_kb="4194304" type="89A12DE1-5E41-4CB3-8B4C-B1441EB5DA38" bootable="false" readonly="false" filename="super.img" sparse="true"/>
     		<partition label="privdata1" size_in_kb="102400" type="32AB90B5-5276-4EB8-8EF7-3391E02DE9B1" bootable="false" readonly="false" filename="privdata1.img" sparse="true"/>
     		<partition label="privdata2" size_in_kb="102400" type="BCA1B29C-AE01-4C39-8521-D9727CF98BD0" bootable="false" readonly="false" filename="privdata2.img" sparse="true"/>
    +		<partition label="oem" size_in_kb="1024" type="1B15724C-4447-438C-9bCB-707C0E775F6B" bootable="false" readonly="false" filename="oem.img" sparse="false"/>
     		<partition label="userdata" size_in_kb="4194304" type="1B81E7E6-F50D-419B-A739-2AEEF8DA3335" bootable="false" readonly="false" filename="userdata.img" sparse="true"/>
         </physical_partition>
     </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.3、读取oem分区流程

    diff --git a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_mc.c b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_mc.c
    index 9310f06ec2..b99fab70f8 100755
    --- a/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_mc.c
    +++ b/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_mc.c
    @@ -1360,6 +1360,7 @@ void sbl1_populate_initial_mem_map(bl_shared_data_type* bl_shared_data)
     *   None
     * 
     */
    +void read_oem_partition(void);
     void sbl1_tlmm_init(bl_shared_data_type *bl_shared_data)
     {
       /* Initialize Tlmm and gpio for low power config ,must be done after smem init*/
    @@ -1367,6 +1368,7 @@ void sbl1_tlmm_init(bl_shared_data_type *bl_shared_data)
       {
        BL_VERIFY(FALSE, BL_ERR_INIT_GPIO_FOR_TLMM_CONFIG_FAIL|BL_ERROR_GROUP_BOOT);
       }  
    +  read_oem_partition();
     }
     
     
    @@ -1632,6 +1634,34 @@ void device_programmer_init (bl_shared_data_type* bl_shared_data, boot_pbl_share
       }  
     }
     
    +extern uint8 oem_partition_id[];
    +void read_oem_partition(void)
    +{
    +  boot_boolean success = FALSE;
    +  boot_flash_trans_if_type *trans_if = NULL;
    +  uint8 oem_data_table[1024] = {0};
    +  char data[1024] = "0";
    +  boot_log_message("hanm:read_oem_partition1 ");
    +
    +  boot_set_entry_as_img_whitelist((uint64)(&oem_data_table), (uint64)(1024));
    +
    +  boot_flash_configure_target_image(oem_partition_id);
    +  trans_if = boot_flash_dev_open_image(GEN_IMG);
    +
    +  if (trans_if != NULL) {
    +    success = boot_flash_trans_read(trans_if,
    +	                                oem_data_table,
    +									0,
    +									1024,
    +									IMAGE_BODY_TYPE);
    +
    +	boot_log_message("hanm:read_oem_partition2");
    +	snprintf(data, 1024, "%s", oem_data_table);
    +	boot_log_message(data);
    +	boot_flash_dev_close_image(&trans_if);
    +  }
    +}
    +
     /*===========================================================================
     **  Function :  sbl1_main_ctl
     ** ==========================================================================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    启动效果如下:
    在这里插入图片描述

  • 相关阅读:
    JUC第七讲:关键字final详解
    使用JavaScript及HTML、CSS完成秒表计时器
    【博客550】k8s乐观锁机制:控制并发请求与数据一致性
    复习单片机部分:1.开发板功能及使用介绍 2.51 单片机介绍 3.数字电路与 C 语言基础
    Rabbitmq安装-docker版
    20 - 欲知JVM调优先了解JVM内存模型
    《算法通关村——不简单的字符串转换问题》
    Vue内置指令——v-on(事件处理)
    提升工作效率!如何巧用 Ansible 实现自动化运维?
    自动化测试中临时数据如何保存 ?这里提供一个简单又好用的第三方包 ,可以放弃redis了。
  • 原文地址:https://blog.csdn.net/hanmengaidudu/article/details/136269108