diff --git a/env.bin b/env.bin new file mode 100755 index 0000000..61ac37d Binary files /dev/null and b/env.bin differ diff --git a/env.txt b/env.txt new file mode 100644 index 0000000..c6c0191 --- /dev/null +++ b/env.txt @@ -0,0 +1,59 @@ +bootdelay=1 +ipaddr=10.11.12.13 +serverip=10.11.12.1 +bootenv=uEnv.txt +fdt_high=0x20000000 +kernel_image=uImage +old_bitstream_image=parallella.bit.bin +old_devicetree_image=devicetree.dtb +loadbootenv_addr=0x2000000 + +slowblink=led 0 toggle && sleep 1 && led 0 toggle && sleep 1 || true + +loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv} + +importbootenv=echo Importing environment from SD ...; \ + env import -t ${loadbootenv_addr} $filesize + +importbootenvtftp=echo Importing environment from TFTP ...; \ + env import -t ${loadbootenv_addr} $filesize + +preboot=\ + if mmcinfo; then \ + led 0 on; \ + run slowblink; \ + env set modeboot sdboot_old; \ + run loadbootenv && \ + run importbootenv && \ + env set modeboot sdboot; \ + else \ + led 0 off; \ + env set modeboot tftpboot; \ + fi; + +sdboot_old=\ + echo Legacy boot from SD card...; \ + load mmc 0 0x4000000 ${old_bitstream_image} && \ + fpga load 0 0x4000000 $filesize && \ + run slowblink; \ + load mmc 0 0x3000000 ${kernel_image} && \ + load mmc 0 0x2A00000 ${old_devicetree_image} && \ + run slowblink && \ + bootm 0x3000000 - 0x2A00000; \ + led 0 off + +tftpboot=\ + while true; do \ + echo TFTPing second stage boot script... && \ + tftpboot ${loadbootenv_addr} ${bootenv} && \ + run importbootenvtftp && \ + run tftpboot_stage2; \ + done + +bootcmd=run $modeboot + +# STDIO +baudrate=115200 +stderr=serial +stdin=serial +stdout=serial diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..ec76ec2 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +backup diff --git a/linux/BOOT.7z020.bin b/linux/BOOT.7z020.bin new file mode 100755 index 0000000..1065a2c Binary files /dev/null and b/linux/BOOT.7z020.bin differ diff --git a/linux/README.md b/linux/README.md new file mode 100644 index 0000000..3cc5373 --- /dev/null +++ b/linux/README.md @@ -0,0 +1,28 @@ +linux-flash +=========== + +This script can be used to flash a live Parallella system from the command +line in linux. + +File | Description +---------------|--------------------------------------------------------------- +linux-flash.sh | Flash script + | +backup | The flash script will place backups here + | +BOOT.7z020.bin | Boot flash image. Created by ../mkbootflash.sh + | +env.bin | Created with: + | uboot/tools/mkenvimage -s 0x20000 -o env.bin ../env.txt + | +getfpga | Print on-board FPGA-type (e.g. "7z010" "7z020" ...) +getfpga.c | gcc getfpga.c -o getfpga + | + | +fw_printenv | Tools to read and write uboot environment partition +fw_setenv | +uboot--.patch | Patch that embeds Parallella flash configuration in above + | two binaries. + | +md5sum.txt | Checksum file linux-flash.sh uses to verify that the files to + | be flashed are not corrupt. diff --git a/linux/backup/.gitkeep b/linux/backup/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/linux/env.bin b/linux/env.bin new file mode 100755 index 0000000..61ac37d Binary files /dev/null and b/linux/env.bin differ diff --git a/linux/fw_printenv b/linux/fw_printenv new file mode 100755 index 0000000..19a172f Binary files /dev/null and b/linux/fw_printenv differ diff --git a/linux/fw_setenv b/linux/fw_setenv new file mode 100755 index 0000000..19a172f Binary files /dev/null and b/linux/fw_setenv differ diff --git a/linux/getfpga b/linux/getfpga new file mode 100755 index 0000000..2ec4c90 Binary files /dev/null and b/linux/getfpga differ diff --git a/linux/getfpga.c b/linux/getfpga.c new file mode 100755 index 0000000..c407f30 --- /dev/null +++ b/linux/getfpga.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include + +#define SLCR_IDCODE_MASK 0x1F000 +#define SLCR_IDCODE_SHIFT 12 + +#define SLCR_BASE 0xF8000000 +#define PSS_IDCODE_OFFS 0x530 + +#define XILINX_ZYNQ_7010 0x2 +#define XILINX_ZYNQ_7015 0x1b +#define XILINX_ZYNQ_7020 0x7 +#define XILINX_ZYNQ_7030 0xc +#define XILINX_ZYNQ_7035 0x12 +#define XILINX_ZYNQ_7045 0x11 +#define XILINX_ZYNQ_7100 0x16 + +int decode(uint32_t idcode) +{ + int ret; + + idcode = (idcode & SLCR_IDCODE_MASK) >> SLCR_IDCODE_SHIFT; + + switch (idcode) { + case XILINX_ZYNQ_7010: + printf("7z010\n"); + return 0; + case XILINX_ZYNQ_7015: + printf("7z015\n"); + return 0; + case XILINX_ZYNQ_7020: + printf("7z020\n"); + return 0; + case XILINX_ZYNQ_7030: + printf("7z030\n"); + return 0; + case XILINX_ZYNQ_7035: + printf("7z035\n"); + return 0; + case XILINX_ZYNQ_7045: + printf("7z045\n"); + return 0; + case XILINX_ZYNQ_7100: + printf("7z100\n"); + return 0; + + default: + printf("unknown\n"); + return 1; + } +} + +int main() +{ + uint32_t *slcr, *pss_idcode; + int ret, fd; + + fd = open("/dev/mem", O_RDONLY | O_SYNC); + if (fd < 0) { + fprintf(stderr, "Could not open /dev/mem\n"); + return 1; + } + + slcr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, SLCR_BASE); + if (slcr == MAP_FAILED) { + fprintf(stderr, "mmap failed\n"); + return 1; + } + + pss_idcode = (uint32_t *) + ((uintptr_t) slcr + (uintptr_t) PSS_IDCODE_OFFS); + + ret = decode(*pss_idcode); + + munmap(slcr, 4096); + close(fd); + + return ret; +} diff --git a/linux/linux-flash.sh b/linux/linux-flash.sh new file mode 100755 index 0000000..e0cba32 --- /dev/null +++ b/linux/linux-flash.sh @@ -0,0 +1,227 @@ +#!/bin/bash +set -e + +DEFAULT_ETHADDR="04:4f:8b:00:00:00" + +BOOT_MD5="08f0fb4f4fbfe5086d8aba6cacece68a" + +ENV_MD5="2e2cd0f10a6c8f7d836d0d752507f9b2" +ENV_FILE="env.bin" + +BAK_SUFFIX=.$(date +"%Y%m%d%H%M%S").bak.gz + +BOOT_BAK=backup/BOOT.bin${BAK_SUFFIX} +ENV_BAK=backup/env.bin${BAK_SUFFIX} + +# Helper functions +which_() { + ret=0 + for p in $@; do + if ! which $p 1>/dev/null; then + echo ERROR: no $p in path + ret=1 + fi + done + return $ret +} + +i2cdetect_() { + i2cdetect -r -y 0 $1 $1 >/dev/null || return 1 + + if ! i2cdetect -r -y 0 $1 $1 | grep -q -- "--"; then + return 0 + else + return 1 + fi +} + +getvariant() { + if i2cdetect_ 0x2f; then + echo "fmcomms" + elif i2cdetect_ 0x39; then + echo "hdmi" + else + echo "headless" + fi +} + +cd $(dirname $(readlink -f $0)) +PATH=$(pwd):${PATH} + +if ! [ "x$(id -u)" = "x0" ]; then + echo ERROR: Must run script as root + exit 1 +fi + +# Check that all needed programs are installed +if ! which_ i2cdetect getfpga fw_printenv fw_setenv strings md5sum grep stat \ + od tr sed cut gzip zcat; then + echo ERROR: One or more required programs missing. + exit 1 +fi + +# Probe system +if ! [ -e /proc/device-tree/compatible ]; then + echo ERROR: No device tree + exit 1 +fi + +if ! grep -q adapteva,parallella /proc/device-tree/compatible; then + echo ERROR: Not a parallella board + exit 1 +fi + +if ! ./getfpga 2>/dev/null 1>/dev/null; then + echo ERROR: Did not find ZYNQ FPGA. + exit 1 +fi + +FPGA_MODEL=$(./getfpga) +echo -e "FPGA Model:\t${FPGA_MODEL}" + +case ${FPGA_MODEL} in +7z010|7z020) + ;; +*) + echo ERROR: FPGA model not supported + exit 1 + ;; +esac + +# TODO: Figure out if we actually need to probe board variant. Do it but ignore +# the result for now. +VARIANT=$(getvariant $FPGA_MODEL) +echo -e "Board variant:\t${VARIANT} (ignoring)" + +BOOT_FILE="BOOT.${FPGA_MODEL}.bin" + +if ! [ -e ${BOOT_FILE} ]; then + echo ERROR: ${BOOT_FILE} does not exist + exit 1 +fi +if ! [ -e ${ENV_FILE} ]; then + echo ERROR: ${ENV_FILE} does not exist + exit 1 +fi + +if ! md5sum --quiet -c md5sum.txt; then + echo ERROR: md5sum check failed. + exit 1 +fi + +if ! [ -e /dev/mtdblock0 ]; then + echo ERROR: No mtdblock0 + exit 1 +fi +if ! [ -e /dev/mtdblock1 ]; then + echo ERROR: No mtdblock1 + exit 1 +fi + +echo + +echo Prepared to start flashing Parallella 7z020 board +echo "Press [Ctrl-C] to abort" +echo WARNING: DO NOT TURN OFF BOARD WHILE FLASHING!! +read -p "Write 'YES' (all caps) if you understand: " confirm +echo + +if ! [ "x${confirm}" = "xYES" ]; then + echo ERROR: Expected 'YES'. Try again + exit 1 +fi + + +BOOT_SIZE=$(stat -c%s "${BOOT_FILE}") +ENV_SIZE=$(stat -c%s "${ENV_FILE}") + + +mkdir -p backup +echo Backing up boot image to \"$(pwd)/${BOOT_BAK}\" ... +dd status=none if=/dev/mtdblock0 bs=64k | gzip -c > ${BOOT_BAK} || exit 1 +echo Backing up environment image to \"$(pwd)/${ENV_BAK}\" ... +dd status=none if=/dev/mtdblock1 bs=64k | gzip -c > ${ENV_BAK} || exit 1 +echo + +FLASHED_BOOT_SIZE=$(zcat ${BOOT_BAK} | wc --bytes) +FLASHED_ENV_SIZE=$(zcat ${ENV_BAK} | wc --bytes) + +if [ ${BOOT_SIZE} -gt ${FLASHED_BOOT_SIZE} ]; then + echo ERROR: Boot partition will not fit boot image + exit 1 +fi + +if [ ${ENV_SIZE} -gt ${FLASHED_ENV_SIZE} ]; then + echo ERROR: Environment partition will not fit environment image + exit 1 +fi + +sync + +echo WARNING: DO NOT TURN OFF BOARD WHILE FLASHING!! +echo Flashing... This will take a couple of minutes. Stay tuned. + +echo BOOT image... +dd status=none if=${BOOT_FILE} of=/dev/mtdblock0 bs=64k +echo ENVIRONMENT image... +dd status=none if=${ENV_FILE} of=/dev/mtdblock1 bs=64k + +echo Done. +echo + +echo Reading back to verify result... + +FLASHED_BOOT_MD5=$(dd status=none if=/dev/mtdblock0 bs=${BOOT_SIZE} count=1 | + md5sum | cut -f1 -d" ") +if ! [ ${FLASHED_BOOT_MD5} = ${BOOT_MD5} ]; then + echo ERROR: ${BOOT_FILE}: Checksum does not match. + echo Try flashing again. + echo Do not turn off board. + echo Contact support. + exit 1 +fi +echo BOOT block OK + +FLASHED_ENV_MD5=$(dd status=none if=/dev/mtdblock1 bs=${ENV_SIZE} count=1 | + md5sum | cut -f1 -d" ") +if ! [ ${FLASHED_ENV_MD5} = ${ENV_MD5} ]; then + echo ERROR: ${ENV_FILE}: Checksum does not match. + echo ${FLASHED_ENV_MD5} + echo ${ENV_MD5} + echo Try flashing again. + echo Do NOT turn off board. + echo Contact support. + exit 1 +fi +echo ENVIRONMENT block OK + +echo +echo Extracting board data from old environment... +SKU=$(zcat ${ENV_BAK} | strings | grep AdaptevaSKU | head -n1 | cut -f2 -d "=") +ETHADDR=$(zcat ${ENV_BAK} | strings | grep ethaddr | head -n1 | cut -f2 -d "=") + +if [ "x${ETHADDR}" = "x" ]; then + echo Ethernet address not found in environment... + ETHADDR=$(cat /sys/class/net/eth0/address 2>/dev/null | tr '[:upper:]' '[:lower:]' || true) +fi +if [ "x${ETHADDR}" = "x" -o "x${ETHADDR}" = "x${DEFAULT_ETHADDR}" ]; then + # Use board prefix but randomize lower three bytes + ETHADDR=$(od -A n -t x -N 4 /dev/urandom | tr -d ' ' | + sed -e 's,\(..\)\(..\)\(..\)\(..\),04:4f:8b:\1:\2:\3,g') + echo Randomizing MAC address. New MAC address: ${ETHADDR} +fi + +if [ "x${SKU}" = "x" ]; then + echo No SKU found. Skipping +else + echo Setting SKU to ${SKU} + ./fw_setenv AdaptevaSKU ${SKU} +fi + +echo Setting MAC address to ${ETHADDR} +./fw_setenv ethaddr ${ETHADDR} + +echo +echo Flash successful. Power-cycle your board. + + diff --git a/linux/md5sum.txt b/linux/md5sum.txt new file mode 100755 index 0000000..7fcfe82 --- /dev/null +++ b/linux/md5sum.txt @@ -0,0 +1,2 @@ +08f0fb4f4fbfe5086d8aba6cacece68a BOOT.7z020.bin +2e2cd0f10a6c8f7d836d0d752507f9b2 env.bin diff --git a/linux/uboot-0001-boards-adapteva-parallella-Embed-configuration-in-fw.patch b/linux/uboot-0001-boards-adapteva-parallella-Embed-configuration-in-fw.patch new file mode 100755 index 0000000..9a0c2ba --- /dev/null +++ b/linux/uboot-0001-boards-adapteva-parallella-Embed-configuration-in-fw.patch @@ -0,0 +1,58 @@ +From 732fc1f52151dfbe5a0b9ebe5c04f8f7385cdb7b Mon Sep 17 00:00:00 2001 +From: Ola Jeppsson +Date: Thu, 7 May 2015 22:53:37 +0000 +Subject: [PATCH] boards/adapteva/parallella: Embed configuration in + fw_setenv/fw_printenv + +This patch embeds Parallella mtd flash configuration in the +fw_*env binaries so there we don't need to ship a separate +configuartion file. + +make adapteva_parallella_defconfig && make env + +Symlink fw_setenv to fw_printenv. + +Signed-off-by: Ola Jeppsson +--- + tools/env/fw_env.h | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h +index d6faf34..498c3ac 100644 +--- a/tools/env/fw_env.h ++++ b/tools/env/fw_env.h +@@ -21,20 +21,20 @@ + * See included "fw_env.config" sample file + * for notes on configuration. + */ +-#define CONFIG_FILE "/etc/fw_env.config" ++/* #define CONFIG_FILE "/etc/fw_env.config" */ + + #ifndef CONFIG_FILE +-#define HAVE_REDUND /* For systems with 2 env sectors */ +-#define DEVICE1_NAME "/dev/mtd1" +-#define DEVICE2_NAME "/dev/mtd2" ++#undef HAVE_REDUND /* For systems with 2 env sectors */ ++#define DEVICE1_NAME "/dev/mtdblock1" ++/* #define DEVICE2_NAME "/dev/mtd2" */ + #define DEVICE1_OFFSET 0x0000 +-#define ENV1_SIZE 0x4000 +-#define DEVICE1_ESIZE 0x4000 +-#define DEVICE1_ENVSECTORS 2 +-#define DEVICE2_OFFSET 0x0000 +-#define ENV2_SIZE 0x4000 +-#define DEVICE2_ESIZE 0x4000 +-#define DEVICE2_ENVSECTORS 2 ++#define ENV1_SIZE 0x20000 ++#define DEVICE1_ESIZE 0x20000 ++#define DEVICE1_ENVSECTORS 1 ++/* #define DEVICE2_OFFSET 0x0000 */ ++/* #define ENV2_SIZE 0x4000 */ ++/* #define DEVICE2_ESIZE 0x4000 */ ++/* #define DEVICE2_ENVSECTORS 2 */ + #endif + + #ifndef CONFIG_BAUDRATE +-- +1.9.1 +