#!/bin/bash # # This updates every repo, rebuilds everything. # Creates: # RISC-V 32-bit core running Linux with root filesystem for ECP5 FPGA. # Directory where everything is stored FPGADIR=/home/jebba/devel/FPGA # Directory of scripts FPGASCRIPTS=$FPGADIR/muh # Timestamp FPGANOW=`date +%Y%m%d-%H%M%S` # Log script exec > >(tee $FPGADIR/log/trellis-$FPGANOW) 2>>$FPGADIR/log/trellis-$FPGANOW set -x cd $FPGASCRIPTS || exit # Write log of current git commits ./forksand-fpga-git-commits-log ################################### # Update and build icestorm tools # ################################### cd $FPGADIR || exit # Update Icestorm echo "===================================== Update icestorm" cd icestorm && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " && \ git pull && \ git submodule update && \ make clean && \ # 18 seconds: make -j$(nproc) && \ sudo make install || exit cd .. # Update Pjtrellis echo "===================================== Update pjtrellis" cd prjtrellis && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ cd libtrellis && \ make clean && \ cmake -DCMAKE_INSTALL_PREFIX=/usr/local . && \ # 1 second: make -j$(nproc) && \ sudo make install || exit cd ../.. # Update Nextpnr echo "===================================== Update nextpnr" cd nextpnr && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ make clean && \ cmake -DARCH=ecp5 -DCMAKE_INSTALL_PREFIX=/usr/local . && \ # 4m40s: make -j$(nproc) && \ sudo make install || exit cd .. # Update Yosys echo "===================================== Update yosys" cd yosys && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ make clean && \ YOABCREV=`grep ^ABCREV Makefile |cut -f 2 -d "=" | sed -e 's/ //g'` && \ cd abc && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git pull && \ git submodule update && \ git checkout $YOABCREV && \ # 4 seconds: # XXX which file XXX #make -j$(nproc) && \ cd .. make -j$(nproc) && \ sudo make install || exit cd .. # Update OpenOCD echo "===================================== Update openocd" cd openocd && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ make clean && \ # 13 seconds: make && \ sudo make install || exit cd .. ############### # Build LiteX # ############### cd $FPGADIR/litex # Update Buildroot echo "===================================== Update buildroot" cd buildroot && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ make clean && \ # XXX Use custom linux.config cp -p $FPGADIR/PATCH/linux-fstrellis.config \ $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/board/litex_vexriscv/linux-fstrellis.config # XXX Set up rootfs overlay files defined here: rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/board/litex_vexriscv/rootfs_overlay cp -a $FPGADIR/PATCH/rootfs_overlay \ $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/board/litex_vexriscv/rootfs_overlay # XXX Use custom defconfig #cp -p $FPGADIR/PATCH/litex_vexriscv_fstrellis_defconfig \ # $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/configs/litex_vexriscv_fstrellis_defconfig #make BR2_EXTERNAL=../linux-on-litex-vexriscv/buildroot/ litex_vexriscv_fstrellis_defconfig cp -p $FPGADIR/PATCH/litex_vexriscv_fstrellis_config \ $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/.config # XXX update patches mkdir -p $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/board/litex_vexriscv/patches make BR2_EXTERNAL=../linux-on-litex-vexriscv/buildroot/ # 5m16s: make && \ # XXX COPY OUTPUT # XXX *output/images/* # Since tftp server is remote, mount it locally for convenience: #sshfs -o reconnect sparkle:/srv/tftp/ /srv/tftp/ cp -p output/images/Image /srv/tftp/Image && \ cp -p output/images/rootfs.cpio /srv/tftp/rootfs.cpio && \ cp -p output/images/rootfs.tar /srv/tftp/rootfs.tar && \ # Where dtb dts ? ./linux-on-litex-vexriscv/buildroot/rv32.dtb cd .. # Update migen echo "===================================== Update migen" cd migen && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litedram echo "===================================== Update litedram" cd litedram && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update liteeth echo "===================================== Update liteeth" cd liteeth && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litepcie echo "===================================== Update litepcie" cd litepcie && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litesdcard echo "===================================== Update litesdcard" cd litesdcard && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litespi echo "===================================== Update litespi" cd litespi && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litevideo echo "===================================== Update litevideo" cd litevideo && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update liteiclink echo "===================================== Update liteiclink" # XXX needed? cd liteiclink && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litejesd204b echo "===================================== Update litejesd204b" # XXX needed? cd litejesd204b && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litesata echo "===================================== Update litesata" # XXX needed? cd litesata && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litex-boards echo "===================================== Update litex-boards" # XXX BUILD cd litex-boards && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # 1 second: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. # Update litex echo "===================================== Update litex" # XXX BUILD cd litex && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # XXX need to patch: # XXX MEMORY PATCH AND MORE HERE #cp -p $FPGADIR/PATCH/litex-soc_core.py \ # ./litex/soc/integration/soc_core.py && \ # XXX # Set memory in crufty way: XXX #sed -i -e 's/main_ram_size = min(main_ram_size, 0x20000000) # FIXME: limit to 512MB for now/main_ram_size = min(main_ram_size, 0x40000000) # FIXME: limit to 1G for now/g' $FPGADIR/litex/litex/litex/soc/integration/soc_sdram.py && \ #sed -i -e 's/main_ram_size = min(main_ram_size, 0x20000000) # FIXME: limit to 512MB for now/main_ram_size = min(main_ram_size, 0x30000000) # FIXME: limit to 768MB for now/g' $FPGADIR/litex/litex/litex/soc/integration/soc_sdram.py && \ #sed -i -e 's///g' $FPGADIR/litex/litex/litex/soc/integration/soc_core.py # BUILD VexRiscv.v HERE XXX #cd litex/soc/cores/cpu/vexriscv/verilog && \ # Remove older builds #rm -f *.v && \ # BUILD VEXRISCV # 1m8s: #make && \ #cd ../../../../../.. && \ # Build LiteX # 7 seconds: python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit # REVERT memory in crufty way: XXX #sed -i -e 's/main_ram_size = min(main_ram_size, 0x40000000) # FIXME: limit to 1G for now/main_ram_size = min(main_ram_size, 0x20000000) # FIXME: limit to 512MB for now/g' $FPGADIR/litex/litex/litex/soc/integration/soc_sdram.py && \ #sed -i -e 's/main_ram_size = min(main_ram_size, 0x30000000) # FIXME: limit to 768MB for now/main_ram_size = min(main_ram_size, 0x20000000) # FIXME: limit to 512MB for now/g' $FPGADIR/litex/litex/litex/soc/integration/soc_sdram.py && \ cd .. && \ ##################### # Build RISC-V Core # ##################### # XXX This build is done in above LiteX subdir # XXX So this is unused duplicate # XXX Should this really be built here earlier??? # $FPGADIR/litex/litex/litex/soc/cores/cpu/vexriscv/verilog # # Update Vexrisc-verilog #echo "===================================== Update vexrisc-verilog" # XXX BUILD #cd Vexriscv-verilog && \ #git branch -a && \ #git checkout master && \ #git reset --hard HEAD && \ #git status && \ #git log | head -1 | cut -f 2 -d " " #git pull && \ #git submodule update && \ # XXX clean thusly? # 5 seconds: #sbt clean reload && \ # XXX Just checkout VexRiscv_LinuxNoDspFmax ? # sbt "runMain vexriscv.GenCoreDefault" # 10 seconds: #sbt "runMain vexriscv.GenCoreDefault --externalInterruptArray=true --csrPluginConfig=linux-minimal" && \ # XXX OUTPUT FILES: # VexRiscv.v VexRiscv.yaml #cd .. # Update pythondata-cpu-vexriscv echo "===================================== Update pythondata-cpu-vexriscv" # XXX BUILD cd pythondata-cpu-vexriscv && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ python3 ./setup.py clean && python3 ./setup.py build && python3 ./setup.py install --user || exit cd .. ######################## # Build Linux on LiteX # ######################## # Update Linux on LiteX Vexriscv echo "===================================== Update linux-on-litex-vexriscv" # XXX BUILD cd linux-on-litex-vexriscv && \ git branch -a && \ git checkout master && \ git reset --hard HEAD && \ git status && \ git log | head -1 | cut -f 2 -d " " git pull && \ git submodule update && \ # Clean rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/__pycache__/ && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/build && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/rv32.dtb && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/board/litex_vexriscv/linux-fstrellis.config && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/buildroot/configs/litex_vexriscv_fstrellis_defconfig && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/emulator/*.d && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/emulator/*.o && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/emulator/emulator.bin && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/emulator/emulator.elf && \ rm -rf $FPGADIR/litex/linux-on-litex-vexriscv/prog/trellisboard.cfg && \ # Checkout custom branch #git checkout fs-trellis && \ #git status && \ #git log | head -1 | cut -f 2 -d " " # XXX PATCH # XXX set ramdisk_size=131072 #sed -i -e 's/root=\/dev\/ram0 init=/root=\/dev\/ram0 ramdisk_size=65536 debug init=/g' json2dts.py # root=nbd::[:][:] # XXX # sed -i -e 's/root=\/dev\/ram0 init=/root=nbd:192.168.1.100:8992 debug init=/g' json2dts.py #cp -p $FPGADIR/PATCH/json2dts.py $FPGADIR/litex/linux-on-litex-vexriscv # TrellisBoard Patch to make.py #patch -p0 < $FPGADIR/PATCH/0001-linuxonlitex-make.diff && \ # TrellisBoard config #cp -p $FPGADIR/PATCH/0000-trellisboard.cfg prog/trellisboard.cfg && \ # motd :) cp -p $FPGADIR/PATCH/linux-on-litex-motd \ buildroot/board/litex_vexriscv/rootfs_overlay/etc/motd && \ # motd date echo "motd date `date`" >> buildroot/board/litex_vexriscv/rootfs_overlay/etc/motd # XXX BUILD # XXX Add output of Vexrisc.v and buildroot etc from above # # # Really need to fix: # 2m1s: # XXX It actually builds, then fails at the end on something else (?) # This is now broken: XXX NOW OK ./make.py --board=trellisboard --build # # Temporary work around: #cd $FPGADIR/litex/litex-boards/litex_boards/partner/targets #rm -rf soc_ethernetsoc_trellisboard #./trellisboard.py \ # --with-ethernet \ # --sys-clk-freq=75e6 \ # --gateware-toolchain=trellis \ # --gateware-toolchain-path=/usr/local \ # --cpu-type=vexriscv \ # --cpu-variant=linux+no-dsp \ # --csr-csv=./csr_trellisboard.csv # # # # # # XXX extra cruft #cd ~/FPGADIR/litex/linux-on-litex-vexriscv && \ ## Now comment out the line that fails in make.py and rerun to get rest of build... #sed -i -e 's/builder.build()/#builder.build()/g' make.py && \ #./make.py --board=trellisboard --build && \ # # # # # XXX Copy to tftp server 1 file needed ? cp -p buildroot/rv32.dtb /srv/tftp/rv32.dtb && \ # XXX copy to tftp server emulator.bin cp -p emulator/emulator.bin /srv/tftp/emulator.bin && \ # # # # # Load image on FPGA # XXX busted: ./make.py --board=trellisboard --load && \ ###################### # Load image on FPGA # ###################### # Use this to flash since make.py broken: cd $FPGADIR openocd \ -f ./prjtrellis/misc/openocd/trellisboard.cfg \ -c "init; svf litex/linux-on-litex-vexriscv/build/trellisboard/gateware/trellisboard.svf ; exit" cd .. ################### # Connect to FPGA # ################### # lxterm # lxterm /dev/ttyUSB1 # lxterm /dev/ttyUSB1 --speed=2e6 # lxterm /dev/ttyUSB1 --speed=1e6 echo "Connect to FPGA thusly:" && \ echo "lxterm /dev/ttyUSB1 --speed=1e6" && \ #lxterm /dev/ttyUSB1 --speed=1e6 #lxterm /dev/ttyUSB2 --speed=1e6 ######## # MISC # ######## # Update GCC toolchain ####### # END # ####### exit 0