diff --git a/.travis.yml b/.travis.yml index db0c7469..7486ae36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,13 +10,14 @@ sudo: false addons: apt: packages: - - realpath - build-essential + - fxload - gnupg + - libftdi-dev - libreadline-dev - libusb-1.0-0-dev - python-yaml - - fxload + - realpath env: matrix: diff --git a/Makefile b/Makefile index 2e056749..5a781f6e 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ export PYTHONHASHSEED=0 BOARD ?= atlys MSCDIR ?= third_party/misoc -PROG ?= impact +PROG ?= openocd TARGET ?= hdmi2usb FILTER ?= tee diff --git a/firmware/fx2/download.sh b/firmware/fx2/download.sh index 533ab0f7..d3fca761 100755 --- a/firmware/fx2/download.sh +++ b/firmware/fx2/download.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -DEVS=$(lsusb|grep -E '(04b4|1d50|fb9a|1443)' |sed 's/:.*//;s/Bus //;s/Device //;s/ /\//') +DEVS=$(lsusb|grep -E '(16c0|04b4|1d50|fb9a|1443)' |sed 's/:.*//;s/Bus //;s/Device //;s/ /\//') if [ -z "$1" ]; then echo "$0: usage: $0 " diff --git a/platforms/atlys.py b/platforms/atlys.py index 088d0179..1ef85fac 100644 --- a/platforms/atlys.py +++ b/platforms/atlys.py @@ -2,7 +2,14 @@ from mibuild.generic_platform import * from mibuild.xilinx import XilinxPlatform -from mibuild.xilinx import XC3SProg, iMPACT, Adept, UrJTAG + +from mibuild.openocd import OpenOCD +# Alternative programmers +from mibuild.xilinx import Adept +from mibuild.xilinx import UrJTAG +from mibuild.xilinx import XC3SProg +from mibuild.xilinx import iMPACT + # There appear to be 4 x LTC2481C on the U1-SCL / U1-SDA lines connected to the Cypress @@ -580,7 +587,11 @@ def __init__(self, programmer="xc3sprog"): self.add_platform_command("""CONFIG VCCAUX="2.5";""") def create_programmer(self): - if self.programmer == "xc3sprog": + # Preferred programmer - Needs ixo-usb-jtag and latest openocd. + if self.programmer == "openocd": + return OpenOCD(config="board/digilent_atlys.cfg") + # Alternative programmers - not regularly tested. + elif self.programmer == "xc3sprog": return XC3SProg("jtaghs1_fast", "bscan_spi_digilent_atlys.bit") elif self.programmer == "impact": return iMPACT() diff --git a/platforms/opsis.py b/platforms/opsis.py index b913bf10..2503d9b8 100644 --- a/platforms/opsis.py +++ b/platforms/opsis.py @@ -2,7 +2,10 @@ from mibuild.generic_platform import * from mibuild.xilinx import XilinxPlatform -from mibuild.xilinx import XC3SProg, iMPACT, Adept, UrJTAG + +from mibuild.openocd import OpenOCD +from mibuild.xilinx import UrJTAG +from mibuild.xilinx import iMPACT _io = [ ## FXO-HC536R - component U17 @@ -329,7 +332,7 @@ class Platform(XilinxPlatform): default_clk_period = 10.0 hdmi_infos = _hdmi_infos - def __init__(self, programmer="xc3sprog"): + def __init__(self, programmer="openocd"): # XC6SLX45T-3FGG484C XilinxPlatform.__init__(self, "xc6slx45t-fgg484-3", _io, _connectors) @@ -351,15 +354,14 @@ def __init__(self, programmer="xc3sprog"): self.add_platform_command("""CONFIG VCCAUX="3.3";""") def create_programmer(self): - if self.programmer == "xc3sprog": - return XC3SProg("jtaghs1_fast", "bscan_spi_numato_opsis.bit") + # Preferred programmer - Needs ixo-usb-jtag and latest openocd. + if self.programmer == "openocd": + return OpenOCD(config="board/numato_opsis.cfg") + # Alternative programmers - not regularly tested. + elif self.programmer == "urjtag": + return UrJTAG(cable="USBBlaster") elif self.programmer == "impact": return iMPACT() - elif self.programmer == "fpgalink": - from mibuild.fpgalink_programmer import FPGALink - return FPGALink("1443:0007") - elif self.programmer == "urjtag": - return UrJTAG(cable="USBBlaster", pld="spartan-6") else: raise ValueError("{} programmer is not supported".format(self.programmer)) diff --git a/scripts/52-hdmi2usb.rules b/scripts/52-hdmi2usb.rules index 775b6c6b..13de9987 100644 --- a/scripts/52-hdmi2usb.rules +++ b/scripts/52-hdmi2usb.rules @@ -1,11 +1,17 @@ +# The ENV{ID_MM_DEVICE_IGNORE}="1" part will make modem-manager ignore the +# device. + # Grant permission to makestuff usb devices. -ATTR{idVendor}=="1d50", MODE:="666" +ATTR{idVendor}=="1d50", MODE:="666", ENV{ID_MM_DEVICE_IGNORE}="1" # Grant permissions to hdmi2usb usb devices. -ATTR{idVendor}=="fb9a", MODE:="666" +ATTR{idVendor}=="fb9a", MODE:="666", ENV{ID_MM_DEVICE_IGNORE}="1" # Grant permissions to unconfigured cypress chips. -ATTR{idVendor}=="04b4", MODE:="666" +ATTR{idVendor}=="04b4", MODE:="666", ENV{ID_MM_DEVICE_IGNORE}="1" # Grant permissions to Digilent Development board JTAG -ATTR{idVendor}=="1443", MODE:="666" +ATTR{idVendor}=="1443", MODE:="666", ENV{ID_MM_DEVICE_IGNORE}="1" + +# Grant permissions to Numato usb devices. +ATTR{idVendor}=="2a19", MODE:="666", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/scripts/get-env-root.sh b/scripts/get-env-root.sh index d36a9fad..408aa56b 100755 --- a/scripts/get-env-root.sh +++ b/scripts/get-env-root.sh @@ -30,7 +30,7 @@ apt-get install -y iverilog gtkwave # Nothing needed # libfpgalink -sudo apt-get install -y libreadline-dev libusb-1.0-0-dev python-yaml sdcc fxload +sudo apt-get install -y libreadline-dev libusb-1.0-0-dev libftdi-dev python-yaml fxload # Load custom udev rules ( @@ -43,3 +43,4 @@ sudo apt-get install -y software-properties-common sudo add-apt-repository -y ppa:timvideos/fpga-support sudo apt-get update sudo apt-get install -y vizzini-dkms +sudo apt-get install -y ixo-usb-jtag diff --git a/scripts/get-env.sh b/scripts/get-env.sh index 3a770b66..4be97e42 100755 --- a/scripts/get-env.sh +++ b/scripts/get-env.sh @@ -1,5 +1,7 @@ #!/bin/bash +CALLED=$_ +[[ "${BASH_SOURCE[0]}" != "${0}" ]] && SOURCED=1 || SOURCED=0 SETUP_SRC=$(realpath ${BASH_SOURCE[0]}) SETUP_DIR=$(dirname $SETUP_SRC) @@ -7,9 +9,14 @@ TOP_DIR=$(realpath $SETUP_DIR/..) BUILD_DIR=$TOP_DIR/build THIRD_DIR=$TOP_DIR/third_party -set -x set -e +if [ $SOURCED = 1 ]; then + echo "You must run this script, rather then try to source it." + echo "$SETUP_SRC" + return +fi + echo " This script is: $SETUP_SRC" echo " Firmware directory: $TOP_DIR" echo " Build directory is: $BUILD_DIR" @@ -26,14 +33,12 @@ fi # Save the passphrase to a file so we don't echo it in the logs XILINX_PASSPHRASE_FILE=$(tempfile) trap "rm -f -- '$XILINX_PASSPHRASE_FILE'" EXIT -set +x if [ ! -z "$XILINX_PASSPHRASE" ]; then echo $XILINX_PASSPHRASE >> $XILINX_PASSPHRASE_FILE else rm $XILINX_PASSPHRASE_FILE trap - EXIT fi -set -x # -------- if [ -f $XILINX_PASSPHRASE_FILE ]; then @@ -84,7 +89,36 @@ else fi echo " Xilinx directory is: $XILINX_DIR/opt/Xilinx/" -# gcc+binutils for the target +function check_version { + TOOL=$1 + VERSION=$2 + if $TOOL --version 2>&1 | grep -q $VERSION > /dev/null; then + echo "$TOOL found at $VERSION" + return 0 + else + $TOOL --version + echo "$TOOL (version $VERSION) *NOT* found" + echo "Please try running the $SETUP_DIR/get-env.sh script again." + return 1 + fi +} + +function check_import { + MODULE=$1 + if python3 -c "import $MODULE"; then + echo "$MODULE found" + return 0 + else + echo "$MODULE *NOT* found!" + echo "Please try running the $SETUP_DIR/get-env.sh script again." + return 1 + fi +} + +# Install and setup conda for downloading packages +echo "" +echo "Install modules from conda" +echo "---------------------------" CONDA_DIR=$BUILD_DIR/conda export PATH=$CONDA_DIR/bin:$PATH ( @@ -97,12 +131,36 @@ export PATH=$CONDA_DIR/bin:$PATH conda update -q conda fi conda config --add channels timvideos +) + +# binutils for the target +( conda install binutils-lm32-elf +) +check_version lm32-elf-ld 2.25.1 + +# gcc+binutils for the target +( conda install gcc-lm32-elf +) +check_version lm32-elf-gcc 4.9.3 + +# sdcc for compiling Cypress FX2 firmware +( conda install sdcc ) +check_version sdcc 3.5.0 + +# openocd for programming via Cypress FX2 +( + conda install openocd +) +check_version openocd 0.10.0-dev-00044-g3edb157 # git submodules +echo "" +echo "Updating git submodules" +echo "-----------------------" ( cd $TOP_DIR git submodule update --recursive --init @@ -119,7 +177,7 @@ MIGEN_DIR=$THIRD_DIR/migen #sudo make install ) export PYTHONPATH=$MIGEN_DIR:$PYTHONPATH -python3 -c "import migen" +check_import migen # misoc MISOC_DIR=$THIRD_DIR/misoc @@ -129,8 +187,8 @@ MISOC_DIR=$THIRD_DIR/misoc make ) export PYTHONPATH=$MISOC_DIR:$PYTHONPATH -$MISOC_DIR/tools/flterm --help -python3 -c "import misoclib" +$MISOC_DIR/tools/flterm --help 2> /dev/null +check_import misoclib # liteeth LITEETH_DIR=$THIRD_DIR/liteeth @@ -139,26 +197,9 @@ LITEETH_DIR=$THIRD_DIR/liteeth true ) export PYTHONPATH=$LITEETH_DIR:$PYTHONPATH -python3 -c "import liteeth" - -# libfpgalink -MAKESTUFF_DIR=$BUILD_DIR/makestuff -( - if [ ! -d $MAKESTUFF_DIR ]; then - cd $BUILD_DIR - wget -qO- http://tiny.cc/msbil | tar zxf - - cd makestuff/libs - ../scripts/msget.sh makestuff/libfpgalink - cd libfpgalink - else - cd $MAKESTUFF_DIR - cd libs/libfpgalink - fi - make deps 2>&1 | grep -E "^make" -) -export LD_LIBRARY_PATH=$MAKESTUFF_DIR/libs/libfpgalink/lin.x64/rel:$LD_LIBRARY_PATH -export PYTHONPATH=$MAKESTUFF_DIR/libs/libfpgalink/examples/python/:$PYTHONPATH -python3 -c "import fl" +check_import liteeth +echo "-----------------------" +echo "" echo "Completed. To load environment:" echo "source HDMI2USB-misoc-firmware/scripts/setup-env.sh" diff --git a/scripts/setup-env.sh b/scripts/setup-env.sh index 4aaf1dd0..a2707d3b 100755 --- a/scripts/setup-env.sh +++ b/scripts/setup-env.sh @@ -9,11 +9,10 @@ TOP_DIR=$(realpath $SETUP_DIR/..) BUILD_DIR=$TOP_DIR/build THIRD_DIR=$TOP_DIR/third_party - if [ $SOURCED = 0 ]; then - echo "You must source this script, rather then try and run it." - echo ". $SETUP_SRC" - exit 1 + echo "You must source this script, rather then try and run it." + echo ". $SETUP_SRC" + exit 1 fi if [ ! -z $HDMI2USB_ENV ]; then @@ -56,31 +55,74 @@ echo " Xilinx directory is: $XILINX_DIR/opt/Xilinx/" # understands the $MISOC_EXTRA_CMDLINE option. export PATH=$PATH:$XILINX_DIR/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64 -# gcc+binutils for the target +function check_version { + TOOL=$1 + VERSION=$2 + if $TOOL --version 2>&1 | grep -q $VERSION > /dev/null; then + echo "$TOOL found at $VERSION" + return 0 + else + $TOOL --version + echo "$TOOL (version $VERSION) *NOT* found" + echo "Please try running the $SETUP_DIR/get-env.sh script again." + return 1 + fi +} + +function check_import { + MODULE=$1 + if python3 -c "import $MODULE"; then + echo "$MODULE found" + return 0 + else + echo "$MODULE *NOT* found!" + echo "Please try running the $SETUP_DIR/get-env.sh script again." + return 1 + fi +} + +# Install and setup conda for downloading packages +echo "" +echo "Checking modules from conda" +echo "---------------------------" CONDA_DIR=$BUILD_DIR/conda export PATH=$CONDA_DIR/bin:$PATH +# binutils for the target +check_version lm32-elf-ld 2.25.1 || return 1 + +# gcc+binutils for the target +check_version lm32-elf-gcc 4.9.3 || return 1 + +# sdcc for compiling Cypress FX2 firmware +check_version sdcc 3.5.0 || return 1 + +# openocd for programming via Cypress FX2 +check_version openocd 0.10.0-dev-00044-g3edb157 || return 1 + +# git submodules +echo "" +echo "Checking git submodules" +echo "-----------------------" + # migen MIGEN_DIR=$THIRD_DIR/migen export PYTHONPATH=$MIGEN_DIR:$PYTHONPATH -python3 -c "import migen" || (echo "migen broken"; return) +check_import migen || return 1 # misoc MISOC_DIR=$THIRD_DIR/misoc export PYTHONPATH=$MISOC_DIR:$PYTHONPATH -$MISOC_DIR/tools/flterm --help || (echo "misoc flterm broken"; return) -python3 -c "import misoclib" || (echo "misoc broken"; return) +$MISOC_DIR/tools/flterm --help 2> /dev/null || (echo "misoc flterm broken" && return 1) +check_import misoclib || return 1 # liteeth LITEETH_DIR=$THIRD_DIR/liteeth export PYTHONPATH=$LITEETH_DIR:$PYTHONPATH -python3 -c "import liteeth" || (echo "liteeth broken"; return) +check_import liteeth || return 1 -# libfpgalink -MAKESTUFF_DIR=$BUILD_DIR/makestuff -export LD_LIBRARY_PATH=$MAKESTUFF_DIR/libs/libfpgalink/lin.x64/rel:$LD_LIBRARY_PATH -export PYTHONPATH=$MAKESTUFF_DIR/libs/libfpgalink/examples/python/:$PYTHONPATH -python3 -c "import fl" || (echo "libfpgalink broken"; return) +echo "-----------------------" +echo "" alias python=python3