8.7 KiB
参考资料
简介
HiFive Unleashed是U540 Soc的Linux开发平台,是一个多核RISC-V SoC。硬件配置如下:
硬件 | 属性 | 手册对应章节 |
---|---|---|
内存 | 8G DDR4 | 5, 12, 20 |
以太网端口 | 千兆 | 19 |
JTAG接口 | 用于调试 | 23, 34 |
ChipLink | TileLink协议的片外串行化 | 22 |
SD卡槽 | ||
PCIe | FMC + 低速I/O扩展 | |
E51 Core 0 | RV64IMAC,(M,U mode),监控核 | 3 |
U54 Core 1-4 | RV64GC,(M,S,U mode),应用核 | 4 |
L2 cache | 2M | 11 |
中断 | 平台级中断控制器PLIC,计时器中断,软件中断 | 8, 9, 10 |
串口 | uart0, uart1 | 13 |
QSPI 0-3 | 串行外部接口 | 16 |
PWM 0-1 | 脉冲宽度调制器 | 14 |
I2C 0 | 集成电路控制器 | 15 |
GPIO | 通用I/O引脚 | 17 |
OTP | 一次可编程存储器 | 18 |
需要:开发板,USB线,电源适配器,可选配网线或FMC扩展卡
时钟和复位(手册第7章)
时钟和复位是通过电源复位时钟中断(PRCI)架构来管理的。
启动过程(手册第6章)
FU540-C000支持从多种源来启动,这是通过模式选择(MSEL[3:0])引脚来实现的。而3个QSPI接口则控制从哪里下载media(SPI flash或SD卡)。
MSEL | FSBL的位置 | BBL的位置 | 作用 |
---|---|---|---|
0000 | - | - | 无限循环等待调试 |
0001 | - | - | 跳至0x2000_0000(内存映射OSPI0) |
0010 | - | - | 跳至0x3000_0000(内存映射OSPI1) |
0011 | - | - | 跳至0x4000_0000(未缓存的ChipLink) |
0100 | - | - | 跳至0x6000_0000(缓存的ChipLink) |
0101 | QSPI0 x1 flash | QSPI0 x1 flash | - |
0110 | QSPI0 x4 flash | QSPI0 x4 flash | 从flash 获取镜像 |
0111 | QSPI1 x4 flash | QSPI1 x4 flash | - |
1000 | QSPI1 x1 SD | QSPI1 x1 SD | - |
1001 | QSPI2 x1 flash | QSPI2 x1 flash | - |
1010 | QSPI0 x4 flash | QSPI1 x1 SD | - |
1011 | QSPI2 x1 SD | QSPI2 x1 SD | 从SD卡获取镜像 |
1100 | QSPI1 x1 flash | QSPI2 x1 SD | - |
1101 | QSPI1 x4 flash | QSPI2 x1 SD | - |
1110 | QSPI0 x1 flash | QSPI2 x1 SD | - |
1111 | QSPI0 x4 flash | QSPI2 x1 SD | 默认启动模式 |
1. 复位向量
一加电,所有的核都跳到ROM 0x1004处执行,ROM中的内容如下:
0x1000 MSEL的值
0x1004 auipc t0, 0 # t0保存了当前指令的地址,即0x1004
0x1008 lw t1, -4(t0) # t1保存的内存0x1000的值,即MSEL的值
0x100c slli t1, t1, 0x3 # t1 = t1 << 3,即8*t1
0x1010 add t0, t0, t1 # t0 += t1
0x1014 lw t0, 252(t0) # t0保存的内存地址0x1000+0x100+8*MSEL处的值
0x1018 jr t0 # 实际上最终跳转的位置由MSEL的值决定
当MSEL>4的时候,均是跳转到ROM 0x1_0000处执行,即ZSBL。
2. ZSBL
ZSBL是零阶段的引导程序,它负责从GPT下载FSBL。编号为0的核首先配置时钟分频器,然后寻找GUID为5B193300-FC78-40CD-8002-E86C45580B47
的分区。它首先下载GPT头(位置在512字节~604字节),然后依次扫描分区表直到找到分区,接下来将该分区的内容(即FSBL)下载到内存0x0800_0000处,最后跳转到该地址执行。
ZSBL是通过MSEL的值来决定FSBL所在的分区的。
3. FSBL
FSBL是第一阶段的引导,它负责将内核载入内存。
- 通过配置和运行片上PLL将频率提升至1GHz。
- 配置DDR PLL,以太网PHY和控制器。
- 设置GEM,GXL,TX,PLL为125MHz并重置之。
- 如果有外部PHY,重置之。
- 从GUID号为
2E54B353-1271-4842-806F-E436D6AF69851
的分区下载BBL。 - Scan OTP for the chip serial number
- 将DTB复制到内存
- 跳转到
0x8000_0000
FSBL通过MSEL的值来寻找BBL所在的分区。
4. BBL
BBL在0x8000_0000
,它提供SBI并模拟RISC-V指令。Linux在0xffff_ffe0_0000_0000
处。
5. 启动方法
- Flash Bit-Banged x1
- Flash 内存映射x1
- Flash 内存映射x4
- SD卡Bit-Banged x1
软件开发流程
-
安装需要的包
sudo apt-get install autoconf automake autotools-dev bc bison \ build-essential curl flex gawk gdisk git gperf libgmp-dev \ libmpc-dev libmpfr-dev libncurses-dev libssl-dev libtool \ patchutils python screen texinfo unzip zlib1g-dev
-
安装free-u-sdk
git clone https://github.com/sifive/freedom-u-sdk.git cd freedom-u-sdk git submodule update --init --recursive unset RISCV make
编译时问题解决:
-
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE (\[^ \t=:+{}]+)}/ at /data/szx/Code/freedom-u-sdk/work/buildroot_initramfs/host/usr/bin/automake line 3936.
以上问题的解决方法:给大括号转义,变成如下形式
\{
-
./../misc/create_inode.c:395:18: error: conflicting types for ‘copy_file_range’
以上问题的解决方法:这是由于自定义函数和库函数重名了,解决方法就是给自定义函数换个名字。首先,通过grep命令找到所有定义和使用了copy_file_range函数的地方,然后把所有的copy_file_range函数更名为copy_file_chunk。2个文件共计8处需要修改。
编译完毕,显示如下信息:
This image has been generated for an ISA of rv64imafdc and an ABI of lp64d Find the image in work/bbl.bin, which should be written to a boot partition
To completely erase, reformat, and program a disk sdX, run: sudo make DISK=/dev/sdX format-boot-loader ... you will need gdisk and e2fsprogs installed
-
-
把镜像复制到SD卡
sudo umount /dev/exb # 假设SD卡名叫exb,先要从文件系统中卸载掉 sudo gdisk /dev/exb # 为exb创建GPT # p打印分区信息,d删除分区,o清除所有分区数据,w写数据(即将更改作用于设备) sudo make DISK=/dev/exb format-boot-loader # 将系统写入SD卡
写卡时的问题与修复:
- 写低速SD卡有可能会失败,多重复几次即可成功。
-
在开发板上运行镜像
- 拔电源,关开关。(关开关并不能代替拔电源。)
- 确保风扇已连接。
- 将DIP开关拔到左边(左边为1,右边为0),使MSEL处于1111模式。这是默认的启动模式。
- 插入安装了BBL+Linux的SD卡。
- 连接网线和USB线。
- 插上电源,风扇开始转动。
- 打开开关,30秒后LED灯开始闪烁。
有两种方式连到开发板,ssh和串口。串口慢且不能接收文件,应尽量选择ssh方式。
-
ssh连接
电源开启后,默认的freedom-u-sdk镜像会通过DHCP获取IP地址,并开启ssh服务。
ssh root@ip地址
登陆,密码:sifive -
USB连接
sudo screen /dev/ttyUSB1 115200
用户名:root,密码:sifive
-
在qemu中运行镜像
make qemu
编译时问题的解决:
-
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at /data/szx/Code/freedom-u-sdk/work/buildroot_rootfs/host/usr/bin/automake line 3936.
以上问题的解决方法依然是给大括号转义。
-
./../misc/create_inode.c:395:18: error: conflicting types for ‘copy_file_range’
以上问题的解决方法依然是给本地函数重命名。
-
连接器引脚分配
FMC
FPGA Mezzanine Card