【转】HPS典型的启动流程与BOOT ROM执行流程的应用笔记
[复制链接]
HPS典型的启动流程与BOOT ROM执行流程的应用笔记 HPS作为一个SoC器件,所有执行程序都要遵循严格的启动流程,本文针对对于HPS的启动引导流程不曾关注过或者不是十分清楚的开发人员。 HPS的启动是多阶段的流程,每一个阶段都会完成自己相应的工作并把下一阶段的执行代码引导起来。下图展示了一个典型的HPS的启动流程 HPS 典型的启动流程 系统复位(上电或者硬件复位)之后,HPS内部boot Rom开始在CPU0上执行(通过指定复位向量指定BOOT ROM区域实现自动执行BOOT ROM),完成工作并引导用户程序,当然用户程序的构架会因为具体引用有所差别!
此处先介绍Boot ROM! 总的来说,Boot ROM是HPS内核的一段ROM上固化的可执行程序,完成的工作是系统复位以后,执行引导preloader并把CPU使用权交给preloader 的过程!特殊情况是不需要执行preloader而直接引导应用程序,这种情况是可能的,比如DS-5中baremental HelloWorld程序,但是这种情况并没有实际运用意义:其一是限制了程序大小,容量受片上RAM限制;其二是运用程序基本只能够使用到MPU内部的寄存器,外设没有被初始化(没有相应的时钟)。所以更多的应用是Boot ROM通过引导preloader把CPU使用权交给preloader进行后续的引导工作。
BOOT ROM除了引导用户软件外还完成的具体工作有:
● 使能指令缓存, branch predictor,浮点单元,NEON 向量单元[在ARM内部做过图形加速的可能比较熟悉]
● 设定看门狗0定时器,BOOT ROM保留适用,参考文档 page A-11
● 根据CLKSEL设定配置MainPLL 和外设PLL
● 根据BOOTSEL设定配置I/Opin的复用(此处应该只是完成了QSPI or SPI Flash or SDMMC controller 的pin的复用,更多的pin的复用需要根据preloader才能够完成设定)
● 初始化FLASH Controller 到默认设置
BOOT ROM 引导的preloader来源分为三类:
▲片上RAM热启动,对应下图中的矩形框①
如果之前执行过一次preloader了,preloader会留在On-chip RAM 中,按下WARM reset 后,会首先选择从on-chip ARAM 启动,此过程具有最高优先权,但是从on-chip ARAM 启动时会对遗留的preloader代码进行CRC校验(具体是否校验用户可以通过warmramgrp配置决定),校验成功才会执行。防止了用户对ON-chip 里的内容进行更改!如校验失败,会选择从Flash中启动preloader,对应图中矩形框 ③
▲从FPGA部分冷启动,对应下图中的矩形框②
具有第二优先权,如果用户设定了bootsel从FPGA启动,则会等待FPGA配置成功[通过FPGA manager获取FPGA的状态]!HPS会通过 HPS-to-FPGAbridge执行位于 0xC0000000【相对于HPS-to-FPGAbridge偏移地址为0】的momory中的指令。对应着GHRD中on-chip memory的功用,这里大概知道即可。
▲ 从Flash 存储器启动,对应图中矩形框④
▲ 如果在Flash中找不到preloader的话,则会检验FPGA处的回调镜像(callback image)【这个image暂没有见到更多说明和使用】
▲依然不成功就只能坐等被复位了!见图中矩形框 ⑤ 、 ⑥
BOOT ROM执行流程 说明:
⑴只有冷启动才会选择从FPGA 引导
⑵不论热启动还是FPGA冷启动,如不成功都会进入到了红色框的QSPI启动中
⑶ 矩形框②中的yes 和 no 由bootsel 决定,矩形框③、④中最后具体是使用哪个FLASH存储器也由bootsel管脚决定。
上文中讲到BOOT ROM在HPS启动过程中的左右以及搜寻preloader的工程,接下来介绍preloader的相关理论知识。后面会介绍如何生成preloader,并讲述如何在从SD 卡启动的时候更新preloader。 preloader的命名是相对于BOOTLoader的!其作用类似于PC主板上的BIOS。BIOS基本上是系统启动启动 之前控制着板上的硬件设备,引导系统启动程序。preloader在HPS系统中完成功能主要包括了系统时钟配置,所有pin脚的复用配置,存储器的初始 化以及引导下一步用户软件!下一步用户软件可以直接是用户的baremental 程序,也可以不需要bootloader的系统程序,如ucos,或者是操作系统的引导程序,如u-boot。 此处列出HPS启动过程中三大典型用户软件构架:
①preloader+baremental code
②preloader+无bootloader的操作系统(如ucos)+用户定义软件
③preloader+bootloader code(如u-boot)+操作系统(如linux)+用户定义软件
preloader从BOOT ROM中接手CPU的时候CPU的状态列表(可能对于进行汇编开发或者AMP构架开发的用户有用):
(以下仅适用于CPU0从FLASH memory 启动的状态)
● 指令缓存使能
● Branch predictor 使能
● 数据缓存使能
● MMU 没有被使能
● 浮点单元使能
● NEON 向量单元使能
● ARM处理处于secure supervisor状态
ARM Cortex-A9 MPCore 的寄存器的值:
● r0—共享内存的地址指针, 共享内存用于在BOOTROM和preloader直接传递数据.共享内存位于on-chip RAM的高4K地址.
具体内容参考文档page A-8。
● r1—共享内存的大小.
● r2—复位值0x0.
● r3—保留.
其他寄存器的状态无定义。
如果CPU0从FPGA BOOT或者CPU1参与了boot,以上描述皆不适用!
另外,prelaoder接手CPU的时候,还有下面两个状态:
● boot ROM 被映射在地址0x0。需要重新映射on-chip RAM 使得异常可以被preloader执行。
● L4 看门狗0定时器处于激活状态并已触发。preloader可以任意处理此定时器。
preloader具体完成的工具包含了下面部分:
■ 初始化SDRAM接口.
■ 配置 remap 寄存器,把ton-chipRAM 映射至地址0x0,异常会被preloader处理.
■ on-chip RAM 可以被读写,初始地址从0x0对齐.
■ 通过scan manager配置HPS I/O.
■ 通过system manager配置pin 复用.
■ 通过clock manager配置HPS clocks .
■ 初始化包含了下一阶段启动代码的flash控制器(NAND, SD/MMC, or quad SPI).
■ 把下一阶段启动或者叫用户代码引导入SDRAM并把控制权交至下一段代码.
●用户可以在preloader阶段使用HPSconfigure FPGA
preloader 的具体执行流程有机会会结合preloader code 讲述!
本文参考:
|