目录
本文目的在于介绍高通平台 dtb 和 overlay dtbo 在开机过程中的匹配检测及 merge、在编译过程中各子系统 dts、dtsi 怎样合成、生成对应dtb和dtbo。
1.开机过程中 dtb 和 dtbo 的处理
开机启动时高通平台通过BootLinux()调用DTBImgCheckAndAppendDT函数完成对 dtb 和 dtbo 的一些列处理工作。如下图:

- GetSocDtb 负责完成main dtb与平台匹配的检测工作,返回指向与平台匹配成功的dtb。main dtb 由 main dts 和各子系统的 dts 经合成、编译后生成,高通平台 main dtb 通常包含多个套片的 dtb;Android系统main dtb在编译时被打包到vendor_boot image中,故在debug时通过解包vendor_boot image来获取版本对应的main dtb。
- GetBoardDtb 负责完成overlay dtb与平台匹配的检测工作,返回指向与平台匹配成功的dtbo。overlay dtb 是由 项目overlay dts 与 各子系统的 overlay dts 经合成、编译后生成,同main dtb一样overlay dtb通过也包含多个套片的dtb;Andorid系统 oveylay dtb 在编译时会被打到 dtbo image 中,故通过解包dtbo image 可以获取overlay dtb。
- GetHypDtbo 当支持Hypervisor dtbo时会执行此操作,从hyper子系统获取hyper dtbo。
- GetOverdDtbo 非user版本时支持此操作,获取user_dtbo。
- AppendToDtList 负责将匹配成功的dtbo(boart dtbo、Hypervisor dtbo、OverdDtbo)添加到到DtsList链表。
-
ApplyOverlay 通过ufdt_apply_mutil_overlayj将Soc dtb(匹配成功的main dtb数据)与 Dtslist链表中的dtbo进行overlay,即负责运行的main dtb 与 dtbo的overlay。
2.开机匹配的重点函数逻辑
2.1 GetSocDtb
函数处理流程:
- 逐个遍历dtb中所有的 main dtb
- 通过ReadDtbFindMatch函数将main dtb与项目平台中的plaform、board、pmic、OEMVarientId进行比对,获取每个main dtb的匹配得分
- SOC_MATCH匹配情况下,得分最高的main dtb即为最匹配的dtb并返回。
特殊点:
该函数指定的必须匹配内容为SOC_MATCH,即mian dtb中的ChipID与当前的与主板套片的ChipID必须一致
如果最终获取的匹配得分和ALL_BITS_SET设定的得分一致,则认为此main dtb包含项目需要的所有devicetree数据,则会跳过后续的overlay dtb的匹配检测。高通平台通常设计中会将平台的devicetree设置与项目的devicetree设置进行分离,mian dtb中更多的平台相关的devicetree数据、而项目devicetree数据则更对在overlay dtb中。所以通常情况下在执行完GetSocDtb函数后都会进入GetBoardDtb函数。
2.2 GetBoardDtb
函数处理流程:
- 逐个遍历dtbo image中所有的 overlay dtb
- 通过ReadDtbFindMatch函数将overlay dtb与项目平台中的plaform、board、pmic、OEMVarientId进行比对,获取每个main dtb的匹配得分
- VARIANT_MATCH匹配情况下,得分最高的ovarlay dtb即为最匹配的dtb并返回。
特殊点:
因指定VARIANT_MATCH必匹配项,故ovrelay dtbo中的DtVariantId必须与项目的平台一致
2.3 ReadDtbFindMatch

ReadDtbFindMatch是进行 main dtb(GetSocDtb) 和 overlay dtbo (GetBoardDtb)与平台匹配判断的核心函数,从main dtb 与 overlay dtbo中找到最佳的dtb 和dtbo, 其内部框图如上图。
函数处理流程:
匹配判断,分为四个逻辑依次执行:
- GetPlatfromMatchDtb 将dtb/dtbo中的chipid、soc_rev、foundryid、packageid、skuid与项目平台的各项对应参数进行比对,若相同则该项得分。其中必匹配项:chipid,有条件必匹配项:foundryid(dtb\dtbo中有配置foundryid)、skuid(项目平台有配置skuid)、packageid(dtb\dtbo中有配置packageid)。必匹配项和有条件必匹配项在条件成立时,必须匹配成功,如果失败则进行dtb/dtbo中其他chipid、soc_rev、foundryid、packageid、skuid判断或进行其他dtb/dtbo的匹配判断。
- GetBoardMatchDtb 将dtb/dtbo中的variantid、variantmajor、variantminor、platfrom_subtype与项目平台中的各项参数进行比对,若相同则该项目得分。其有条件匹配项为:variantid(dtb/dtbo中存在variantid)、platfrom_subtype(dtb/dtbo中存在platfrom_subtype),同样条件成立时其必须匹配。
- ReadBestPmicMatch 将dtb/dtbo中的pmicrev、pmicmodel与项目平台的各项参数进行比对,若相同则该项目得分。
- MatchOEMVariantId 将dtb/dtbo中的 oemveriantId 与项目平台的参数进行比对,若相同则该项目得分。
得分处理:
- 在指定精准匹配成功成立时,获取最高得分(平台为每项匹配设置独立的分值)的dtb\dtbo进行后续的overlay处理。
- 精准匹配成功时,历史(已遍历的main dtb/overlay dtbo)最高best与本次匹配得分比较:
< , 将本次赋值给best
> , best保持
= ,如图逐项进行比较,若本次项大于best对应项、则将本次的赋值给best。
否则,认为匹配失败。
2.4 ApplyOverlay
该函数会将选取的匹配成功的main dtb 和 overlay dtbo进行overlay。如果该函数执行报错,则意味着overley时出现语法错误。对应该类错误debug方法,可参考
3.开机过程匹配时的数据
用于比对数据分别为:dtb、dtbo中解析的平台相关数据(红框)和 来自平台的数据(紫色),如chipid、foundry id、pmic id、ddr type


91

被折叠的 条评论
为什么被折叠?



