tyron's page 不断探索是一件好事,学无止境!

R-Car 启动(boot)过程分析

2019-09-23
David

R-Car系列是Renesas公司的SOC,功能很强大。

从以下几个方面描述:

  • 硬件准备
  • 启动流程
  • 启动地址
  • 启动
  • ATF IPL
  • Yocto

硬件准备

R-Car boards是必须的,参考这里

以下跳线指的是开发板(slavator-X(S)board)上的跳线。

  • 选择主启动器
跳线MD[7:6] 描述
B’00 从CA57启动
B’01 从CA53启动
B’10 -
B’11 从CR7启动
  • 选择启动状态
跳线MD[15] 描述
B’0 AArch32
B’1 AArch64
  • 选择启动模式
跳线MD[4:1] 描述
B’0000 从外部ROM启动
B’0001 -
B’0010 从HyperFlash ROM启动(160MHz),使用DMA
B’0011 从HyperFlash ROM启动(80MHz),使用DMA
B’0100 从Serial Flash ROM启动(40MHz),使用DMA
B’0101 从eMMC启动(25MHzx1总线宽度),使用DMA
B’0110 -
B’0111 -
B’1000 -
B’1001 -
B’1010 从HyperFlash ROM启动(160MHz),使用XIP模式
B’1011 从HyperFlash ROM启动(80MHz),使用XIP模式
B’1100 -
B’1101 从eMMC启动(50MHzx8总线宽度),使用DMA
B’1110 -
B’1111 SCIF download模式

启动流程

有关CA57/CA53/CR7的启动流程,请参考【引用1】中的文档。

CA57/CA53 boot

CR7 boot

启动地址

启动地址由reset模块来决定。 如果Cortex-A57以AArch64启动,启动地址由MD15,MD[7:6],RESET.CA57CPU0BARH/L寄存器决定。

如果Cortex-A57以AArch32启动并选择片上ROM启动,启动地址由RESET.CA57CPU0BARH/L寄存器决定。

如果Cortex-R7并选择片上ROM启动,启动地址由RESET.CR7BAR寄存器决定。

启动

从HyperFlash/Serial Flash ROM/eMMC启动, 主启动处理器跳转到H’EB100000(AArch32)或H’EB10C000(AArch64),执行boot ROM中的指令,并用SYS-DMAC CH0将5KB或7KB(eMMC)数据copy到内部RAM。

有关启动参数的描述,请参考【引用1】中的文档。

启动参数

这5KB或7KB(eMMC)数据包含Boot ROM参数(4bytes,存储在Serial Flash的H’0地址),IPL-A & B的地址信息及size信息。Boot ROM参数可以选择IPL-A还是IPL-B。 根据Boot ROM参数中指定的size,将IPL copy到RAM,传输完毕后,跳转到指定的IPL地址。详细描述,请参考【引用1】中的文档。

然后,再将IPL(Initial Program Loader) copy到内部RAM,然后跳转到指定的地址。

启动执行过程

memory map分配

以从serial flash启动为例。

SW 设置 描述
SW10[5:8] B’0100 从serial flash ROM启动(40MHz)启动,使用DMA
SW1 All ON 使用serial flash ROM
SW2 All ON 使用serial flash ROM
SW3 OFF 使用serial flash ROM

启动成功Sample Loader和MiniMonitor

MiniMonitor能实现一些简单而有限的工作:

  • 可以显示并编辑memory的内容
  • loading用户程序等,例如用“xls2”命令更新升级下表中的firmware(可以选择将firwware烧写到Serial Flash或HyperFlash)。这些firmware是R-Car H3/M3/M3N基于Yocoto实现的工程例编译后生成的image。

flash table

ATF IPL

ATF是Arm Trusted Firmware的简称。 下面是ATF的工作流描述。

ATF IPL

在基于Yocto的R-Car工程中,u-boot对应这里的bl33。

ATF将系统启动从最底层进行了完整的统一划分,将secure monitor的功能放到了bl31中进行,这样当系统完全启动之后,在CA或者TEE OS中触发了smc或者是其他的中断之后,首先是遍历注册到bl31中的对应的service来判定具体的handle,这样可以对系统所有的关键smc或者是中断操作做统一的管理和分配。ATF的code boot整个启动过程参考上图。

在上述启动过程中,每个Image跳转到下一个image的方式各不相同,下面将列出启动过程中每个image跳转到下一个image的过程:

  1. bl1跳转到bl2执行 在bl1完成了bl2 image加载到RAM中的操作,中断向量表设定以及其他CPU相关设定之后,在bl1_main函数中解析出bl2 image的描述信息,获取入口地址,并设定下一个阶段的cpu上下文,完成之后,调用el3_exit函数实现bl1到bl2的跳转操作,进入到bl2中执行。

  2. bl2跳转到bl31执行 在bl2中将会加载bl31, bl32, bl33的image到对应权限的RAM中,并将该三个image的描述信息组成一个链表保存起来,以备bl31启动bl32和bl33使用。在AACH64中,bl31为EL3 runtime software,运行时的主要功能是管理smc指令的处理和中断的主力,运行在secure monitor状态中bl32一般为TEE OS image,本章节以OP-TEE为例进行说明 bl33为非安全image,例如uboot, linux kernel等,当前该部分为bootloader部分的image,再由bootloader来启动linux kernel.从bl2跳转到bl31是通过带入bl31的entry point info调用smc指令触发在bl1中设定的smc异常来通过cpu将全向交给bl31并跳转到bl31中执行。

  3. bl31跳转到bl32执行 在bl31中会执行runtime_service_inti操作,该函数会调用注册到EL3中所有service的init函数,其中有一个service就是为TEE服务,该service的init函数会将TEE OS的初始化函数赋值给bl32_init变量,当所有的service执行完init后,在bl31中会调用bl32_init执行的函数来跳转到TEE OS的执行

  4. bl31跳转到bl33执行 当TEE_OS image启动完成之后会触发一个ID为TEESMC_OPTEED_RETURN_ENTRY_DONE的smc调用来告知EL3 TEE OS image已经完成了初始化,然后将CPU的状态恢复到bl31_init的位置继续执行。bl31通过遍历在bl2中记录的image链表来找到需要执行的bl33的image。然后通过获取到bl33 image的镜像信息,设定下一个阶段的CPU上下文,退出el3然后进入到bl33 image的执行。

Yocto

目前,有R-Car H3/M3/M3N有基于Yocoto实现的开源工程

Yocto: How do I?

引用:

  1. R-Car Hardware Manual, Rev.2.00

Comments

Content