Device tree customization
发布日期:2021-06-30 21:52:21 浏览次数:2 分类:技术文章

本文共 7249 字,大约阅读时间需要 24 分钟。

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 # . 

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 #  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_images\core\boot\secboot3\src\boot_config_emmc.c)


LK

dev_tree_get_entry_ptr(bootable\bootloader\lk\platform\msm_shared\dev_tree.c)


Key Enumeration


boot_images\core\api\systemdrivers\DDIChipInfo.h

  DALCHIPINFO_ID_MSM8626    = 145,

  DALCHIPINFO_ID_MSM8226    = 158,


boot_images\core\api\systemdrivers\DDIPlatformInfo.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 bootable\bootloader\lk\platform\msm_shared\smem.h

kernel\arch\arm\boot\dts\msm8226-cdp.dts

    model = "Qualcomm MSM 8226 CDP";

    compatible = "qcom,msm8226-cdp", "qcom,msm8226", "qcom,cdp";

    qcom,msm-id = <145 1 0>;

kernel\arch\arm\boot\dts\msm8226-mtp.dts

    model = "Qualcomm MSM 8226 MTP";

    compatible = "qcom,msm8226-mtp", "qcom,msm8226", "qcom,mtp";

    qcom,msm-id = <145 8 0>;

kernel\arch\arm\boot\dts\msm8226-qrd.dts

    model = "Qualcomm MSM 8226 QRD";

    compatible = "qcom,msm8226-qrd", "qcom,msm8226", "qcom,qrd";

    qcom,msm-id = <145 11 0>;


kernel\arch\arm\boot\dts\msm8916-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_images\core\boot\secboot3\scripts\jedec_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_images\core\boot\secboot3\scripts
  • 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_images\core\boot\secboot3\hw\msm8x26
  • 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


bootable\bootloader\lk\platform\msm_shared\dev_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_images\core\boot\secboot3\scripts\jedec_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>

转载地址:https://loongembedded.blog.csdn.net/article/details/51015438 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MSM平台RPM
下一篇:SMEM介绍

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月27日 02时51分33秒