前言:PTG4.1 之前的版本使用的都是普通 emmc 和 一级分区表,PTG4.3 新增了 virtio-eMMC 功能和二级分区表的设置,因此关于 PTG4.3 的烧录和升级有以下几个疑问和解答。
一、名词解释
virtio-eMMC:基于 Virtio 框架的虚拟化 EMMC
域:有四个域,security、safety、AP1、AP2
一级分区表:PTG4.1 之前使用的分区表形式,emmc_only 情况下只有 1 个一级分区表 global.bpt,四个域对应的分区都在这个分区表里并处于同级。
二级分区表:PTG4.3 中,emmc_only 情况下有 1 个一级分区表 global.bpt,global.bpt 里包含了 security 域对应的分区,和 safety、AP1、AP2 三个域的分区表。 这三个分区表为二级分区表,存放着各自域对应的分区。
二、添加分区后烧录失败
【问题描述】:
添加分区后线刷失败 EMMC1 SAFETY PARTITION Failed: remote: 0009:partition flash error - partition
【分析和解决方式】:
分析 log 发现 Invalid last_usable_lba 报错,二级分区表 (safety) 的 last usable lba 不一致,怀疑是 bpt 的分区或 disk_size 大小出错。
① 检查各个二级分区表的 disk_size 加起来是否符合一级分区表的总大小
② 检查所有分区加起来大小是否超过了 emmc 的实际大小
③ 前面两点没问题后,确认修改分区后是否有重新编译其他固件。如果没有重新编译而是直接打包,会出现烧录成功但是启动失败的现象,因此修改分区表后需要执行 make build_all 或者 make lk + make baremetal + make freertos
完成前面三步后,成功烧录启动
三、其他问题及解释
1、PTG4.3 上 Android 端只能看到 AP1 的分区,OTA U 盘升级程序运行于 AP1,怎么升级 AP2、Safety 的分区?
AP1 的 OTA 库可以通过核间通信和共享内存方式,升级带有 update monitor 的 Safety 和 Security 分区。AP2 不带有 update monitor,需要单独升级。
2、 PTG4.3 用二级分区表,是否每个域只能访问对应的分区表中的分区?
根据《Semidrive 9 系列 BOOT 与升级指南》文档说明:
一级分区为二级分区的上级,被 virt-eMMC 的后端使用,因此后端可以看到整个分区表范围并且可以操作 eMMC 整个区域;
二级分区表节点分别被 safety、AP1 和 AP2 域的前端使用,因此 safety、AP1 和 AP2 域仅可以访问对应二级分区表的分区。
后端位于 security 域的 ssystem 中,在 Safety、AP1 和 AP2 域都实现了前端访问接口
因此,Safety、AP1、AP2 能直接访问对应的分区,通过核间通信/共享内存访问其他域的分区。Security 的 ssystem 可以访问 eMMC 整个区域。
3、启动时 SPL 要读取本地配置数据,这个数据放在哪个分区表比较合适?
SPL(DIL) 运行于 Security domain,在 emmc 虚拟化之前执行,可以访问整个 emmc。虚拟化之后,ssystem 也可以访问整个 emmc,因此放到哪里应该都可以。一级分区表中的镜像都运行于 Security,因此放 global.bpt 里合适。
总结:以上是关于各个域和对应分区表的访问权限和访问方式的一些问题和解答
参考文档:
《SemiDrive_9_Series_Boot与升级指南_V01.03.pdf》
《Semidrive_9系列Emmc_虚拟化应用指南_Rev1.0.pdf》
欢迎登录大大通,阅读原文,浏览更多该原厂系列技术内容!