From 345f1b348011146c0eabbba6531649f9602880b4 Mon Sep 17 00:00:00 2001 From: Ralf Stemmer Date: Mon, 11 Mar 2019 13:17:45 +0100 Subject: [PATCH] MPSoC Scripts added --- .gitignore | 2 + CHANGELOG | 3 + MakeBuildScriptArchive.sh | 7 + src/compilearm.sh | 138 ++++++++++++++ src/compilemb.sh | 194 ++++++++++++++++++++ src/gettime.py | 238 ++++++++++++++++++++++++ src/makesdk.sh | 268 ++++++++++++++++++++++++++++ src/plot.py | 67 +++++++ src/scripts/createarmsdk.tcl | 43 +++++ src/scripts/creatembsdk.tcl | 34 ++++ src/scripts/memorymap.xslt | 13 ++ src/scripts/settings.sh | 63 +++++++ src/scripts/templates/bootloop.c | 17 ++ src/scripts/templates/microblaze.ld | 212 ++++++++++++++++++++++ src/scripts/upload.tcl | 35 ++++ src/scripts/upload2.tcl | 140 +++++++++++++++ src/upload.sh | 24 +++ 17 files changed, 1498 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG create mode 100755 MakeBuildScriptArchive.sh create mode 100755 src/compilearm.sh create mode 100755 src/compilemb.sh create mode 100755 src/gettime.py create mode 100755 src/makesdk.sh create mode 100755 src/plot.py create mode 100644 src/scripts/createarmsdk.tcl create mode 100644 src/scripts/creatembsdk.tcl create mode 100644 src/scripts/memorymap.xslt create mode 100755 src/scripts/settings.sh create mode 100644 src/scripts/templates/bootloop.c create mode 100644 src/scripts/templates/microblaze.ld create mode 100644 src/scripts/upload.tcl create mode 100644 src/scripts/upload2.tcl create mode 100755 src/upload.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f35018 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +BuildScripts.tar.gz + diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..ccde33d --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,3 @@ +11.03.19 - MPSoC build scripts added +07.03.19 - Cross compiler build scripts added + diff --git a/MakeBuildScriptArchive.sh b/MakeBuildScriptArchive.sh new file mode 100755 index 0000000..1079ffc --- /dev/null +++ b/MakeBuildScriptArchive.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +cd ./src +tar -cf ../BuildScripts.tar * +cd .. +gzip BuildScripts.tar + diff --git a/src/compilearm.sh b/src/compilearm.sh new file mode 100755 index 0000000..03855dc --- /dev/null +++ b/src/compilearm.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +source ./scripts/settings.sh +LIBPATHS="-L$SDKDIR/lib" +INCLUDEPATHS="-I$SDKDIR/include" +CFLAGS="-O0 -c -Wall -fmessage-length=0 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -DFSBL_DEBUG -DFSBL_DEBUG_INFO" +LFLAGS="-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Wl,-build-id=none" +GCC=arm-none-eabi-gcc + +if [ -d "$SW_BUILDDIR" ] ; then + echo -e -n "\e[1;34mRemoving old object-files: " + find "$SW_BUILDDIR" -type f -name "*.o" -delete + echo -e "\e[1;32m✔\e[0m" +fi + +mkdir -p $SW_BUILDDIR + +function CompileForProcessor +{ + # Compile + echo -e "\e[1;36mCompiling for ARM CortexA9 $1 \e[0;36m…\e[0m" + + echo -e -n "\e[1;34m$SDKDIR/include/arm$1: " + if [ ! -d "$SDKDIR/include/arm$1" ] ; then + echo -e "\e[1;31m$SDKDIR/include/arm$1 missing! Rebuild SDK or check ARM number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + mkdir -p $SW_BUILDDIR/arm$1 + + SOURCES=$(find $SW_SRCDIR/arm$1 -type f -name "*.[c,S]") + for s in $SOURCES ; + do + echo -e -n "\e[1;34m - $s\e[0m " + FILENAME="${s##*/}" + OBJFILE="${FILENAME%.*}.o" + $GCC $CFLAGS $LIBPATHS $INCLUDEPATHS -I$SDKDIR/include/arm$1 -I$SW_SRCDIR/arm$1 -I$SW_SRCDIR/share -c -o "$SW_BUILDDIR/arm$1/$OBJFILE" $s + if [ $? -ne 0 ] ; then + echo -e "\e[1;31m$GCC FAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + done +} + +# Get ARM cores +ARCHITECTURE=$(echo 'cat //Project/SYSTEMINFO/@ARCH' | xmllint --shell "$SDK_SYSTEMDEF" | grep ARCH | grep -v cat | cut -d "\"" -f 2) +if [ "$ARCHITECTURE" == "zynq" ] ; then + ARMCOUNT=2 +else + echo -e "\e[1;33mThere are no ARM cores on the $ARCHITECTURE plattform!" + exit 0 +fi + + +# Compile firmware for each ARM +for ARMNR in $(seq 0 $((ARMCOUNT - 1)) ) ; do + # Only compile if there is source code + if [ ! -d "$SW_SRCDIR/arm$ARMNR" ] ; then + echo -e "\e[1;33mThere is no source code for ARM$ARMNR! \e[1;30m(Skipping)\e[0m" + continue + fi + CompileForProcessor $ARMNR +done + + +# Linken +function LinkFirmwareForProcessor +{ + SOURCEDIR="$SW_SRCDIR/arm$1" + PROCSOURCES=$(find $SW_BUILDDIR/arm$1 -type f -name "*.o") + FIRMWARE="$OUTPUTDIR/firmware_arm$1.elf" + # prefere explicit linker script. Use SDK generated as fallback + if [ -f $SOURCEDIR/ldscript.ld ] ; then + LINKSCRIPT="$SOURCEDIR/ldscript.ld" + elif [ -f $SOURCEDIR/lscript.ld ] ; then # SDK uses lscript as name + LINKSCRIPT="$SOURCEDIR/lscript.ld" + else + LINKSCRIPT="$SDKDIR/ldscript_arm$1.ld" + fi + + echo -e "\e[1;36mLinking \e[0;36m$SW_FIRMWARE\e[1;34m: " + + echo -e -n "\e[1;34m$LINKSCRIPT: " + if [ ! -f "$LINKSCRIPT" ] ; then + echo -e "\e[1;31m$LINKSCRIPT missing! Rebuild SDK or check ARM number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\e[1;34m$SDKDIR/lib/arm$1: " + if [ ! -d "$SDKDIR/lib/arm$1" ] ; then + echo -e "\e[1;31m$SDKDIR/lib/arm$1 missing! Rebuild SDK or check ARM number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\e[1;34mLinking… " + $GCC -Wl,-T -Wl,$LINKSCRIPT $LFLAGS $LIBPATHS -L$SDKDIR/lib/arm$1 -o $FIRMWARE $PROCSOURCES -lps7init \ + -Wl,--start-group,-lxil,-lgcc,-lc,--end-group \ + -Wl,--start-group,-lxilffs,-lxil,-lgcc,-lc,--end-group + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + chmod -x $FIRMWARE +} + +# Link firmware for each microblaze +for ARMNR in $(seq 0 $((ARMCOUNT - 1)) ) ; do + # Only compile if there is source code + if [ ! -d "$SW_SRCDIR/arm$ARMNR" ] ; then + echo -e "\e[1;33mThere is no source code for ARM$ARMNR! \e[1;30m(Skipping)\e[0m" + continue + fi + LinkFirmwareForProcessor $ARMNR +done + +echo -e "\e[1;32mNew ARM binary built.\e[0m" + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/compilemb.sh b/src/compilemb.sh new file mode 100755 index 0000000..1744e0f --- /dev/null +++ b/src/compilemb.sh @@ -0,0 +1,194 @@ +#!/usr/bin/env bash +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +source ./scripts/settings.sh +LIBPATHS="-L$SDKDIR/lib" +LIBS="-lxil -lgloss -lgcc -lc" +INCLUDEPATHS="-I$SDKDIR/include" +CFLAGS="-O0 -c -mcpu=v9.6 -mlittle-endian -mxl-soft-mul" +LFLAGS="-Wl,--no-relax -mcpu=v9.6 -mlittle-endian -mxl-soft-mul" +GCC=mb-gcc +OBJCOPY=mb-objcopy + +if [ -f "$SW_SRCDIR/setup.sh" ] ; then + echo -e -n "\e[1;34mLoading software specific setup: " + source $SW_SRCDIR/setup.sh + echo -e "\e[1;32m✔\e[0m" +fi + +if [ -d "$SW_BUILDDIR" ] ; then + echo -e -n "\e[1;34mRemoving old object-files: " + find "$SW_BUILDDIR" -type f -name "*.o" -delete + echo -e "\e[1;32m✔\e[0m" +fi + +mkdir -p $SW_BUILDDIR + +# Compile shared code +echo -e "\e[1;36mCompiling shared code \e[0;36m…\e[0m" +mkdir -p $SW_BUILDDIR/share + +SOURCES=$(find $SW_SRCDIR/share -type f -name "*.c") +for s in $SOURCES ; +do + echo -e -n "\e[1;34m - $s\e[0m " + FILENAME="${s##*/}" + OBJFILE="${FILENAME%.*}.o" + $GCC $CFLAGS $LIBPATHS $INCLUDEPATHS -I$SW_SRCDIR/share -c -o "$SW_BUILDDIR/share/$OBJFILE" $s + if [ $? -ne 0 ] ; then + echo -e "\e[1;31m$GCC FAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi +done + +# First argument must be the number of the processor ("0", "1", …) +# Second argument can be an address with a dot as prefix (".4000000", ".C0000000") +function CompileForProcessor +{ + MBNUM=${1} + ADDRESS=${2:-""} + SDKINCLUDE="$SDKDIR/include/mb$MBNUM" + if [ -z $ADDRESS ] ; then + SOURCEDIR="$SW_SRCDIR/mb${MBNUM}" + BUILDDIR="$SW_BUILDDIR/mb${MBNUM}" + else + SOURCEDIR="$SW_SRCDIR/mb${MBNUM}.${ADDRESS}" # leads to …/mb0.40000000 + BUILDDIR="$SW_BUILDDIR/mb${MBNUM}.${ADDRESS}" + fi + + echo -e "\e[1;36mCompiling for MicroBlaze $MBNUM \e[1;35m$ADDRESS\e[0m" + + # Check environment + echo -e "\e[1;34mChecking source environment" + echo -e -n "\t\e[1;34m$SDKINCLUDE: " + if [ ! -d "$SDKINCLUDE" ] ; then + echo -e "\e[1;31m$SDKINCLUDE missing! Rebuild SDK or check MicroBlaze number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\t\e[1;34m$SOURCEDIR: " + if [ ! -d "$SOURCEDIR" ] ; then + echo -e "\e[1;31m$SOURCEDIR missing! Check MicroBlaze number and/or address!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + mkdir -p $BUILDDIR + + # Compile + SOURCES=$(find $SOURCEDIR -type f -name "*.c") + for s in $SOURCES ; + do + echo -e -n "\e[1;34m - $s\e[0m " + FILENAME="${s##*/}" + OBJFILE="${FILENAME%.*}.o" + $GCC $CFLAGS $LIBPATHS $INCLUDEPATHS -I$SDKINCLUDE -I$SOURCEDIR -I$SW_SRCDIR/share -c -o "$BUILDDIR/$OBJFILE" $s + if [ $? -ne 0 ] ; then + echo -e "\e[1;31m$GCC FAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + done +} + +# Linken +# First argument must be the number of the processor ("0", "1", …) +# Second argument can be an address with a dot as prefix (".4000000", ".C0000000") +function LinkFirmwareForProcessor +{ + MBNUM=${1} + ADDRESS=${2:-""} + #SDKINCLUDE="$SDKDIR/include/mb$MBNUM" + if [ -z $ADDRESS ] ; then + SOURCEDIR="$SW_SRCDIR/mb${MBNUM}" + BUILDDIR="$SW_BUILDDIR/mb${MBNUM}" + FIRMWARE="$OUTPUTDIR/firmware_mb${MBNUM}.elf" + # prefere explicit linker script. Use SDK generated as fallback + if [ -f $SOURCEDIR/ldscript.ld ] ; then + LINKSCRIPT="$SOURCEDIR/ldscript.ld" + else + LINKSCRIPT="$SDKDIR/ldscript_mb$MBNUM.ld" + fi + + else + SOURCEDIR="$SW_SRCDIR/mb${MBNUM}.${ADDRESS}" # leads …/mb0.40000000 + BUILDDIR="$SW_BUILDDIR/mb${MBNUM}.${ADDRESS}" + FIRMWARE="$OUTPUTDIR/firmware_mb${MBNUM}.${ADDRESS}.elf" + LINKSCRIPT="$SOURCEDIR/ldscript.ld" + fi + + PROCSOURCES=$(find $BUILDDIR -type f -name "*.o") + SHARSOURCES=$(find $SW_BUILDDIR/share -type f -name "*.o") + + echo -e "\e[1;36mLinking \e[0;36m$FIRMWARE\e[1;34m: " + + # Check environment + echo -e "\e[1;34mChecking source environment" + echo -e -n "\t\e[1;34mLinker script $LINKSCRIPT: " + if [ ! -f "$LINKSCRIPT" ] ; then + echo -e "\e[1;31m$LINKSCRIPT missing! Rebuild SDK or check MicroBlaze number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\t\e[1;34mHAL $SDKDIR/lib/mb$MBNUM: " + if [ ! -d "$SDKDIR/lib/mb$MBNUM" ] ; then + echo -e "\e[1;31m$SDKDIR/lib/mb$MBNUM missing! Rebuild SDK or check MicroBlaze number!" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\e[1;34mLinking " + $GCC -Wl,-T -Wl,$LINKSCRIPT $LFLAGS $LIBPATHS -L$SDKDIR/lib/mb$MBNUM -o $FIRMWARE $PROCSOURCES $SHARSOURCES $LIBS + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + $OBJCOPY -O binary $FIRMWARE ${FIRMWARE%.*}.bin + chmod -x $FIRMWARE + chmod -x ${FIRMWARE%.*}.bin +} + +# Count microblazes +MICROBLAZECOUNT=$( grep InstPath $SDK_MEMORYINFO | grep -i microblaze | wc -l ) + +# Build main firmware for each MicroBlaze +for MBNR in $(seq 0 $((MICROBLAZECOUNT - 1)) ) ; do + CompileForProcessor $MBNR + LinkFirmwareForProcessor $MBNR +done + +# Now scan source directory for additional firmware mapped to different memory +MAPPINGS=$(find $SW_SRCDIR -type d -name "mb*.*" -printf "%f\n") +for m in $MAPPINGS ; do + MB=${m%.*} + MB=${MB:2} + ADDR=${m:4} + CompileForProcessor $MB $ADDR + LinkFirmwareForProcessor $MB $ADDR +done + + +echo -e "\e[1;32mNew System built.\e[0m" + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/gettime.py b/src/gettime.py new file mode 100755 index 0000000..95358f7 --- /dev/null +++ b/src/gettime.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +import sys +import os +import time +import argparse +import binascii + +try: + from serial import * +except: + print("\033[1;31mModule \033[1;37mpyserial \033[1;31mmissing!") + print("\033[1;34m Try \033[1;36mpip\033[1;30m3\033[1;36m install pyserial\033[1;34m as root to install it.\033[1;30m") + exit(1) + + +ShutdownReceiver = False + + +cli = argparse.ArgumentParser( + description="Reader for SDF time measurement values.", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + +cli.add_argument("-s", "--silent", default=False, action="store_true", + help="Do not show progress") +cli.add_argument("datadevice", type=str, action="store", + help="Path to the serial communication device for reading measurement data.") +cli.add_argument("n", type=str, action="store", + help="Number of measurements.") +cli.add_argument("outfile", type=str, action="store", + help="Path where the measured data will be stored.") + + +class HEADER(object): + def __init__(self, headerbyte): + if type(headerbyte) != bytes: + raise TypeError("Header-Byte should be of type bytes as returned by uart.read(1)!") + header = int.from_bytes(headerbyte, byteorder="little", signed=False) + + self.sync = (header >> 7) & 1 + self.first = (header >> 6) & 1 + self.zero = (header >> 5) & 1 + self.overflow = (header >> 4) & 1 + self.tmberror = (header >> 3) & 1 + self.tmcerror = (header >> 2) & 1 + self.size = (header >> 0) & 3 + + def isValid(self): + if self.sync != 1: + return False + if self.zero != 0: + return False + return True + + def hasErrorFlags(self): + if self.overflow == 1: + return True + if self.tmberror == 1: + return True + if self.tmcerror == 1: + return True + return False + + def GetDataSize(self): + return self.size + 1 + + +class PACKET(object): + def __init__(self, header): + if type(header) != HEADER: + raise TypeError("header must be an instance of class HEADER!") + + self.header = header + self.data = 0 + + def AddByte(self, position, byte): + if type(position) != int: + raise TypeError("position must be of type int") + if type(byte) != bytes: + raise TypeError("byte must be of type bytes") + + byte = int.from_bytes(byte, byteorder="little", signed=False) + + if (byte >> 7) == 1: + raise ValueError("Invalid Sync-Bit. Bit is set to 1 but should be 0 for data bytes!") + + if position >= self.header.GetDataSize(): + raise ValueError("Position of byte exceeds range of expected bytes regarding packet header") + + self.data |= (int(byte&0x7F) << (position*7)) + + + + +def ReadPacket(uart): + # 1.: Read Header (Skip byte if not header) + header = None + while True: + try: + byte = uart.read(1) + except Exception as e: + print("\033[1;31mReading byte from UART failed!\033[0m") + raise(e) + + header = HEADER(byte) + if header.isValid(): + break + + print("\033[1;33mInvalid Header \033[1;35m%s\033[1;33m: "%(byte.hex()), end="") + if header.sync == 0: + print("\033[1;33mSync-Bit is 0 \033[1;30m(This is a data-byte. Will be dropped.)") + continue + + if header.zero != 0: + print("\033[1;31mSync-Bit and Zero-Bit are 1 \033[1;30m(This should never happen! Physical error?)") + raise ValueError("Sync-Bit and Zero-Bit are 1") + + packet = PACKET(header) + + # 2.: Read data bytes + for i in range(header.GetDataSize()): + try: + byte = uart.read(1) + except Exception as e: + print("\033[1;31mReading byte from UART failed!\033[0m") + raise(e) + + try: + packet.AddByte(i, byte) + except Exception as e: + print("\033[1;31mAdding byte to time value failed with error %s!\033[0m"%(str(e))) + raise(e) + + return packet + + +if __name__ == '__main__': + + # handle command line arguments + args = cli.parse_args() + DATADEVICE = args.datadevice + OUTFILE = args.outfile + N = int(args.n) + SILENT = bool(args.silent) + + # Open terminal device + try: + datauart = Serial( + port = DATADEVICE, + baudrate= 115200, + xonxoff = 0, + rtscts = 0, + interCharTimeout=None + ) + except Exception as e: + print("\033[1;31mAccessing \033[1;37m" + DEVICE + " \033[1;31mfailed with the following excpetion:\033[0m") + print(e) + exit(1) + + + try: + outfile = open(OUTFILE, "w") + except Exception as e: + print("\033[1;31mAccessing \033[1;37m" + OUTFILE + " \033[1;31mfailed with the following excpetion:\033[0m") + print(e) + exit(1) + + + fails = 0 + + for i in range(N+1): + # Check fails-state + if fails > 100: + print("\033[1;33mUnexpected high error rate of %i times in a row!\033[0m"%(fails)) + print("\033[1;31mExiting...\033[0m") + datauart.close() + outfile.close() + exit(2) + + # Show progress + if not SILENT: + print("\033[1;30mGetTime: \033[1;34m[\033[0;36m%2i%%\033[1;30m %7i\033[1;34m]\033[0m"%(int((i*100)/(N+1)), i), end=" ") + + # Read Packet + try: + packet = ReadPacket(datauart) + except Exception as e: + fails += 1 + if not SILENT: + print("\033[1;31m(%s)\033[0m"%(str(e))) + continue + + # Create file entry + header = packet.header + value = packet.data + + if header.hasErrorFlags(): + errorlist = list() + if header.overflow: + errorlist.append("overflow") + if header.tmberror: + errorlist.append("tmberror") + if header.tmcerror: + errorlist.append("tmcerror") + + fails += 1 + line = ",".join(errorlist) + "\n" + else: + fails = 0 + line = str(value) + "\n" + if not SILENT: + value = packet.data + print("\033[1;30m0x%X\033[1;35m -> \033[1;37m%i\033[0m"%(value, value), end="") + if header.first: + print(" \033[1;33mFirst Packet", end="") + sys.stdout.flush() + + outfile.write(line) + if not SILENT: + print("\033[0m") + time.sleep(0.1); + + datauart.close() + outfile.close() + + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/makesdk.sh b/src/makesdk.sh new file mode 100755 index 0000000..b1d33cc --- /dev/null +++ b/src/makesdk.sh @@ -0,0 +1,268 @@ +#!/usr/bin/env bash +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +source ./scripts/settings.sh + +# Check environment +if [ -d "$SDKDIR" ] ; then + echo -e "\e[1;31mSDK-Directory $SDKDIR does already exist." + echo -e "\e[1;30mTo create a new SDK, the old one must be removed manually." + exit 1 +fi +if [ -d "$XSDKSDKDIR" ] ; then + echo -e "\e[1;31mXSDK-SDK-Directory $XSDKSDKDIR does already exist." + echo -e "\e[1;30mTo create a new SDK, the old one must be removed manually." + exit 1 +fi + +# Prepare environment +echo -e -n "\e[1;34mCreating SDK tree in \e[0;36m$SDKDIR\e[1;34m: " +mkdir -p $SDKDIR/lib +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +# Extract System Definitions from Vivado Project +echo -e -n "\e[1;34mFinding System Definition " +SYSDEF=$(find $OUTPUTDIR/$PROJECTNAME.runs -name "*.sysdef" -print) +cp $SYSDEF $SDKDIR/sysdef.zip +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +echo -e "\e[1;34mExtracting System Definition \e[0;36m$SYSDEF\e[0m" +unzip $SDKDIR/sysdef.zip -d $SDKDIR/. +if [ $? -ne 0 ] ; then + echo -e "\e[1;31munzip FAILED!\e[0m" + exit 1 +fi + +# Create Memorymap +echo -e -n "\e[1;34mCreating MemoyMap \e[0;36m$SDK_MEMORYMAP\e[1;34m: " +xsltproc ./scripts/memorymap.xslt $SDKDIR/$HARDWARENAME.hwh > $SDK_MEMORYMAP +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +# Check if the Synthesis process was successful +echo -e -n "\e[1;34m$HARDWAREDEF: " +if [ ! -f "$HARDWAREDEF" ] ; then + echo -e "\e[1;31m$HARDWAREDEF missing! Did you export the Hardware?" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +# Renaming Memory-Info file +MEMINFOR=$( find $SDKDIR -name "*.mmi" -print) +echo -e -n "\e[1;34m$SDK_MEMORYINFO: " +mv $MEMINFOR $SDK_MEMORYINFO +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +# Make everything clean +BITSTREAM=$(find $SDKDIR -name "*.bit" -print) +echo -e -n "\e[1;34m$SDK_BITFILE: " +mv $BITSTREAM $SDK_BITFILE +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + +echo -e -n "\e[1;34m$SDK_HARDWAREDEF: " +cp $HARDWAREDEF $SDK_HARDWAREDEF +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32m✔\e[0m" +fi + + +echo -e -n "\e[1;34mChecking Architecture " + +# Get Architecture +# Source: https://stackoverflow.com/questions/25508512/shellscript-read-xml-attribute-value +ARCHITECTURE=$(echo 'cat //Project/SYSTEMINFO/@ARCH' | xmllint --shell "$SDK_SYSTEMDEF" | grep ARCH | grep -v cat | cut -d "\"" -f 2) +if [ "$ARCHITECTURE" == "zynq" ] ; then + ARMCOUNT=2 +else + ARMCOUNT=0 +fi + +# Count microblazes +MICROBLAZECOUNT=$( grep InstPath $SDK_MEMORYINFO | grep -i microblaze | wc -l ) + +# Print architecture details +echo -e "\e[1;32m✔\e[1;34m ➔ \e[1;35m$ARCHITECTURE\e[0m" + +echo -e "\e[1;34mCores:" +echo -e "\e[1;34m\tMicroBlazes: \e[0;36m$MICROBLAZECOUNT" +echo -e "\e[1;34m\tARM Cores: \e[0;36m$ARMCOUNT" + +if [ "$ARCHITECTURE" == "zynq" ] ; then + # Create SDK for ARM core 0 + LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21:/usr/local/lib $XSDK -batch -source $CREATEARMSDK_SCRIPT -tclargs 0 + + # Compile SDK for ARM core 0 + CWD=$(pwd) + cd $XSDKSDKDIR/board_arm0 + echo -e "\e[1;34mBuilding Board-Driver for ARM CortexA9 0\e[0m" + make --silent > /dev/null + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mmake FAILED!\e[0m" + exit 1 + else + echo -e "\e[0;32mmake succeeded.\e[0m" + fi + cd $CWD + + # Exporting SDK + LIBDIR=$SDKDIR/lib/arm0 + INCDIR=$SDKDIR/include/arm0 + mkdir -p $LIBDIR + mkdir -p $INCDIR + + echo -e "\e[1;34mOrganize SDK directory for ARM CortexA9 0\e[0m" + echo -e -n "\t\e[1;34m$LIBDIR: " + cp -r $XSDKSDKDIR/board_arm0/ps7_cortexa9_0/lib/*.a $LIBDIR/. + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\t\e[1;34m$INCDIR: " + cp -r $XSDKSDKDIR/board_arm0/ps7_cortexa9_0/include/* $INCDIR/. + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + LDSCRIPT="$XSDKSDKDIR/software_arm0/src/lscript.ld" + echo -e -n "\t\e[1;34m$SDKDIR/ldscript_arm0.ld: " + cp $LDSCRIPT $SDKDIR/ldscript_arm0.ld + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + # Building PS7_INIT + echo -e "\e[1;34mBuilding ps7_init library\e[0m" + CFLAGS="-O0 -c -Wall -fmessage-length=0 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" + GCC=arm-none-eabi-gcc + AR=arm-none-eabi-ar + $GCC $CFLAGS -I$SDKDIR -I$SDKDIR/include/arm0 -o $SDKDIR/ps7_init.o $SDKDIR/ps7_init.c + $GCC $CFLAGS -I$SDKDIR -I$SDKDIR/include/arm0 -o $SDKDIR/ps7_init_gpl.o $SDKDIR/ps7_init_gpl.c + $AR r $SDKDIR/lib/arm0/libps7init.a $SDKDIR/ps7_init_gpl.o $SDKDIR/ps7_init.o + cp $SDKDIR/*.h $SDKDIR/include/arm0/. + + +fi # if architecture is zynq + + + +# Generate SDK all MicroBlazes +echo -e "\e[1;34mGenerating XSDK SDK for $MICROBLAZECOUNT MicroBlazes in \e[0;36m$XSDKSDKDIR\e[1;34m using following TCL-Script: \e[0;36m$CREATEMBSDK_SCRIPT\e[0m" +for MBNR in $(seq 0 $((MICROBLAZECOUNT - 1)) ) ; do + # Create SDK + LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21:/usr/local/lib $XSDK -batch -source $CREATEMBSDK_SCRIPT -tclargs $MBNR + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mXSDK FAILED!\e[0m" + exit 1 + else + echo -e "\e[0;32mXSDK succeeded.\e[0m" + fi + # Check if creation was successful + if [ ! -d "$XSDKSDKDIR/board_mb$MBNR" ] ; then + echo -e "\e[1;31mBoard-Drivers in $XSDKSDKDIR/board_mb$MBNR missing!" + exit 1 + fi +done + +# Compile SDK +for MBNR in $(seq 0 $((MICROBLAZECOUNT - 1)) ) ; do + CWD=$(pwd) + cd $XSDKSDKDIR/board_mb$MBNR + echo -e "\e[1;34mBuilding Board-Driver for MicroBlaze $MBNR\e[0m" + make --silent > /dev/null + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mmake FAILED!\e[0m" + exit 1 + else + echo -e "\e[0;32mmake succeeded.\e[0m" + fi + cd $CWD +done + + +# export SDK +echo -e "\e[1;34mOrganize SDK directory for all MicroBlazes\e[0m" +for MBNR in $(seq 0 $((MICROBLAZECOUNT - 1)) ) ; do + LIBDIR=$SDKDIR/lib/mb$MBNR + INCDIR=$SDKDIR/include/mb$MBNR + mkdir -p $LIBDIR + mkdir -p $INCDIR + + echo -e -n "\t\e[1;34m$LIBDIR: " + cp -r $XSDKSDKDIR/board_mb$MBNR/microblaze_$MBNR/lib/libxil.a $LIBDIR/. + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + echo -e -n "\t\e[1;34m$INCDIR: " + cp -r $XSDKSDKDIR/board_mb$MBNR/microblaze_$MBNR/include/* $INCDIR/. + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi + + LDSCRIPT="$XSDKSDKDIR/software_mb$MBNR/src/lscript.ld" + echo -e -n "\t\e[1;34m$SDKDIR/ldscript_mb$MBNR.ld: " + cp $LDSCRIPT $SDKDIR/ldscript_mb$MBNR.ld + if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 + else + echo -e "\e[1;32m✔\e[0m" + fi +done + +echo -e "\e[1;32mSDK created.\e[0m" + + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/plot.py b/src/plot.py new file mode 100755 index 0000000..7fb814f --- /dev/null +++ b/src/plot.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +import numpy as np +import math +import matplotlib.pyplot as pyplot +import csv +import argparse +import array + + + +def column(matrix, i): + return [row[i] for row in matrix] + +cli = argparse.ArgumentParser(description='Plot Graph from File') +cli.add_argument("infile", type=str, action="store", + help="Path where the measured data will be read from.") +args = cli.parse_args() + +if __name__ == '__main__': + # read vector of data + with open(args.infile) as f: + lines = f.read().splitlines() + + data = [int(line) for line in lines] + print("\033[1;34mmin: \033[1;35m %5i"%(min(data))) + print("\033[1;34mmax: \033[1;35m %5i"%(max(data))) + print("\033[1;34mavg: \033[1;35m %5f"%(sum(data)/float(len(data)))) + npdata = np.asarray(data) + + fig = pyplot.figure() + fig.set_size_inches(18.5, 10.5) + fig.suptitle("time in cycles", fontsize=11) + + # time over time + time = fig.add_subplot(1,2,1, label="time") + time.plot(np.arange(len(npdata)), npdata, + color="C0", markersize = 1, marker = ".", linestyle = "") + time.set_xlabel("Measurement", color="C0") + time.set_ylabel("Time", color="C0") + time.tick_params(axis="x", colors="C0") + time.tick_params(axis="y", colors="C0") + pyplot.grid(True) + + # histogram + hist = fig.add_subplot(1,2,2, label="hist") + hist.hist(npdata, 100, density=0, color="C1") + hist.set_xlabel("Time", color="C1") + hist.set_ylabel("Occurence", color="C1") + hist.tick_params(axis="x", colors="C1") + hist.tick_params(axis="y", colors="C1") + pyplot.grid(True) + + pyplot.show() + #if args.savePlot is not None: + # fig.savefig(args.savePlot, bbox_inches='tight', dpi=100) +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/createarmsdk.tcl b/src/scripts/createarmsdk.tcl new file mode 100644 index 0000000..8252fb3 --- /dev/null +++ b/src/scripts/createarmsdk.tcl @@ -0,0 +1,43 @@ + +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +puts "\x1B\[1;36mCreating SDK for ARM CortexA9 [lindex $argv 1] using xsdk\x1B\[0m" + +# Define environment +source ./scripts/settings.tcl +set SDKDIR "$OUTPUTDIR/$PROJECTNAME.sdk" +set PROCESSOR "ps7_cortexa9_[lindex $argv 1]" +set HWNAME "hardware_arm[lindex $argv 1]" +set SWNAME "software_arm[lindex $argv 1]" +set BSPNAME "board_arm[lindex $argv 1]" + + +# Create output directory +file mkdir $SDKDIR +#set_workspace $SDKDIR +setws $SDKDIR + +puts "\x1B\[1;34mCreating BSP…\x1B\[0m" + +createhw -name $HWNAME -hwspec $HARDWAREDEF +createbsp -name $BSPNAME -hwproject $HWNAME -proc $PROCESSOR -os standalone + +puts "\x1B\[1;34mAdding libraries to BSP…\x1B\[0m" +openbsp $BSPNAME +setlib -bsp $BSPNAME -lib xilffs +regenbsp -bsp $BSPNAME +closebsp $BSPNAME + +puts "\x1B\[1;34mCreating FSBL…\x1B\[0m" +createapp -name $SWNAME -hwproject $HWNAME -proc $PROCESSOR -os standalone -lang C -app {Zynq FSBL} -bsp $BSPNAME + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/creatembsdk.tcl b/src/scripts/creatembsdk.tcl new file mode 100644 index 0000000..6696394 --- /dev/null +++ b/src/scripts/creatembsdk.tcl @@ -0,0 +1,34 @@ + +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +puts "\x1B\[1;36mCreating SDK for Microblaze [lindex $argv 1] using xsdk\x1B\[0m" + +# Define environment +source ./scripts/settings.tcl +set SDKDIR "$OUTPUTDIR/$PROJECTNAME.sdk" +set PROCESSOR "microblaze_[lindex $argv 1]" +set HWNAME "hardware_mb[lindex $argv 1]" +set SWNAME "software_mb[lindex $argv 1]" +set BSPNAME "board_mb[lindex $argv 1]" + + +# Create output directory +file mkdir $SDKDIR +set_workspace $SDKDIR + +puts "\x1B\[1;34mCreating BSP…\x1B\[0m" + +create_hw_project -name $HWNAME -hwspec $HARDWAREDEF +create_bsp_project -name $BSPNAME -hwproject $HWNAME -proc $PROCESSOR -os standalone +create_app_project -name $SWNAME -hwproject $HWNAME -proc $PROCESSOR -os standalone -lang C -app {Hello World} -bsp $BSPNAME + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/memorymap.xslt b/src/scripts/memorymap.xslt new file mode 100644 index 0000000..b3536c6 --- /dev/null +++ b/src/scripts/memorymap.xslt @@ -0,0 +1,13 @@ + + + + + + + , + , + + + + + diff --git a/src/scripts/settings.sh b/src/scripts/settings.sh new file mode 100755 index 0000000..b0fdf42 --- /dev/null +++ b/src/scripts/settings.sh @@ -0,0 +1,63 @@ +#!/usr/bin/bash + +# Configurations necessary to edit by the user +################################################################ + +# The Project Name is the name of the project as given in the "Create new Project" dialog in Vivado. +# This name is the same name as the directory, all files manages by Vivado are stored at. +# This directory names as the project contains several subdirectorys starting with $PROJECTNAME.* +PROJECTNAME=HWv3.2 + +# The Hardware Name is the name of the created Block Design +# This name also appears at several positions with some suffixes like $HARDWARENAME_wrapper +# The name gets displayed in the title of the Block Designer. +HARDWARENAME=SoC + +# The Software Name is the name of to the source code directory of the whole system. +# Subdirectories are the "shared" directory and a directory for each Microblaze and ARM core +SOFTWARENAME=SWv3.3 + + +# Derived configurations - usually they do not need to be edited +################################################################ + +OUTPUTDIR=./${PROJECTNAME} +HARDWAREDEF=$OUTPUTDIR/$PROJECTNAME.sdk/${HARDWARENAME}_wrapper.hdf + +# SDK Directory. This is the place the SDK generated by the makesdk.sh script gets stored. +SDKDIR=$OUTPUTDIR/sdk +SDK_BITFILE=$SDKDIR/hardware.bit +SDK_MEMORYMAP=$SDKDIR/memorymap.csv +SDK_MEMORYINFO=$SDKDIR/memory.mmi +SDK_HARDWAREDEF=$SDKDIR/hardware.hdf +SDK_SYSTEMDEF=$SDKDIR/sysdef.xml + +# SOFTWARE +SW_SRCDIR=./${SOFTWARENAME} +SW_BUILDDIR=$OUTPUTDIR/build + +# temporary path used for working XSDK. The data stored at this directory will be processed by makesdk.sh +XSDKSDKDIR=$OUTPUTDIR/temp.sdk + +# programm paths +VIVADOVERSION=2016.3 +XILINXROOT=/opt/Xilinx +VIVADO=$XILINXROOT/Vivado/${VIVADOVERSION}/bin/vivado +XSDK=$XILINXROOT/SDK/${VIVADOVERSION}/bin/xsdk + +# Scripts +CREATEMBSDK_SCRIPT=./scripts/creatembsdk.tcl +CREATEARMSDK_SCRIPT=./scripts/createarmsdk.tcl +TCLSETTINGS=./scripts/settings.tcl +UPLOADSCRIPT=./scripts/upload2.tcl + +# Generate a TCL version of the settings that can be used by the TCL scripts +echo "# This file is auto-generated by settings.sh and contains a subset of that script in TCL syntax" > $TCLSETTINGS +echo "set OUTPUTDIR \"$OUTPUTDIR\"" >> $TCLSETTINGS +echo "set PROJECTNAME \"temp\"" >> $TCLSETTINGS +echo "set PROJECTDIR \"$OUTPUTDIR\"" >> $TCLSETTINGS +echo "set HARDWAREDEF \"$SDK_HARDWAREDEF\"" >> $TCLSETTINGS +echo "set BITSTREAM \"$SDK_BITFILE\"" >> $TCLSETTINGS + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/templates/bootloop.c b/src/scripts/templates/bootloop.c new file mode 100644 index 0000000..cbb8f11 --- /dev/null +++ b/src/scripts/templates/bootloop.c @@ -0,0 +1,17 @@ +// Xilinx Libraries +#include +#include +#include + +int main() +{ + Xil_ICacheEnable(); + Xil_DCacheEnable(); + + while(1); + + return 0; // Satisfy compiler +} + +// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/templates/microblaze.ld b/src/scripts/templates/microblaze.ld new file mode 100644 index 0000000..4a3cbee --- /dev/null +++ b/src/scripts/templates/microblaze.ld @@ -0,0 +1,212 @@ +/*******************************************************************/ +/* */ +/* This file IS BASED ON the */ +/* automatically generated by linker script generator. */ +/* by: */ +/* */ +/* Copyright (c) 2010-2016 Xilinx, Inc. All rights reserved. */ +/* */ +/* Description : MicroBlaze Linker Script */ +/* */ +/*******************************************************************/ + +_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x400; +_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x800; + +/* Define Memories in the system */ + +MEMORY +{ + mainmemory : ORIGIN = 0x00000000, LENGTH = 64K +} + +/* Specify the default entry point to the program */ + +ENTRY(_start) + +/* Define the sections, and where they are mapped in memory */ + +SECTIONS +{ +.vectors.reset 0x0 : { + KEEP (*(.vectors.reset)) +} + +.vectors.sw_exception 0x8 : { + KEEP (*(.vectors.sw_exception)) +} + +.vectors.interrupt 0x10 : { + KEEP (*(.vectors.interrupt)) +} + +.vectors.hw_exception 0x20 : { + KEEP (*(.vectors.hw_exception)) +} + +.text : { + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) +} > mainmemory + +.init : { + KEEP (*(.init)) +} > mainmemory + +.fini : { + KEEP (*(.fini)) +} > mainmemory + +.ctors : { + __CTOR_LIST__ = .; + ___CTORS_LIST___ = .; + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + ___CTORS_END___ = .; +} > mainmemory + +.dtors : { + __DTOR_LIST__ = .; + ___DTORS_LIST___ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + PROVIDE(__DTOR_END__ = .); + PROVIDE(___DTORS_END___ = .); +} > mainmemory + +.rodata : { + __rodata_start = .; + *(.rodata) + *(.rodata.*) + *(.gnu.linkonce.r.*) + __rodata_end = .; +} > mainmemory + +.sdata2 : { + . = ALIGN(8); + __sdata2_start = .; + *(.sdata2) + *(.sdata2.*) + *(.gnu.linkonce.s2.*) + . = ALIGN(8); + __sdata2_end = .; +} > mainmemory + +.sbss2 : { + __sbss2_start = .; + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + __sbss2_end = .; +} > mainmemory + +.data : { + . = ALIGN(4); + __data_start = .; + *(.data) + *(.data.*) + *(.gnu.linkonce.d.*) + __data_end = .; +} > mainmemory + +.got : { + *(.got) +} > mainmemory + +.got1 : { + *(.got1) +} > mainmemory + +.got2 : { + *(.got2) +} > mainmemory + +.eh_frame : { + *(.eh_frame) +} > mainmemory + +.jcr : { + *(.jcr) +} > mainmemory + +.gcc_except_table : { + *(.gcc_except_table) +} > mainmemory + +.sdata : { + . = ALIGN(8); + __sdata_start = .; + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + __sdata_end = .; +} > mainmemory + +.sbss (NOLOAD) : { + . = ALIGN(4); + __sbss_start = .; + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + . = ALIGN(8); + __sbss_end = .; +} > mainmemory + +.tdata : { + __tdata_start = .; + *(.tdata) + *(.tdata.*) + *(.gnu.linkonce.td.*) + __tdata_end = .; +} > mainmemory + +.tbss : { + __tbss_start = .; + *(.tbss) + *(.tbss.*) + *(.gnu.linkonce.tb.*) + __tbss_end = .; +} > mainmemory + +.bss (NOLOAD) : { + . = ALIGN(4); + __bss_start = .; + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + __bss_end = .; +} > mainmemory + +_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 ); + +_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); + +/* Generate Stack and Heap definitions */ + +.heap (NOLOAD) : { + . = ALIGN(8); + _heap = .; + _heap_start = .; + . += _HEAP_SIZE; + _heap_end = .; +} > mainmemory + +.stack (NOLOAD) : { + _stack_end = .; + . += _STACK_SIZE; + . = ALIGN(8); + _stack = .; + __stack = _stack; +} > mainmemory + +_end = .; +} + diff --git a/src/scripts/upload.tcl b/src/scripts/upload.tcl new file mode 100644 index 0000000..f196199 --- /dev/null +++ b/src/scripts/upload.tcl @@ -0,0 +1,35 @@ + +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +puts "\x1B\[1;36mUploading bitstream using Vivado Design Suite [version -short]\x1B\[0m" + +# Define environment +set BITSTREAM "[lindex $argv 0]" + +puts "\x1B\[1;34mUploading \x1B\[0;36m$BITSTREAM\x1B\[0m" + +open_hw +connect_hw_server +open_hw_target + +set_property PROGRAM.FILE $BITSTREAM [lindex [get_hw_devices xc7z020_1] 0] +current_hw_device [lindex [get_hw_devices xc7z020_1] 0] +refresh_hw_device -update_hw_probes false [lindex [get_hw_devices xc7z020_1] 0] + +set_property PROBES.FILE {} [lindex [get_hw_devices xc7z020_1] 0] +set_property PROGRAM.FILE $BITSTREAM [lindex [get_hw_devices xc7z020_1] 0] +program_hw_devices [lindex [get_hw_devices xc7z020_1] 0] +refresh_hw_device [lindex [get_hw_devices xc7z020_1] 0] + +puts "\x1B\[1;32mdone\x1B\[0m" + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/scripts/upload2.tcl b/src/scripts/upload2.tcl new file mode 100644 index 0000000..2beea83 --- /dev/null +++ b/src/scripts/upload2.tcl @@ -0,0 +1,140 @@ + +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +puts "\x1B\[1;36mUploading system using XSCT\x1B\[0m" + +source ./scripts/settings.tcl +source $PROJECTDIR/sdk/ps7_init.tcl + +connect + + +# ARM 0 +puts "\x1B\[1;34mUploading software \x1B\[0;36mfirmware_arm0\x1B\[0m" +targets -set -filter {name =~ "ARM*#0"} +rst + +loadhw $HARDWAREDEF +ps7_init +ps7_post_config + +dow -clear $OUTPUTDIR/firmware_arm0.elf +if { [ catch { verify $OUTPUTDIR/firmware_arm0.elf } ERROR ] } { + puts stderr "\x1B\[1;31mVerifying $OUTPUTDIR/firmware_arm0.elf upload failed!\n\t$ERROR" + exit 1 +} + +######################### +#set BINARIES [ glob -directory $OUTPUTDIR -type f *.bin ] +#foreach BINARYPATH $BINARIES { +# set BINARYNAME [file tail $BINARYPATH] +# if { [ string match "firmware_mb0.*.bin" $BINARYNAME ] } { +# regexp {\.(.*)\.} "$BINARYNAME" -> ADDRESS +# puts "\t\x1B\[1;34mUploading \x1B\[0;36m$BINARYNAME\x1B\[1;34m to address \x1B\[1;35m0x$ADDRESS\x1B\[0m" +# +# dow -data $OUTPUTDIR/$BINARYNAME "0x00100000" +# } +#} +#set BINARIES [ glob -directory $OUTPUTDIR -type f *.bin ] +#foreach BINARYPATH $BINARIES { +# set BINARYNAME [file tail $BINARYPATH] +# if { [ string match "firmware_mb1.*.bin" $BINARYNAME ] } { +# regexp {\.(.*)\.} "$BINARYNAME" -> ADDRESS +# puts "\t\x1B\[1;34mUploading \x1B\[0;36m$BINARYNAME\x1B\[1;34m to address \x1B\[1;35m0x$ADDRESS\x1B\[0m" +# +# dow -data $OUTPUTDIR/$BINARYNAME "0x00200000" +# } +#} +######################### + +con + +# ARM 1 +#targets -set -filter {name =~ "ARM*#1"} + + +# FPGA +puts "\x1B\[1;34mUploading hardware \x1B\[0;36m$BITSTREAM\x1B\[0m" +targets -set -filter {name =~ "xc7z020"} +fpga $BITSTREAM + + +# Upload the MicroBlaze software + +# MicroBlaze 0 +puts "\x1B\[1;34mUploading software \x1B\[0;36mfirmware_mb0\x1B\[0m" +targets -set -filter {name =~ "MicroBlaze*#0"} +rst + +# Find all binaries and filter those with explicit addresses and upload them +set BINARIES [ glob -directory $OUTPUTDIR -type f *.elf ] +foreach BINARYPATH $BINARIES { + set BINARYNAME [file tail $BINARYPATH] + if { [ string match "firmware_mb0.*.elf" $BINARYNAME ] } { + regexp {\.(.*)\.} "$BINARYNAME" -> ADDRESS + puts "\t\x1B\[1;34mUploading \x1B\[0;36m$BINARYNAME\x1B\[1;34m to address \x1B\[1;35m0x$ADDRESS\x1B\[0m" + + dow -clear $OUTPUTDIR/$BINARYNAME + + if { [ catch { verify $OUTPUTDIR/$BINARYNAME } ERROR ] } { + puts stderr "\x1B\[1;31mVerifying $OUTPUTDIR/$BINARYNAME upload failed!\n\t$ERROR" + exit 1 + } + } +} + +puts "\t\x1B\[1;34mUploading FSBL \x1B\[0;36m$OUTPUTDIR/firmware_mb0.elf\x1B\[0m" +dow -clear $OUTPUTDIR/firmware_mb0.elf +if { [ catch { verify $OUTPUTDIR/firmware_mb0.elf } ERROR ] } { + puts stderr "\x1B\[1;31mVerifying $OUTPUTDIR/firmware_mb0.elf upload failed!\n\t$ERROR" + exit 1 +} + +con + +# MicroBlaze 1 +puts "\x1B\[1;34mUploading software \x1B\[0;36mfirmware_mb1\x1B\[0m" +targets -set -filter {name =~ "MicroBlaze*#1"} + +# Find all binaries and filter those with explicit addresses and upload them +set BINARIES [ glob -directory $OUTPUTDIR -type f *.elf ] +foreach BINARYPATH $BINARIES { + set BINARYNAME [file tail $BINARYPATH] + if { [ string match "firmware_mb1.*.elf" $BINARYNAME ] } { + regexp {\.(.*)\.} "$BINARYNAME" -> ADDRESS + puts "\t\x1B\[1;34mUploading \x1B\[0;36m$BINARYNAME\x1B\[1;34m to address \x1B\[1;35m0x$ADDRESS\x1B\[0m" + + dow -clear $OUTPUTDIR/$BINARYNAME + + if { [ catch { verify $OUTPUTDIR/$BINARYNAME } ERROR ] } { + puts stderr "\x1B\[1;31mVerifying $OUTPUTDIR/$BINARYNAME upload failed!\n\t$ERROR" + exit 1 + } + } +} + +puts "\t\x1B\[1;34mUploading FSBL \x1B\[0;36m$OUTPUTDIR/firmware_mb1.elf\x1B\[0m" +dow -clear $OUTPUTDIR/firmware_mb1.elf +if { [ catch { verify $OUTPUTDIR/firmware_mb1.elf } ERROR ] } { + puts stderr "\x1B\[1;31mVerifying $OUTPUTDIR/firmware_mb1.elf upload failed!\n\t$ERROR" + exit 1 +} + +con + + + +disconnect + +puts "\x1B\[1;32mdone\x1B\[0m" + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + diff --git a/src/upload.sh b/src/upload.sh new file mode 100755 index 0000000..29f1c7c --- /dev/null +++ b/src/upload.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# +# Version: 1.0.0 +# +# Changelog: +# 1.0.0 - 11.03.19: First release +# +# Contributors: +# Ralf Stemmer - ralf.stemmer@uni-oldenburg.de +# + +source ./scripts/settings.sh + +echo -e "\e[1;34mExecuting upload process \e[0;36m…" +LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21:/usr/local/lib $XSDK -batch -source $UPLOADSCRIPT +if [ $? -ne 0 ] ; then + echo -e "\e[1;31mFAILED!\e[0m" + exit 1 +else + echo -e "\e[1;32mSucceeded\e[0m" +fi + +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + -- GitLab