MyFPGA Forum

 找回密码
 注册
搜索
查看: 7453|回复: 2
打印 上一主题 下一主题

HPS 启动流程--图片登录才能浏览

[复制链接]
跳转到指定楼层
1#
发表于 2014-8-8 10:27:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 matthew_wang 于 2014-8-8 13:29 编辑


先来一篇技术文章,后续还在整理当中
如需转载:请声明转自 myfpga.org---matthew-wang

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设定配置Main PLL 和外设PLL
●  根据BOOTSEL设定配置I/O pin的复用(此处应该只是完成了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-FPGA bridge执行位于 0xC0000000【相对于HPS-to-FPGA bridge偏移地址为0】的momory中的指令。对应着GHRD中on-chip memory的功用,这里大概知道即可。
▲ 从Flash 存储器启动,对应图中矩形框④
▲ 如果在Flash中找不到preloader的话,则会检验FPGA处的回调镜像(callback image)【这个image暂没有见到更多说明和使用】
▲依然不成功就只能坐等被复位了!见图中矩形框 ⑤ 、 ⑥

                           BOOT ROM执行流程
说明:
⑴只有冷启动才会选择从FPGA 引导
⑵不论热启动还是FPGA冷启动,如不成功都会进入到了红色框的QSPI启动中
⑶ 矩形框②中的yes 和 no 由bootsel 决定,矩形框③ 、④中最后具体是使用哪个FLASH存储器也由bootsel 决定
遗留问题:文中提到的 callback image 该如何应用

上文中讲到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-chip RAM 映射至地址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阶段使用HPS configure FPGA
preloader 的具体执行流程有机会会结合preloader code 讲述!
本文参考:
①Altera Booting and Configuration Introduction Document: http://www.altera.com/literature/hb/cyclone-v/cv_5400A.pdf

评分

1

查看全部评分

2#
发表于 2014-8-10 21:19:20 | 只看该作者
我手上有一块de1 SoC的开发板,我想在硬核上面跑ucosii。我在ucos官网找到个cyclone五代板的移植包,用在de1上。但是这个官方包没有FPGA外设的驱动,所以我加入了altera官方例程hwlib里面的api初始化外设,但是下载到硬核调试就出现问题,说写不进去!
commands窗口提示
Stopping running target Altera - Cyclone V SoC (Dual Core) on TCP:localhost on connection
Connected to running target Altera - Cyclone V SoC (Dual Core) on TCP:localhost
Execution stopped at: S:0x00002FA8
source /v "D:\altera\14.0\embedded\ds-5\sw\debugger\configdb\Scripts\altera_target_check.py"
S:0x00002FA8   TST      r1,#4

No SYSID registers could be found. Has a peripheral description file been supplied?

source /v "D:\my_experiment\hwlib\Micrium\Software\EvalBoards\Altera\Cyclone-V-Dev-Kit\GNU\Ex-1\debug-hosted.ds"
+reset system
+stop
WARNING(CMD315): Target is not running
+wait 30s
Target has been reset
Execution stopped due to a breakpoint or watchpoint: S:0x00000000
S:0x00000000   LDR      pc,[pc,#24] ; [0x20] = 0xA8
+set semihosting enabled false
+loadfile "$sdir/u-boot-spl.axf" 0x0
Loaded section .text: S:0xFFFF0000 ~ S:0xFFFF65A7 (size 0x65A8)
Loaded section .rodata: S:0xFFFF65A8 ~ S:0xFFFF80E7 (size 0x1B40)
Loaded section .data: S:0xFFFF80E8 ~ S:0xFFFF8FAF (size 0xEC8)
Loaded section .bss: S:0xFFFF8FB0 ~ S:0xFFFF905F (size 0xB0)
Loaded section .malloc: S:0xFFFF9060 ~ S:0xFFFFA45F (size 0x1400)
Loaded section .stack: S:0xFFFFA460 ~ S:0xFFFFB45F (size 0x1000)
Loaded section .spl_irq_stack: S:0xFFFFB460 ~ S:0xFFFFB867 (size 0x408)
Entry point S:0xFFFF0000
+set semihosting enabled true
Semihosting server socket created at port 8000
+delete
All user breakpoints deleted
+tbreak spl_boot_device
Breakpoint 1 at S:0xFFFF1064
    on file spl.c, line 70
    on file spl.c, line 80
+run
Starting target with image D:\my_experiment\hwlib\Micrium\Software\EvalBoards\Altera\Cyclone-V-Dev-Kit\GNU\Ex-1\u-boot-spl.axf
Running from entry point
+wait
Execution stopped at breakpoint 1: S:0xFFFF1064
In spl.c
S:0xFFFF1064   70,0   {
Deleted temporary breakpoint: 1
+loadfile "$sdir/ucosii.axf" 0x0
Loaded section .text: S:0x00100000 ~ S:0x0010E297 (size 0xE298)
Loaded section .rodata: S:0x0010E298 ~ S:0x0010E717 (size 0x480)
Loaded section .data: S:0x0010E718 ~ S:0x0010EFE7 (size 0x8D0)
Loaded section .bss: S:0x0010EFE8 ~ S:0x00110D0F (size 0x1D28)
Loaded section .eh_frame: S:0x00110D10 ~ S:0x00110D13 (size 0x4)
Entry point S:0x0010B298
+start
Starting target with image D:\my_experiment\hwlib\Micrium\Software\EvalBoards\Altera\Cyclone-V-Dev-Kit\GNU\Ex-1\ucosii.axf
Running from entry point
loadfile "D:\my_experiment\hwlib\Micrium\Software\EvalBoards\Altera\Cyclone-V-Dev-Kit\GNU\Ex-1\ucosii.axf"
ERROR(CMD16-TAD11-NAL33):
! Failed to load "ucosii.axf"
! Failed to write 12 bytes to address N:0x00110D10
! Target is running, cannot access.

cd "D:\my_experiment\hwlib"
Working directory "D:\my_experiment\hwlib"
set debug-from main
start
ERROR(CMD350): Command not possible when running
wait
ERROR(CMD361): Wait for stopped interrupted
quit
ERROR(TAD8-NAL22):
! Unable to run device Cortex-A9_0
! General error on memory or register access.


3#
 楼主| 发表于 2014-11-24 17:35:15 | 只看该作者
linjionghui 发表于 2014-8-10 21:19
我手上有一块de1 SoC的开发板,我想在硬核上面跑ucosii。我在ucos官网找到个cyclone五代板的移植包,用在de ...

license 问题? altera 提供的hwlib 能下载吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-2 00:10 , Processed in 0.042055 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表