拿到昉·星光RISC-V单板计算机后,我们可以从官方直接下载对应的镜像文件,进行烧录。但是我们往往想稍微挑战一下,从头开始构建系统。
零、学习参考网址:
一、需构建部分说明:
通过《昉·星光单板计算机快速入门指南 》,我们可以了解到,需要进行如下部分的构建:
赛昉科技 固件:
Boot_recovery:用于恢复 SPI flash 的二进制文件
secondboot:第一阶段 bootloader
ddrinit:第一阶段 ddrinit
Bootloader:u-boot,通用Bootloader
OpenBSI:RISC-V SBI
Kernel:Linux内核
Fedora:Fedora33
下面,我们就一步一步,来进行每个部分的构建。
二、编译环境基础系统准备:
为了顺利构建上面的各个部分,我们需要在Ubuntu操作系统下进行各项操作。
官方推荐的是Ubuntu 18.04 LTS。虽然Canonical官方把Ubuntu 18.04 LTS的支持结束日期从2023年5月延长到2028年5月,但我选择的是主流的版本的Ubuntu 20.04 LTS。
你可以在电脑上安装Ubuntu 20.04 LTS,或者在虚拟机里面安装Ubuntu 20.04 LTS(Vmware或者VirtualBox等);如果你熟悉WSL2,那么也可以在WSL2中运行Ubuntu 20.04 LTS。
我使用的是运行Docker中的Ubuntu 20.04 LTS,可以在10秒钟之内启动Ubuntu 20.04 LTS基础环境。
% docker run -it --name ubuntu ubuntu /bin/bash
进入Ubuntu 20.04 LTS基础环境后,我们需要安装下面的基础组件:
% apt update
% apt install -y sudo
% sudo apt update
% sudo apt upgrade
% sudo apt install -y wget
% sudo apt install -y git git-lfs subversion
% sudo apt install -y vim
% sudo apt install -y make gcc
% sudo apt install -y bison flex
% sudo apt install -y gcc-riscv64-linux-gnu
% sudo apt install -y libssl-dev pkg-config libncurses-dev
sudo dpkg-reconfigure dash
% ssh-keygen -t rsa
三、跨平台预编译环境准备:
进入Ubuntu 20.04 LTS基础环境后,我们需要首先安装跨平台预编译环境,官方提供了对应文件的下载地址:
https://github.com/sifive/freedom-tools/releases/tag/v2020.12.0
从以上地址,下载如下三个压缩包:
riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
riscv-openocd-0.10.0-2020.12.1-x86_64-linux-ubuntu14.tar.gz
sdk-utilities-1.0.1-2020.12.1-x86_64-linux-ubuntu14.tar.gz
具体操作如下:
% mkdir ~/VisionFive/freedom-tools
% cd ~/VisionFive/freedom-tools
% wget https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
% wget https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv-openocd-0.10.0-2020.12.1-x86_64-linux-ubuntu14.tar.gz
% wget https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/sdk-utilities-1.0.1-2020.12.1-x86_64-linux-ubuntu14.tar.gz
下载完成后,我们需要解压,并设置对应的PATH,以备被后续操作调用:
% tar xzvf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
% tar xzvf riscv-openocd-0.10.0-2020.12.1-x86_64-linux-ubuntu14.tar.gz
% tar xzvf sdk-utilities-1.0.1-2020.12.1-x86_64-linux-ubuntu14.tar.gz
% echo "$(pwd) /riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin:$(pwd) :riscv-openocd-0.10.0-2020.12.1-x86_64-linux-ubuntu14/bin:$(pwd) /sdk-utilities-1.0.1-2020.12.1-x86_64-linux-ubuntu14/bin"
% export PATH=/root/VisionFive/freedom-tools/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin:/root/VisionFive/freedom-tools:riscv-openocd-0.10.0-2020.12.1-x86_64-linux-ubuntu14/bin:/root/VisionFive/freedom-tools/sdk-utilities-1.0.1-2020.12.1-x86_64-linux-ubuntu14/bin:$PATH
% riscv64-unknown-elf-gcc -v
...
gcc version 10.2.0 (SiFive GCC-Metal 10.2.0-2020.12.8)
riscv64-unknown-elf-gcc能够成功运行,说明跨平台预编译设置正确,可以开始后续的操作了。
四、Boot_recovery编译:
代码网址:starfive-tech/bootloader_recovery (github.com)
% cd ~/VisionFive
% git clone git@github.com:starfive-tech/bootloader_recovery.git
% cd bootloader_recovery
% make
...
Finished building target: debug/jh7100_recovery_boot.elf
显示以上最后一条信息,表示编译成功,debug/jh7100_recovery_boot.bin即为编译得到的Boot_recovery文件
五、secondboot编译:
代码网址:starfive-tech/JH7100_secondBoot (github.com)
% cd ~/VisionFive
% git clone https://github.com/starfive-tech/JH7100_secondBoot.git
% cd JH7100_secondBoot/build
% make
...
riscv64-unknown-elf-objdump -S bootloader-JH7100-220515.elf > bootloader-JH7100-220515.asm
显示以上最后一条信息,表示编译成功,bootloader-JH7100-220515.bin.out即为编译得到的secondboot文件。
六、ddrinit编译:
代码网址:starfive-tech/JH7100_ddrinit (github.com)
% cd ~/VisionFive
% git clone https://github.com/starfive-tech/JH7100_ddrinit.git
% cd JH7100_ddrinit/build
% make
...
riscv64-unknown-elf-objdump -S ddrinit-2133-220515.elf > ddrinit-2133-220515.asm
显示以上最后一条信息,表示编译成功,ddrinit-2133-220515.bin.out即为编译得到的ddrinit文件。
七、u-boot编译:
代码网址:starfive-tech/u-boot (github.com)
显示以上最后一条信息,表示能够正常运行,可以继续操作了。
% cd ~/VisionFive
% git clone https://github.com/starfive-tech/u-boot
% cd u-boot
% make starfive_jh7100_visionfive_smode_defconfig ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-
% make u-boot.bin u-boot.dtb ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu-
...
CAT u-boot-dtb.bin
COPY u-boot.bin
显示以上最后两条信息,表示编译成功,u-boot.dtb、u-boot.bin即为编译得到的u-boot文件,将会用于后续的OpenSBI编译。
八、OpenBSI编译:
代码地址:riscv-software-src/open***i: RISC-V Open Source Supervisor Binary Interface (github.com)
% cd ~/VisionFive
% git clone https://github.com/riscv/open***i.git
% make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic FW_PAYLOAD_PATH=~/VisionFive/u-boot/u-boot.bin FW_FDT_PATH=~/VisionFive/u-boot/u-boot.dtb
...
OBJCOPY platform/generic/firmware/fw_payload.bin
显示以上最后一条信息,表示编译成功,build/platform/generic/firmware/fw_payload.bin即为编译得到的openbsi文件。
但是这个文件大于2M,还需要进行一些处理,才可以使用,具体操作如下:
% mkdir ~/VisionFive/payload
% cp -a build/platform/generic/firmware/fw_payload.bin ~/VisionFive/payload/
% cd ~/VisionFive/payload
% svn export https://github.com/starfive-tech/freelight-u-sdk.git/branches/starfive/fsz.sh
% chmod +x fsz.sh
% ./fsz.sh fw_payload.bin fw_payload.bin.out
inFile: fw_payload.bin
inSize: 3022552 (0x002e1ed8, LE:0xd81e2e00)
outFile: fw_payload.bin.out
outSize: 3022556 (0x002e1edc)
调用fsz.sh处理fw_payload.bin后,显示如上信息,表示处理成功,fw_payload.bin.out即为实际需要使用的文件。
九、编译Linux 内核:
代码网址:starfive-tech/linux (github.com)
% cd ~/VisionFive
% git clone https://github.com/starfive-tech/linux
% cd linux
% make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv visionfive_defconfig
% make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig
% make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv -j2
...
Kernel: arch/riscv/boot/Image.gz is ready
显示以上最后三条信息,表示编译成功,arch/riscv/boot/Image.gz即为内核文件,arch/riscv/boot/dts/starfive/jh7100-starfive-visionfive-v1.dtd即为需要的dtb文件。
十、使用:
通过以上的步骤,我们就能够编译得到所需要的如下文件:
赛昉科技 固件:
Boot_recovery:用于恢复 SPI flash 的二进制文件
secondboot:第一阶段 bootloader
ddrinit:第一阶段 ddrinit
Bootloader:u-boot,通用Bootloader
OpenBSI:RISC-V SBI
Kernel:Linux内核
recovery_boot、secondboot、ddrinit的烧录,可以使用JH7100-tools进行。该工具需要在Linux上使用。
代码仓库:kprasadvnsi/JH71xx-tools: Bootloader recovery and updater tool for StarFive JH71x0 SoCs. (github.com)
cd ~/VisionFive
git clone git@github.com:kprasadvnsi/JH71xx-tools.git
cd JH71xx-tools
gcc -o jh7100-recover jh7100-recover.c
./jh7100-recover
Need serial device path.
Usage: ./jh7100-recover [OPTION]...
-D, --device <tty device> : Serial tty device path.
-r, --recovery <filename> : Bootloader recovery firmware.
-b, --bootloader <filename> : Second stage bootloader.
-d, --ddrinit <filename> : DRAM initialization firmware.
-h, --help : Show this help .
编译成功后,将会生成jh7100-recover,该工具将会用于recovery_boot、secondboot、ddrinit的烧录。
其调用参数如下:
-D 指定串口设备,使用USB转串口转换器的跳线连接到昉·星光的 40-Pin GPIO Header 上
-r Boot_recovery编译结果文件
-b secondboot编译结果文件
-d ddrinit编译结果文件
mkdir ~/VisionFive/images
cp -a ~/VisionFive/debug/jh7100_recovery_boot.bin ~/VisionFive/images/
cp -a ~/VisionFive/JH7100_secondBoot/build/bootloader-JH7100-220515.bin.out ~/VisionFive/images/
cp -a ~/VisionFive/JH7100_ddrinit/build/ddrinit-2133-220515.bin.out ~/VisionFive/images/
./jh7100-recover -D /dev/ttyUSB0
-r ~/VisionFive/images/jh7100_recovery_boot.bin
-b ~/VisionFive/images/bootloader-JH7100-220515.bin.out
./jh7100-recover -D /dev/ttyUSB0
-r ~/VisionFive/images/jh7100_recovery_boot.bin
-d ~/VisionFive/images/ddrinit-2133-buildroot.bin.out
./jh7100-recover -D /dev/ttyUSB0
-r ~/VisionFive/images/jh7100_recovery_boot.bin
-b ~/VisionFive/images/bootloader-JH7100-220515.bin.out
-d ~/VisionFive/images/ddrinit-2133-220515.bin.out
以上的具体操作,可参考:《昉·星光单板计算机快速入门指南 》。如果Bootlaber不慎损坏,我们也可以参考《昉·星光单板计算机快速入门指南 》进行Boot_recovery恢复了。
参考《昉·星光单板计算机软件技术参考手册 》,我们可以更新Kernel以及内核模块了!