差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
digi:arm-embedded:uboot:ccmp-uboot [2024/11/03 14:07] – robin | digi:arm-embedded:uboot:ccmp-uboot [2024/11/05 23:18] (当前版本) – robin | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====CCMP系列的启动分区和流程==== | + | ====CCMP系列的启动流程和U-Boot的修改方法==== |
ARM TrustZone技术和安全启动流程涉及到一些特点,首先分区结构可大致如左图所示: | ARM TrustZone技术和安全启动流程涉及到一些特点,首先分区结构可大致如左图所示: | ||
{{: | {{: | ||
行 14: | 行 14: | ||
3、U-Boot:加载Linux内核和设备树,启动操作系统。 | 3、U-Boot:加载Linux内核和设备树,启动操作系统。 | ||
- | 这个流程确保了系统的每个阶段都是经过验证的,并且能够在TrustZone的保护下安全地执行。 | + | 其中tf-a和op-tee都会包含设备树,这个流程确保了系统的每个阶段都是经过验证的,并且能够在TrustZone的保护下安全地执行。因此,对于U-Boot的修改,最终生成的可刷写的固件是ta-a和op-tee固件,其中op-tee固件中打包有uboot二进制文件。 |
+ | |||
+ | Trusted Firmware ARM (TF-A)是开源项目,它包含有内存的配置,以及平台所用的基础设备树信息,比如锁相环和时钟设备树节点,以及启动所需的接口(内存,闪存,console等)。OP-TEE也是开源项目,它也会包含设备树信息,像电源控制器和管理配置,安全和非安全接口。 | ||
+ | |||
+ | 验证这两个固件主要有什么,可以用binwalk和fiptool,如: | ||
+ | < | ||
+ | binwalk tf-a-ccmp25-dvk-emmc.stm32 | ||
+ | fiptool unpack fip-ccmp25-dvk-optee.bin | ||
+ | </ | ||
+ | 其中解包op-tee镜像出来的得到的nt-fw.bin是uboot不带设备树的文件。 | ||
+ | ====修改内核设备树==== | ||
+ | 内核设备树是从uboot启动进入系统时加载的设备树,它和uboot时的可以不一样。一般地,自定义的板子,linux也要同样改好ccmp25-plc.dts和相关的makefile,然后在local.conf里加上这句: | ||
+ | < | ||
+ | KERNEL_DEVICETREE += " | ||
+ | </ | ||
+ | |||
+ | 在devshell里直接编译 | ||
+ | < | ||
+ | bitbake -c devshell linux-dey | ||
+ | </ | ||
+ | 应用改动,然后make dtbs,编译出本地修改的相关的设备树ccmp25-plc.dtb | ||
+ | =====修改U-Boot 源码===== | ||
+ | 在工作区域修改U-Boot,首先要编译一个,以便拉取源码到工作区域。要清空之前的编译结果: | ||
+ | < | ||
+ | bitbake -c cleansstate tf-a-stm32mp | ||
+ | bitbake -c cleanall tf-a-stm32mp | ||
+ | bitbake -c cleansstate u-boot-dey | ||
+ | bitbake -c cleanall u-boot-dey | ||
+ | </ | ||
+ | 一般不需要对u-boot-dey清除工作,除非源码区乱了。如果清空后,要先用bitbake u-boot-dey编译出一个来。 | ||
+ | 对U-Boot的修改,和内核的修改一样,需要在git目录中,以ccmp25为例,是tmp/ | ||
+ | < | ||
+ | tmp/ | ||
+ | tmp/ | ||
+ | tmp/ | ||
+ | tmp/ | ||
+ | 修改uboot时,上面这些文件需要修改,最好是在目录外新建个git项目,把修改的文件以链接文件的形式链接进来,这样也方便检查是否被覆盖 | ||
+ | </ | ||
+ | 如果不是Arm Trusted Fimware,一般是用bitbake -C compile u-boot-dey,这会生成uboot的二进制和相关的设备树,用bitbake u-boot-dey只会用缓存,所以不要用它,也无需用:bitbake u-boot-dey -f -c do_deploy | ||
+ | , 以下是非安全功能的UBoot编译结果和部署的地方。 | ||
+ | < | ||
+ | |||
+ | 其设备树在:tmp/ | ||
+ | U-Boot在:tmp/ | ||
+ | U-Boot也在:tmp/ | ||
+ | 并且启动脚本也是在tmp/ | ||
+ | </ | ||
+ | 但对于CCMP系列带安全功能支持的核心板来说,UBoot和设备树是被打包在FIP镜像中,事实上,如果深究uboot的配方,会发现deploy阶段,是把设备树和不带设备树的uboot拷到deploy-u-boot-dey/ | ||
+ | < | ||
+ | tmp/ | ||
+ | tmp/ | ||
+ | </ | ||
+ | 如果在内核中使用自己的设备树名,比如ccmp25-plc.dtb,在uboot中大可没必要,其实uboot也有自己的设备树,它放在uboot源码目录下的arch/ | ||
+ | |||
+ | 以在~/ | ||
+ | {{: | ||
+ | |||
+ | 其中,根目录下的是内核的设备树,而uboot的设备树在uboot-dts中,配置文件在uboot/ | ||
+ | < | ||
+ | cd tmp/ | ||
+ | mv configs/ | ||
+ | cp ~/ | ||
+ | mv arch/ | ||
+ | mv arch/ | ||
+ | mv arch/ | ||
+ | ln -s ~/ | ||
+ | cp ~/ | ||
+ | cp ~/ | ||
+ | cp ~/ | ||
+ | 在上面操作中,我们原本用链接文件(即修改版的uboot)替代了,并且ccmp25-dvk.dts也和新增加的ccmp25-plc.dts链接到同一个修改版的uboot所用的设备树。注意,默认的设备树dts和dtsi不可用链接文件,改为cp拷贝进去则可以。 | ||
+ | 复查一下,确保文件正确 | ||
+ | ls -la arch/ | ||
+ | </ | ||
+ | 编译前也可检查一下编译目录下的内容,以便知道更新情况 | ||
+ | < | ||
+ | ls -la ../ | ||
+ | ls -la ../ | ||
+ | ls -la ../ | ||
+ | </ | ||
+ | 注意,此时我们用bitbake -C compile u-boot-dey,会发现原来的build/ | ||
+ | < | ||
+ | cp deploy-u-boot-dey/ | ||
+ | cd ~/temp | ||
+ | dtc -I dtb -O dts -o uboot.dts u-boot-ccmp25-dvk.dtb | ||
+ | cat uboot.dts |grep dummy | ||
+ | </ | ||
+ | 我们在自己修改的uboot的设备树中加入了dummy节点,而这里没有,说明修改版没有应用上。如果不想深究,可以用编译出来的ccmp25-plc.dtb来替代所有的ccmp25-dvk.dtb | ||
+ | < | ||
+ | cp build/ | ||
+ | cp build/ | ||
+ | bitbake tf-a-stm32mp | ||
+ | </ | ||
+ | 再测试一下: | ||
+ | < | ||
+ | cp tmp/ | ||
+ | fiptool unpack ~/ | ||
+ | dtc -I dtb -O dts -o uboot.dts hw-config.bin | ||
+ | </ | ||
+ | |||
+ | 验证无误后,再bitbake core-image-base编译出所有镜像,最后更新 | ||
+ | < | ||
+ | update fip-a tftp fip-ccmp25-dvk-optee.bin | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====修改U-Boot设备树===== | ||
+ | 修改源代码,在添加不同设备树的场景并不适用。并且git目录在bitbake -c cleansstate或cleanall时,都会被清空。因此,直正的修改需要发生在DEY的源码区,也就是sources里。 | ||
+ | |||
+ | 在deyaio目录里,sources下的各个layer是来自git源码项目,在本地它是一个分离头指针。用git log可以查看当前的版本。 | ||
+ | |||
+ | |||
+ |