在FPGA软核上运行Linux实践 (基于SugarPro + Vexriscv)

/ 0评 / 0

其实说是Sipeed的20K也支持,但是由于官方没好好写,好吧,那就只能从成熟的开始,整体过程还算比较简单,首先前面那一篇安装开源工具的得先做了.

安装需要的前置内容,之后重新打开Bash确保环境都配置上.

apt install build-essential device-tree-compiler wget git python3-setuptools python3-full verilator libevent-dev libjson-c-dev unzip gcc-riscv64-unknown-elf gcc-riscv64-linux-gnu ninja-build -y
curl https://sh.rustup.rs -sSf | sh
 # 部分工具依赖最新Rust
git clone https://github.com/litex-hub/linux-on-litex-vexriscv
cd linux-on-litex-vexriscv

因为新的系统对于Python的pip环境进行了限制保护,所以我这里解除一下,如果你系统还有其他,我建议你使用venv或者虚拟机再开一个系统.

编辑 /etc/pip.conf添加以下内容.

[global]
break-system-packages = true

继续安装Litex,中途缺什么补什么.

wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py
chmod +x litex_setup.py
./litex_setup.py --init --install

如果需要用到调试,则还需要这个.

apt install libtool automake pkg-config libusb-1.0-0-dev
git clone https://github.com/ntfreak/openocd.git
cd openocd
./bootstrap
./configure --enable-ftdi
make
make install

从这里下载系统文件,放到images文件夹内并解压.

https://github.com/litex-hub/linux-on-litex-vexriscv/issues/164

root@debian:~/linux-on-litex-vexriscv# cd images/
root@debian:~/linux-on-litex-vexriscv/images# wget https://github.com/litex-hub/linux-on-litex-vexriscv/files/8331338/linux_2022_03_23.zip

[ 省略 ]

linux_2022_03_23.zip                   100%[==========================================================================>]   5.11M  3.70MB/s    in 1.4s    

root@debian:~/linux-on-litex-vexriscv/images# unzip linux_2022_03_23.zip 
Archive:  linux_2022_03_23.zip
replace boot.json? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
  inflating: boot.json               
  inflating: Image                   
  inflating: opensbi.bin             
  inflating: rootfs.cpio             
  inflating: rv32.dtb                
root@debian:~/linux-on-litex-vexriscv/images# 

返回上一级,运行sim.py就可以运行模拟器,首先确定模拟器正常运行再继续下一步,可能需要安装meson,模拟器运行比较慢,需要耐心等待.因为他等于是先模拟一个FPGA运行环境,再上面跑.

为了使得我们板子能烧录,需要ecpdap.

cargo install ecpdap

之后我们开始实际刷到板子上.(如果JTAG接口目前未位于FPGA JTAG上,需要用icesprog修改,这里懒得说,自己运行一下工具的help都知道.)

./make.py --board=icesugar_pro --cpu-count=1 --build
./make.py --board=icesugar_pro --cpu-count=1 --load
litex_term --images=images/boot.json /dev/ttyACM0

因为Linux整个内核和文件系统都是通过串口发过去的,所以速度嘛就比较慢了.

构建

写入bit

启动Linux,输入后运行reboot,会触发下载逻辑,这个下载持续时间很长,大概需要30分钟,毕竟速度也就4-6KB/s,你会持续看到串口上有数据交换(LED闪烁).

这里一个疑问,他怎么定义串口在哪呢,看Litex-Boards就知道了.

https://github.com/litex-hub/litex-boards/blob/master/litex_boards/platforms/muselab_icesugar_pro.py

所以说,Litex是个非常大的系统性工程


如何用TF卡启动,分割一个容量小于2G的分区,格式化为FAT,然后丢images目录内所有东西进去,开机会自动从TF卡拷贝系统到SDRAM,当然,默认bit也没固化,需要的话还需要用icesprog写入.

 ./icesprog w /root/linux-on-litex-vexriscv/build/icesugar_pro/gateware/icesugar_pro.bit

32位系统不过瘾?要不64位?先构建FPGA上的核心,然后烧录这个bit,然后参考linux-on-litex-rocket继续,不过,逻辑数量不够还是别玩了,我这里按照small最小配置,资源完全不够用.

./litex-boards/litex_boards/targets/muselab_icesugar_pro.py --build \
    --cpu-type rocket --cpu-variant small --with-sdcard
git clone https://github.com/litex-hub/linux-on-litex-rocket

cd linux-on-litex-rocket

curl https://busybox.net/downloads/busybox-1.33.2.tar.bz2 | tar xfj -
cp conf/busybox-1.33.2-rv64gc.config busybox-1.33.2/.config
(cd busybox-1.33.2; make CROSS_COMPILE=riscv64-unknown-linux-gnu-)

mkdir initramfs
pushd initramfs
mkdir -p bin sbin lib etc dev home proc sys tmp mnt nfs root \
          usr/bin usr/sbin usr/lib
cp ../busybox-1.33.2/busybox bin/
ln -s bin/busybox ./init
cat > etc/inittab <<- "EOT"
::sysinit:/bin/busybox mount -t proc proc /proc
::sysinit:/bin/busybox mount -t devtmpfs devtmpfs /dev
::sysinit:/bin/busybox mount -t tmpfs tmpfs /tmp
::sysinit:/bin/busybox mount -t sysfs sysfs /sys
::sysinit:/bin/busybox --install -s
/dev/console::sysinit:-/bin/ash
EOT
fakeroot <<- "EOT"
find . | cpio -H newc -o > ../initramfs.cpio
EOT
popd

git clone https://github.com/litex-hub/linux.git
cp initramfs.cpio linux/
pushd linux
git checkout litex-rebase
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- \
     litex_rocket_defconfig litex_rocket_initramfs.config
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-
popd

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注