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. --save-dev 和 --save的区别

    1. 我们在使用npm install xx --save-dev / --save安装模块或插件的时候,会将他们写入到 package.json 文件,那到底有什么区别呢? --save-dev:会 ...

  2. 从头开始搭建一个VSCode+NetCore的项目

    看这个前,先要对VS开发C#有所了解 获取作案工具 NetCore SDK https://www.microsoft.com/net/learn/get-started/windows 安装 建立工 ...

  3. 匿名函数lambda

    匿名函数的定义 在python中,匿名函数的定义如下: func =lambda x:x+1 #定义匿名函数,x为传参,x+1为返回值,func为函数名 res = func(10) #执行匿名函数 ...

  4. ABP文档笔记 - 规约

    ABP框架 - 规约 简介 规约模式是一个特别的软件设计模式,业务逻辑可以使用boolean逻辑重新链接业务逻辑(维基百科). 实践中的大部分情况,它是为实体或其它业务对象,定义可复用的过滤器. 理解 ...

  5. Jmeter(六)_前置处理器

     BeanShell PreProcessor  使用BeanShell在请求进行之前进行操作.语法使用与BeanShell Sampler是一样的.但可使用的内置变量稍有不同 参考示例 Jmeter ...

  6. “你什么意思”之基于RNN的语义槽填充(Pytorch实现)

    1. 概况 1.1 任务 口语理解(Spoken Language Understanding, SLU)作为语音识别与自然语言处理之间的一个新兴领域,其目的是为了让计算机从用户的讲话中理解他们的意图 ...

  7. 数学API Math.atan() 和Math.atan2() 三角函数复习

    今天在学习贝塞尔曲线看到需要结合三角函数 以及两个不认识的Api :API Math.atan() 和Math.atan2() 先看下三角函数 正切函数图:(180为一个周期 即45=45+180) ...

  8. java开源即时通讯软件服务端openfire源码构建

    java开源即时通讯软件服务端openfire源码构建 本文使用最新的openfire主干代码为例,讲解了如何搭建一个openfire开源开发环境,正在实现自己写java聊天软件: 编译环境搭建 调试 ...

  9. ObjectOutputStream 和 ObjectInputStream的使用

    一.看一下API文档 ObjectOutputStream : ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInp ...

  10. APP中一种在Java层实现的简单守护进程方式

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52779986 守护进程是一个黑色 ...