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. Mac下安装PEAR

    The following instructions install PEAR and PECL on Mac OS X under/usr/local/. PECL is bundled with ...

  2. 王家林人工智能AI课程大纲和电子书 - 老师微信13928463918

    **3980元团购原价19800元的AI课程,团购请加王家林老师微信13928463918. 基于王家林老师独创的人工智能"项目情景投射"学习法,任何IT人员皆可在无需数学和Pyt ...

  3. CDH集群安装&测试总结

    0.绪论 之前完全没有接触过大数据相关的东西,都是书上啊,媒体上各种吹嘘啊,我对大数据,集群啊,分布式计算等等概念真是高山仰止,充满了仰望之情,觉得这些东西是这样的: 当我搭建的过程中,发现这些东西是 ...

  4. Excel下拉框多列显示,如何只显示一列

    小编最近接手一个项目,之于需要导数据,但是我们需要提前把表头什么的设置好,更方便其他小伙伴们帮助我们导入数据,小伙伴们都知道,在excel中设置下拉菜单很简单,直接用数据有效性-序列就可以实现,今天小 ...

  5. Retrofit2.0+RxJava+Dragger2实现不一样的Android网络架构搭建

    Tamic :csdn http://blog.csdn.net/sk719887916 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框 ...

  6. Python 通过继承实现标准对象的子类

    idict是dict的子类,它的键值和属性是同步的,并且有强大的默认值机制. 例如,假设x是idict的一个实例,且x['a']['b']=12,则有x.a.b=12.反之亦然; 假设'c'不在x的键 ...

  7. 初识Java多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别 ...

  8. activiti bpmnModel使用

    bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套acti ...

  9. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  10. Tomcat内核之Tomcat的类加载器

    跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制.一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web ...