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. 

,
  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>

Device tree customization的更多相关文章

  1. Device Tree(二):基本概念

    转自:http://www.wowotech.net/linux_kenrel/dt_basic_concept.html 一.前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用 ...

  2. Linux and the Device Tree

    来之\kernel\Documentation\devicetree\usage-model.txt Linux and the Device Tree ----------------------- ...

  3. linux下的device tree

    在我个人的理解,device tree就是描述硬件设备的,目前有什么配置,把这些配置信息告诉linux内核,让内核去识别,增强了内核的通用性,不用因为平台不同而每次都要编译新内核了. 配置device ...

  4. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

  5. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  6. Device Tree Usage( DTS文件语法)

    http://elinux.org/Device_Tree_Usage Device Tree Usage     Top Device Tree page This page walks throu ...

  7. ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...

  8. Device Tree(三):代码分析

    一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...

  9. Device Tree(一):背景介绍

    一.前言 作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎的.扯皮的俗务占据了大部分的时间.当有机会下载3.14的内核并准备学习的时候,突然 ...

随机推荐

  1. Node.js 定时器

    稳定性: 5 - 锁定 所有的定时器函数都是全局的.不需要通过 require() 就可以访问. setTimeout(callback, delay[, arg][, ...]) delay 毫秒之 ...

  2. Go 语言类型转换

    类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实 ...

  3. Python3 数字(Number)

    Python 解释器可以作为一个简单的计算器:您可以在解释器里输入一个表达式,它将输出表达式的值. 表达式的语法很直白: +, -, * 和/ 和在许多其它语言(如Pascal或C)里一样:括号可以用 ...

  4. 工作流引擎 Flowable 6.0.0.RC1 release,完全兼容Activi

    Flowable 6.0.0.RC1 release,第一个可流动的6引擎版本(6.0.0.RC1). Flowable 6.0.0.RC1 relase新增加的功能以及特色: 包重命名为org.Fl ...

  5. ZooKeeper之(四)配置与命令

    4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为"zoo_sample.cfg"的文件,是ZooKeeper配置文件的模板. ZooKe ...

  6. Android简易实战教程--第三十七话《NotifiCation》

    通知的使用,无疑是Android系统的亮点之一:就连IOS在5.0开始也引入了类似通知的技巧.可见它的实用性. 今天这个小案例,就学习一下通知的基本使用,API是使用最新的API,4.3以前创建通知的 ...

  7. springMVC源码分析--BeanNameUrlHandlerMapping(七)

    在上一篇博客springMVC源码分析--AbstractDetectingUrlHandlerMapping(五)中我们介绍了AbstractUrlHandlerMapping,其定义了一个抽象函数 ...

  8. JAVA面向对象-----局部内部类

    局部内部类 局部内部类概述:包含在外部类的函数中的内部类称之为局部内部类. 访问:可以在包含局部内部类的方法中直接创建局部内部类的对象调用局部内部类的成员. 注意:局部内部类只能访问所在函数的fana ...

  9. [Python]多个装饰器合并

    django程序,需要写很多api,每个函数都需要几个装饰器,例如 @csrf_exempt @require_POST def foo(request): pass 既然那么多个方法都需要写2个装饰 ...

  10. Android 高级控件(七)——RecyclerView的方方面面

    Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...