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调试

移植注意事项

  1. FU740有5个核,小核为0,大核心为1-4,小核core 0 不能通过SBI启动 (所以启动要从hartid=1开始)。
  2. MMU的PTE需要加入A和D位才行。启用页表(写satp)之后,程序就没反应了,这是因为FU740对页表项(PTE)中的 A、D位有规定, 它不支持硬件修改A和D,并且一定要把A和D设为1,否则会page fault,这和之前做法把A、D设为0的是不一致的。
  3. 启动方式可能和标准的启动方式有差异,导致的问题就是hartid和设备树的传递问题,后续可以研究有没有更好的方式来引导,目前是用不上设备树的。
  4. PLIC的偏移地址也比较奇怪,所以需要注意PLIC的地址和某块内存区域的大小,在MMU映射虚拟地址的时候需要注意。
  5. 内核的链接地址是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

results matching ""

    No results matching ""