• Device tree customization


    Step 1: OEMs can create their own device tree by adding "qcom,msm-id/qcom,board-id" entry at the top of their file. The hardware variant ID has to be unique and created by the OEMs. Please refer to slides 10-13 in doc # 80-ND928-80. 

    qcom,msm-id = <x z>;
    qcom,board-id = <y y'>;
    x = ID for platform id
    y = ID for CDP, MTP (hardware variants) etc.  -- This needs to be created by the OEMs
    y' = ID for subtype (assumed zero if absent)
    z = ID for soc revision

    Only "y" needs to be created, rest of the IDs remain the same.

    Step 2: OEMs should also add their new hardware variant in "compatible" string in the new device tree file being created :
    For example:  compatible = "qcom,msm8916-xxx", "qcom,msm8916", "yyyy,xxx"
    In this example, "yyyy,xxx" is the new compatible string for the new hardware variant.


    Addition of a new SOC entry

    Step 3: A new SOC entry should be defined (for the corresponding compatible string created in step 2) in the file include/soc/qcom/socinfo.h :
    For example:   # define of_board_is_xxx() of_machine_is_compatible(“yyyy,xxx”)
    Please make sure to use the same string ("yyyy,xx") as created in Step 2 above. 

    Based on this soc entry, different GPIOs are installed. Please refer to solution # 00029268 for GPIO configuration in kernel.


    Makefile changes

    Step 4: Please make sure that the new device tree file gets compiled by modifying the Makefile accordingly. 

    File: arch/arm64/boot/dts/qcom/Makefile
    Please add the new DTB file entry under the appropriate target config so that it gets compiled.


    Generation of CDT

    Step 5: Generate the CDT so that SBL becomes aware of the new hardware variant ID and passes this information to LK -  please refer to solution 

    Boot Procedure

    1. sbl1 load default cdt table(config_data_table[]) in sbl1.mbn.
    1. sbl1 check CDT partition which is saved in boot partition of emmc. If yes, overwrite the default cdt table.
    3. sbl1 pass platform info to lk by SMEM
    • sbl1 - SMEM_HW_SW_BUILD_ID   
    • lk - SMEM_BOARD_INFO_LOCATION
    4. lk fetch platform info, load dt header, and search compatible dt entry
    5. lk pass correct dt entry address to kernel

    Key Functions

    SBL1
    boot_update_config_data_table(boot_imagescoreootsecboot3srcoot_config_emmc.c)

    LK
    dev_tree_get_entry_ptr(bootableootloaderlkplatformmsm_shareddev_tree.c)

    Key Enumeration

    boot_imagescoreapisystemdriversDDIChipInfo.h
      DALCHIPINFO_ID_MSM8626    = 145,
      DALCHIPINFO_ID_MSM8226    = 158,

    boot_imagescoreapisystemdriversDDIPlatformInfo.h
      ...
      DALPLATFORMINFO_TYPE_CDP          = 0x01, /**< Target is a MSM CDP/SURF device. */
      DALPLATFORMINFO_TYPE_MTP_MSM      = 0x08,  /**< Target is a MSM MTP device. */
      DALPLATFORMINFO_TYPE_QRD          = 0x0B,  /**< Target is a QRD device. */

    DT Header

    About dt.img format, please refer to dtbtool.txt and bootableootloaderlkplatformmsm_sharedsmem.h
    kernelarcharmootdtsmsm8226-cdp.dts
        model = "Qualcomm MSM 8226 CDP";
        compatible = "qcom,msm8226-cdp", "qcom,msm8226", "qcom,cdp";
        qcom,msm-id = <145 1 0>;
    kernelarcharmootdtsmsm8226-mtp.dts
        model = "Qualcomm MSM 8226 MTP";
        compatible = "qcom,msm8226-mtp", "qcom,msm8226", "qcom,mtp";
        qcom,msm-id = <145 8 0>;
    kernelarcharmootdtsmsm8226-qrd.dts
        model = "Qualcomm MSM 8226 QRD";
        compatible = "qcom,msm8226-qrd", "qcom,msm8226", "qcom,qrd";
        qcom,msm-id = <145 11 0>;

    kernelarcharmootdtsmsm8916-qrd-skuh.dts
        model = "Qualcomm Technologies, Inc. MSM 8916 QRD SKUH";
        compatible = "qcom,msm8916-qrd-skuh", "qcom,msm8916-qrd", "qcom,msm8916", "qcom,qrd";
        qcom,board-id = <0x1000b 0> , <0x1000b 4>;

        
        Notes: Here subtype = 0/4; major version= 01 minor version = 00, platform type = 0b

    CDT Description XML

    boot_imagescoreootsecboot3scriptsjedec_lpddr2_single_channel.xml
          <device id="cdb0">
            <props name="platform_id" type="DALPROP_ATTR_TYPE_BYTE_SEQ">
             
              0x03, 0x00, 0x00, 0x00, 0x00, 0x00, end
           
            </props>
          </device>

    Example of 8x26 device
    CDP:
    0x03, 0x01, 0x01, 0x00, 0x00, 0x00, end
    MTP:
    0x03, 0x08, 0x01, 0x00, 0x00, 0x00, end
    QRD:
    0x03, 0x0B, 0x01, 0x00, 0x00, 0x00, end

    Example of 8916 device
    QRD SKUH:
    0x03, 0x0B, 0x01, 0x00, 0x04, 0x00, end

    Byte 0: platform_id Version
    Byte 1: platform_id type:
               0x01: Target is a SURF device
               0x08: Target is a MTP device
               0x0B: Target is a QRD device
    Byte 2: platform_id major platform version
    Byte 3: platform_id minor platform version
    Byte 4: platform_id subtype


    What's you need do?

    Generate CDT image and boot_cdt_array.c
    • cd boot_imagescoreootsecboot3scripts
    • modify <jedec_lpddr2_single_channel.xml>
    • python cdt_generator.py jedec_lpddr2_single_channel.xml  <cdt image>.bin

    Program CDT image on device

    cd boot_images/core/boot/secboot3/scripts/emmc_cdt_program_scripts
    python ../../../../storage/tools/ptool/ptool.py  -x partition.xml -p 2
    modify <jedec_lpddr2_single_channel.xml>

    QRD HW V2:
    0x03, 0x0B, 0x02, 0x00, 0x00, 0x00, end

    python cdt_generator.py jedec_lpddr2_single_channel.xml  platform_ddr.bin
    cp platform_ddr.bin emmc_cdt_program_scripts

    T32
    run platform_ddr_emmc_cdt_program.cmm
    QPST
    platform_ddr_prog_cfg.xml

    Change default CDT in sbl1 image
    • copy boot_cdt_array.c to boot_imagescoreootsecboot3hwmsm8x26
    • modify config_data_table[] in boot_cdt_array.c
    • rebuild sbl1
    • program sbl1 image 
                   > fastboot flash sbl1 sb1.mbn or use QPST emmcdownload.exe

    Generate DT Binary
    • <modify dts>
    • dtc -p 1024 -O dtb -o msm8626.dtb msm8626.dts
    • cat zImage msm8626.dtb > boot.img
    • program boot image
                   > fastboot flash boot boot.img

    Temp workaround

    After previous step, if the device still stop at LK(usb port fastboot),  you can try this temp workaround

    bootableootloaderlkplatformmsm_shareddev_tree.c
    struct dt_entry * dev_tree_get_entry_ptr(struct dt_table *table)
    {
    <snip>                              
    //workaround:  find out the DTB entry index from boot.img(or dt.img)

    //                   change below code, force return expected expected dt_entry_ptr,

                                   if((dt_entry_ptr->platform_id == board_platform_id()) /* &&

                                   (dt_entry_ptr->variant_id == 1) &&

                                   (dt_entry_ptr->soc_rev == 0)*/  )

                                                   {

                                                                    return dt_entry_ptr ++;

    How to debug

    When mismatch issue happens, lk normally will print error log with below format: 
    ERROR: Unable to find suitable device tree for device ( [ chipset id ] [ soc version ] [ platform id type] [ platform subtype] ) 

    for example as below 
    ERROR: Unable to find suitable device tree for device (164/0x00010001/11/0) 

    Match Procedure 
    1. SBL will get chipset id, soc version from H/W regiser 
    2. SBL fetch platform id type and platform subtype from CDT partitioin 
    3. SBL write those information into share memory 
    4. LK get those information and try to find suitable DTS entry. 

    [chipset id] and [soc version]: 
    For device: 
    read from H/W register, can not modify 
    For DTS: 
    qcom,msm-id = <chipset_id, soc version> 

    [Platform id type] and [platform subtype]: 
    For device, defined in CDT xml file with below format: 
    boot_imagescoreootsecboot3scriptsjedec_lpddr2_single_channel.xml 
    <device id="cdb0"> 
    <props name="platform_id" type="DALPROP_ATTR_TYPE_BYTE_SEQ"> 

    0x03, 0x0B, 0x01, 0x00, 0x04, 0x00, end 

    </props> 
    </device> 
    Byte 0: platform_id Version 
    Byte 1: platform_id type: 
    0x01: Target is a SURF device 
    0x08: Target is a MTP device 
    0x0B: Target is a QRD device 
    Byte 2: platform_id major platform version 
    Byte 3: platform_id minor platform version 
    Byte 4: platform_id subtype 
    So what you need is to care about Byte 1 and Byte 4 
    For DTS: 
    qcom,board-id = <platform_id, subtype_id>
  • 相关阅读:
    Vue 踩坑-2 vue文件中style的scoped属性
    IIS发布Vue项目F5刷新404问题
    .NET Core 3.1 + Hangfire 配置以及踩坑
    Vue 踩坑-1-跨域问题
    Docker 部署VUE项目
    (转)如何利用EnteLib Unity Interception Extension 和PIAB实现Transaction的Call Handler
    Unity 中的策略注入(转)
    面向方面的编程、侦听和 Unity 2.0(转)
    Unity 中的拦截功能(转)
    [转]推荐分享22个优秀的项目管理与协作工具
  • 原文地址:https://www.cnblogs.com/liang123/p/6325252.html
Copyright © 2020-2023  润新知