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】中的文档。
启动地址
启动地址由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,然后跳转到指定的地址。
以从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 |
MiniMonitor能实现一些简单而有限的工作:
- 可以显示并编辑memory的内容
- loading用户程序等,例如用“xls2”命令更新升级下表中的firmware(可以选择将firwware烧写到Serial Flash或HyperFlash)。这些firmware是R-Car H3/M3/M3N基于Yocoto实现的工程例编译后生成的image。
ATF IPL
ATF是Arm Trusted Firmware的简称。 下面是ATF的工作流描述。
在基于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的过程:
-
bl1跳转到bl2执行 在bl1完成了bl2 image加载到RAM中的操作,中断向量表设定以及其他CPU相关设定之后,在bl1_main函数中解析出bl2 image的描述信息,获取入口地址,并设定下一个阶段的cpu上下文,完成之后,调用el3_exit函数实现bl1到bl2的跳转操作,进入到bl2中执行。
-
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中执行。
-
bl31跳转到bl32执行 在bl31中会执行runtime_service_inti操作,该函数会调用注册到EL3中所有service的init函数,其中有一个service就是为TEE服务,该service的init函数会将TEE OS的初始化函数赋值给bl32_init变量,当所有的service执行完init后,在bl31中会调用bl32_init执行的函数来跳转到TEE OS的执行
-
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实现的开源工程。
引用:
- R-Car Hardware Manual, Rev.2.00