hifive unmached平台简介
SiFive 的 HiFive Unmatched 是基于 Freedom U740 处理器的最新平台, Freedom U740 是一款高性能多核、64 位双发、超标量架构的 RISC-V 处理器。
参数规格
总介
SOC
4*U74 + 1*S7
内存
16GB DDR4
存储
1.32 MB Quad SPI Boot Flash
2.SD卡槽
3.M.2 M-Key Slot
网络
Gigabit Ethernet Port
其他
4*USB-TypeA
1*USB串口
1*JTAG
PCIE卡槽
M.2 E-Key Slot
软件支持:
Reset vector ROM
位置 : mask ROM 中的 0x1000-0x1020
上电后 所有核心的 pc(每个核心有一个pc寄存器) 位于 0x1004
会根据 MSEL[3:0] 选择 jump 到
1. loops forever waiting for debugger
2. jump to memory-mapped QSPI0 // 0x2000_0000
3. jump to memory-mapped QSPI1 // 0x3000_0000
4. jump to ZSBL
bootrom/ZSBL:
位置 : mask ROM // memory-mapped 0x0000_1000-0x0000_1FFF
会根据 MSEL[3:0] 选择 load 的数据 // 用 QSPI 接口 从 QSPIFlash 和 sdcard
1.根据 MSEL[3:0] 判定即将load的数据(u-boot spl)在哪里
2.load该数据到内存
3.跳转
波特率 89856 8n1
可以用 57600 来解析
如果有错误,就会打印信息, 如Error 0x00000000000000019
如果没错误,不会打印信息
第0阶段引导加载程序(ZSBL)包含在0x1_0000的掩码ROM中。
它负责从GUID分区表下载更复杂的U-Boot SPL。
所有hart都直接从外部时钟输入输入输入ZSBL,预期为26 MHz。
具有mhartid zero的内核配置外围时钟分配器,然后搜索GUID类型为5B193300-FC78-40CD-8002-E86C45580B47的分区。 // mhartid 为 非0 的核心呢 ?
它首先下载GPT头(字节512-604),然后逐块(512字节)顺序扫描分区表,直到找到分区。
然后,将该分区的全部内容U-Boot SPL下载到地址0x0800_0000处的L2 LIM中。
然后执行分支到U-Boot SPL。
u-boot spl :
会根据 MSEL[3:0] 判断 opensbi 在哪里
1.根据 MSEL[3:0] 判定即将load的数据(opensbi)在哪里
2.load该数据到内存
3.跳转
波特率 115200 8n1
U-Boot辅助程序加载程序(SPL)从位于0x0800_0000的L2 LIM执行。
它负责准备从DDR运行的系统。
它执行以下操作:
•配置DDR PLL、PHY和控制器
•将GEM GXL TX PLL设置为125 MHz并重置
•如果有外部PHY,请将其重置
•从GUID类型为2E54B353-1271-4842-806F-E436D6AF69851的分区下载OpenSBI和U-boot和u-boot的设备树dtb 到 0x8000_0000
// U-Boot SPL读取MSEL开关以确定在何处查找该分区
•在OTP上扫描芯片序列号
•将嵌入式DTB复制到DDR,填写U-Boot SPL版本、内存大小和MAC地址
•启用16个L2方式中的15个(这将删除几乎所有L2 LIM内存)
•跳转到DDR内存(0x8000_0000)
opensbi
OpenSBI从位于0x8000_0000的DDR执行,并保持驻留在该位置的内存中。
它负责提供监控二进制接口(SBI)以及模拟芯片本身未实现的任何RISC-V所需指令。
// openSBI 应该跳到了 U-boot
// U-boot 是什么时候 被加载到内存的呢?
// 猜想是 U-boot SPL
// U-Boot SPL then loads and starts the next boot stage, consisting of OpenSBI and U-Boot, from the micro SD card into DRAM.
// U-boot 在哪里 不是 Sifive 规定的
波特率 没有打印,在 linux boot 阶段 打印出来
u-boot
U-Boot管理用于加载Linux内核的硬件。在板级,U-Boot在控制台串行端口上公开命令行接口。
有关U-Boot SiFive使用U-Boot的更多信息,请参阅HiFive Unmatched Software Reference Manual(HiFive Unmatched软件参考手册)。
波特率 115200 8n1
功能支持
- [x] OpenSBI固件
- [x] 内存管理
- [x] 上下文切换
- [x] 定时器时钟
- [x] 原子操作
- [x] 内存屏障
- [x] SMP多核
- [x] MMU支持
- [x] 中断管理
- [x] 系统调用支持
- [x] 执行用户态程序
- [x] 串口输入输出
- [x] 通过单元测试和集成测试
- [ ] gdb调试
移植注意事项
- FU740有5个核,小核为0,大核心为1-4,小核core 0 不能通过SBI启动 (所以启动要从hartid=1开始)。
- MMU的PTE需要加入A和D位才行。启用页表(写satp)之后,程序就没反应了,这是因为FU740对页表项(PTE)中的 A、D位有规定, 它不支持硬件修改A和D,并且一定要把A和D设为1,否则会page fault,这和之前做法把A、D设为0的是不一致的。
- 启动方式可能和标准的启动方式有差异,导致的问题就是hartid和设备树的传递问题,后续可以研究有没有更好的方式来引导,目前是用不上设备树的。
- PLIC的偏移地址也比较奇怪,所以需要注意PLIC的地址和某块内存区域的大小,在MMU映射虚拟地址的时候需要注意。
- 内核的链接地址是0x80200000,U-Boot会跳转进入到改内存地址并执行。
运行方法
命令行
# 1. 进入nxos源码,打开终端。
# 2. 初始化环境
source setup.sh hifive_unmached # linux
setup.bat hifive_unmached # windows
# 3. 为第一次运行做准备,只需要第一次的时候运行
make prepare
# 4. 获取默认配置
make defconfig
# 5. 编译运行
make run -j8 ACTION=poweron # -jN是多线程编译,第一次运行需要使用poweron行为
make run -j8 # 默认是ACTION=reboot行为
# 6. 使用关闭电源web请求关闭开发板
make run -j8 ACTION=poweroff