From 316d7d1297cccc45ccf1ac8133f323c425743559 Mon Sep 17 00:00:00 2001 From: Damir Anicic Date: Wed, 29 Apr 2026 11:29:58 +0200 Subject: [PATCH] initial working version --- .gitignore | 2 + README.md | 13 + .../build-ethercat-4-debian12.txt | 146 ++++++++ .../build-ethercat-4-yocto40-aarch64.txt | 13 + .../build-yocto40-aarch64.sh | 322 ++++++++++++++++++ .../gfa-ethercat.conf | 66 ++++ 6 files changed, 562 insertions(+) create mode 100644 .gitignore create mode 100755 build-ethercat-4-debian12/build-ethercat-4-debian12.txt create mode 100644 build-ethercat-4-yocto40-aarch64/build-ethercat-4-yocto40-aarch64.txt create mode 100755 build-ethercat-4-yocto40-aarch64/build-yocto40-aarch64.sh create mode 100644 build-ethercat-4-yocto40-aarch64/gfa-ethercat.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5968f0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +1.6.2/ +1.6.3/ diff --git a/README.md b/README.md index e69de29..fc44e38 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,13 @@ +# EtherCAT master + +## Source + +Sources will be cloned from git@gitlab.com:etherlab.org/ethercat.git + + +## build + +For debian12 see build-ethercat-4-debian12/*.txt + +For yocto40-aarch64 see build-ethercat-4-yocto40-aarch64/*.txt + diff --git a/build-ethercat-4-debian12/build-ethercat-4-debian12.txt b/build-ethercat-4-debian12/build-ethercat-4-debian12.txt new file mode 100755 index 0000000..d9efeb9 --- /dev/null +++ b/build-ethercat-4-debian12/build-ethercat-4-debian12.txt @@ -0,0 +1,146 @@ + +# EthercCAT kernel driver + libs&headers +# (this is to replace old style ECmasterECMC EPICS module) +# - building 1.6.3 for debian12 + + +# goto SKIPIT + +# prepare somwhere (in anicic@gfa-ad82:workarea/EtherCAT/1.6.3): +# cd /home/anicic/workarea/EtherCAT +# mkdir 1.6.3 +# cd 1.6.3 +# git clone git@gitlab.com:etherlab.org/ethercat.git +# cd ethercat +# git checkout 1.6.3 -b gfa-1.6.3 +# cd .. +# # you can delete ethercat folder (cloned repo) after building + + + +# SKIPIT: + + +On one target debian12 system: + + +##################################################################################################################################################################################### +# get it (usualy we have no git* on target) + +cd /tmp +# copy sources from somwhere +scp -r anicic@gfa-ad82:workarea/EtherCAT/1.6.3/ethercat . # need password here + + +# build + +cd ethercat +sudo apt update && sudo apt install -y pkg-config +export LANG=en_US.UTF-8 ; export LANGUAGE=en_US:en ; export LC_ALL=C +autoupdate +echo 'pkgconfigdir = $(libdir)/pkgconfig' >> lib/Makefile.am +./bootstrap +./configure --prefix="/opt/etherlab" --sysconfdir=/etc \ + --enable-generic=yes --enable-e1000=no --enable-e1000e=no --enable-igb=yes --enable-igc=yes --enable-8139too=no --enable-r8169=no \ + --enable-hrtimer=yes --disable-debug-if --disable-debug-ring --enable-sii-assign=yes --enable-eoe=no +#make -j all modules ### if building on 8GB (or less) RAMdisk based system, maybe will not work with -j +make all modules +cd .. + + +##################################################################################################################################################################################### +# build package for target debian12 + +EPICSHOSTARCH=deb12-x86_64 +ETHERCATGITVERSION=1.6.3 +ETHERCATVERSIONM=1 +ETHERCATVERSIONMM=${ETHERCATVERSIONM}.2 +ETHERCATVERSIONMMR=${ETHERCATVERSIONMM}.0 +ETHERCATDIR=ethercat +KERNELVERS=`uname -r` + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab/bin +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab/sbin +cp -a ${ETHERCATDIR}/tool/ethercat ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab/bin +cp -a ${ETHERCATDIR}/script/ethercatctl ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab/sbin +chmod a+x ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/opt/etherlab/sbin/ethercatctl + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/master +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices/igb +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices/igc +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/examples +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/examples/mini +cp -a ${ETHERCATDIR}/master/ec_master.ko ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/master +cp -a ${ETHERCATDIR}/devices/ec_generic.ko ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices +cp -a ${ETHERCATDIR}/devices/igb/ec_igb.ko ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices/igb +cp -a ${ETHERCATDIR}/devices/igc/ec_igc.ko ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/devices/igc +cp -a ${ETHERCATDIR}/examples/mini/ec_mini.ko ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/lib/modules/${KERNELVERS}/ethercat/examples/mini + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system +cp -a ${ETHERCATDIR}/script/ethercat.service ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system/ethercat.service +sed -i 's|#Requires=network.target|Requires=network.target|' ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system/ethercat.service +sed -i 's|#After=network.target|After=network.target|' ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system/ethercat.service +sed -i 's/^\(\(Requires=network\.target\) #.*\)$/\2/' ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system/ethercat.service +sed -i 's/^\(\(After=network\.target\) #.*\)$/\2/' ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/systemd/system/ethercat.service + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/udev/rules.d +echo 'KERNEL=="EtherCAT[0-9]*", SUBSYSTEM=="EtherCAT", MODE="0666"' > ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/etc/udev/rules.d/99-ethercat.rules + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/DEBIAN +cat <${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/DEBIAN/control +Package: ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv +Version: 1.6.3 +Section: custom +Priority: optional +Architecture: amd64 +Essential: no +Maintainer: damir.anicic@psi.ch +Description: EtherCAT driver + This is longer description for + EtherCAT linux driver +EOF +cat <${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/DEBIAN/postinst +#!/bin/bash +echo "Setting up the ethercat driver for kernel ${KERNELVERS}" +/sbin/depmod ${KERNELVERS} +EOF +chmod -R 755 ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv/DEBIAN + +sudo chown -R root:root ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv + +dpkg-deb --build --root-owner-group ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv + + +##################################################################################################################################################################################### +# build tar for EPICS + +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/include +mkdir -p ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/lib +cp -a ${ETHERCATDIR}/include/ecrt.h ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/include/ecrt.h +cp -a ${ETHERCATDIR}/include/ectty.h ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/include/ectty.h +cp -a ${ETHERCATDIR}/lib/.libs/libethercat.a ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/lib/libethercat.a +cp -a ${ETHERCATDIR}/lib/.libs/libethercat.so ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/lib/libethercat.so +cp -a ${ETHERCATDIR}/lib/.libs/libethercat.so.${ETHERCATVERSIONM} ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/lib/libethercat.so.${ETHERCATVERSIONM} +cp -a ${ETHERCATDIR}/lib/.libs/libethercat.so.${ETHERCATVERSIONMMR} ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/lib/libethercat.so.${ETHERCATVERSIONMMR} +echo "" > ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/Readme.txt +echo "Created at : $(date)" >> ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/Readme.txt +echo "On : $(uname -a)" >> ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/Readme.txt +grep 'gitlab.' ${ETHERCATDIR}/.git/config | head -1 | awk '{print "ORIGIN : " $3}' >> ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/Readme.txt +echo "" >> ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH}/Readme.txt +chmod -R a+rw ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics/${EPICSHOSTARCH} +(HERE=`pwd`; cd ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics; tar cvf ${HERE}/${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics.tar ${EPICSHOSTARCH}) + + +##################################################################################################################################################################################### +# copy for installation + +# for each sls-lc sf-lc hipa-lc proscan-lc +# scp ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv.deb ${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics.tar someuser@*-lc:/ioc/NeedfulThings/EtherCAT/install-packages/ +# and unpack tar file also +# @ *-lc: cd /ioc/NeedfulThings/EtherCAT; mkdir -p 4epics/${ETHERCATGITVERSION; cd 4epics/${ETHERCATGITVERSION; tar xvf ../install-packages/${ETHERCATDIR}-${ETHERCATGITVERSION}-${KERNELVERS}-drv-4epics.tar ) + +# ALSO: chmod -R a+rw /ioc/NeedfulThings/EtherCAT/4epics/${ETHERCATGITVERSION + diff --git a/build-ethercat-4-yocto40-aarch64/build-ethercat-4-yocto40-aarch64.txt b/build-ethercat-4-yocto40-aarch64/build-ethercat-4-yocto40-aarch64.txt new file mode 100644 index 0000000..9444408 --- /dev/null +++ b/build-ethercat-4-yocto40-aarch64/build-ethercat-4-yocto40-aarch64.txt @@ -0,0 +1,13 @@ + +# get sources from somwhere: +# copy from : scp -r anicic@gfa-ad82:~/workarea/EtherCAT/1.6.3 . +# or (mkdir 1.6.3; cd 1.6.3; git clone git@gitlab.com:etherlab.org/ethercat.git; cd ethercat; git checkout 1.6.3 -b gfa-1.6.3) + + +# do this on machine with access to kernel sources and cross cc for yocto40-aarch64 +# see build-yoctu40-aarch64.sh +( + cd 1.6.3/ethercat + (./bootstrap; ../../build-ethercat-4-yocto40-aarch64/build-yocto40-aarch64.sh -a yocto40-aarch64 -m 1.6.3 -k 5.15.19-rt29-gfa -c) + cd ../.. +) diff --git a/build-ethercat-4-yocto40-aarch64/build-yocto40-aarch64.sh b/build-ethercat-4-yocto40-aarch64/build-yocto40-aarch64.sh new file mode 100755 index 0000000..0d3c7d7 --- /dev/null +++ b/build-ethercat-4-yocto40-aarch64/build-yocto40-aarch64.sh @@ -0,0 +1,322 @@ +#!/bin/bash + +# this is now only for building ZynqMP version: +# (./bootstrap; ../../tmp-build.sh -a yocto40-aarch64 -s none-lc -m 1.6.3 -k 5.15.19-rt29-gfa ) +# (./bootstrap; ../../tmp-build.sh -a yocto40-aarch64 -s none-lc -m 1.6.3 -k 5.15.19-rt29-gfa -c) + + + +BOLD='\033[1m' +RED='\033[31m' +GREEN='\033[32m' +BLUE='\033[34m' +CYAN='\033[36m' +NC='\033[0m' + + +# NOTE: this script is not perfect, if change EPICS_HOST_ARCH pass also option -c to regenerate config, ... + + +SUPPORTED_EPICS_ARCH=" yocto40-aarch64 " +EPICS_HOST_ARCH="-not-defined-" + + +set -e + + +ETHVERSION=1.2.0 +#ARG_MODVER=1.6.3 +ARG_MODVER='test' + +EXEC_CFG=0 +TEST=0 + +# defaults for arguments (these defaults are actually meaningless) +ARG_KERNVER='' + +DO_INSTALL="yes" +DO_INSTALL_BIN="yes" + + + +while getopts "a:m:k:cbl" opt; do + case $opt in + a) + EPICS_HOST_ARCH=$OPTARG + if [[ ${SUPPORTED_EPICS_ARCH} != *${EPICS_HOST_ARCH}* ]] + then + echo "$EPICS_HOST_ARCH is not one of supported <${SUPPORTED_EPICS_ARCH}>" + exit 1 + fi + ;; + m) + # module version + ARG_MODVER=$OPTARG + if [ "$ARG_MODVER" == "test" ] || [ "$ARG_MODVER" == "TEST" ]; then + TEST=1 + fi + echo "Module version $ARG_MODVER" + ;; + k) + # kernel version + ARG_KERNVER=$OPTARG + echo "Kernel version $ARG_KERNVER" + ;; + b) + # execute configure + DO_INSTALL="no" + echo "Just building - will not install" + ;; + l) + # execute configure + DO_INSTALL_BIN="no" + echo "Will not install to .../bin" + ;; + c) + # execute configure + EXEC_CFG=1 + echo "Configure will be executed" + ;; + \?) + HOST_KERNELS=$(find /usr/src/kernels/ -mindepth 1 -maxdepth 1 -type d) + IFC_KERNELS=$(find /opt/eldk-5.2/kernel/ -mindepth 1 -maxdepth 1 -name *-linux-*) + RPI_KERNELS=$(find /net/crosst-hafs/export/cross_tools/raspberrypi/ -mindepth 1 -maxdepth 1 -type d -name linux-headers-*) + ZYNQMP_KERNELS=$(find /psi.ch/group/8210/8211/anicic/ZynqMP/RootFsAddons-v4/my-kernel/ -mindepth 1 -maxdepth 1 -type d -name linux-xlnx-*) + + HOSTSYSTEM=$(< /etc/system-release) + + echo "Invalid option: -$OPTARG" >&2 + echo "-------------------------------------------------------------------------------" + echo "Usage: `basename $0` [-a epics-host-arch] [-m module_version] [-k kernel_version] [-c] " + echo " " + echo " module_version (-m): [n.m|test] (n.m = 2.1, 2.2, etc)" + echo " configure (-c): execute configure (automatically done when needed)" + echo " kernel_version (-k):" + for i in $HOST_KERNELS; do + printf "%40s ($HOSTSYSTEM, %s)\n" ${i##*/} ${i##*.} + done + for i in $IFC_KERNELS; do + printf "%40s (ifc, PPC)\n" ${i#*-linux-} + done + for i in $RPI_KERNELS; do + printf "%40s (raspberry pi, arm)\n" ${i#*linux-headers-} + done + for i in $ZYNQMP_KERNELS; do + printf "%40s (zynqmp, arm64)\n" ${i#*linux-xlnx-} + done + echo + echo "Note: Only one architecture (ifc, x86_64, i686, ...) can be active (\"configured\") at any given time" + echo " Also, configure has to be executed at least once for the given architecture" + echo "-------------------------------------------------------------------------------" + exit 1 + ;; + esac +done + +if [[ ${SUPPORTED_EPICS_ARCH} != *${EPICS_HOST_ARCH}* ]] +then + echo "$EPICS_HOST_ARCH is not one of supported <${SUPPORTED_EPICS_ARCH}>" + exit 1 +fi + +echo "EPICS_HOST_ARCH = $EPICS_HOST_ARCH" + +# +# ========================================================================================================= +# +unset LD_LIBRARY_PATH + +EXTRAS="" +ENADIS="--enable-generic=yes --enable-e1000=no --enable-e1000e=no --enable-igb=no --enable-8139too=no --enable-r8169=no \ + --enable-hrtimer=yes --disable-debug-if --disable-debug-ring --enable-sii-assign=yes --enable-eoe=no" + + +case "${EPICS_HOST_ARCH}" in + yocto40-aarch64) + if [ -d "$(ls -d /psi.ch/group/8210/8211/anicic/ZynqMP/RootFsAddons-v4/my-kernel/linux-xlnx-$ARG_KERNVER 2>/dev/null)" ] || [ -z $ARG_KERNVER ] + then + KERNEL_SRC=$(ls -d /psi.ch/group/8210/8211/anicic/ZynqMP/RootFsAddons-v4/my-kernel/linux-xlnx-$ARG_KERNVER/) || KERNEL_SRC='' + GCCBIN=/opt/yocto40-aarch64/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux + HOST="--host=aarch64-poky-linux" + ARCH="arm64" + + CCC=${HOST:+${HOST#--host=}-} + SYSROOT=/opt/yocto40-aarch64/sysroots/cortexa53-poky-linux + EXTRAS="CC=\"${CCC}gcc --sysroot=$SYSROOT\" CXX=\"${CCC}g++ --sysroot=$SYSROOT\" LD=\"${CCC}ld --sysroot=$SYSROOT\" --with-sysroot=$SYSROOT" + + ENADIS="--enable-generic=yes --enable-e1000=no --enable-e1000e=no --enable-igb=no --enable-8139too=no --enable-r8169=no \ + --enable-hrtimer=yes --disable-debug-if --disable-debug-ring --enable-sii-assign=yes --enable-eoe=no" + + else + echo -e "Compiling for kernel version ${RED}${BOLD}$ARG_KERNVER${NC} - kernel sources not found" + exit 1 + fi + ;; + *) + echo "Unsupported build for EPICS_HOST_ARCH=$EPICS_HOST_ARCH" + exit 1 + ;; +esac + +# if -k option is not given, there can also be no kernel source +[ -z $ARG_KERNVER ] && KERNEL_SRC='' + + +if [ -n "$GCCBIN" ]; then + PATH=$GCCBIN:$PATH +fi + +if [ -f .last_kernelversion ] +then + if [ "$ARG_KERNVER" != "$(< .last_kernelversion)" ] ; then + echo "Kernel differs from last build: running \"configure\"" + EXEC_CFG=1 + fi 2>/dev/null +else + EXEC_CFG=1 +fi + +if [ -f .last_epicshostarch ] +then + if [ "$EPICS_HOST_ARCH" != "$(< .last_epicshostarch)" ] ; then + echo "EPICS_HOST_ARCH differs from last build: running \"configure\"" + EXEC_CFG=1 + fi 2>/dev/null +else + EXEC_CFG=1 +fi + +BUILD_KERNEL_MODULES="--enable-kernel=no" +[ ! -z $KERNEL_SRC ] && BUILD_KERNEL_MODULES="--enable-kernel=yes --with-linux-dir=$KERNEL_SRC" + +if [ ! -f Makefile ] +then + EXEC_CFG=1 +fi + +if [ $EXEC_CFG == 1 ]; then + dye make clean || echo "********** clean failed, but go on **********" + eval dye ./configure $HOST $BUILD_KERNEL_MODULES \ + --prefix=/usr/local --sysconfdir=/etc \ + $ENADIS \ + $EXTRAS +fi +echo $ARG_KERNVER > .last_kernelversion +echo $EPICS_HOST_ARCH > .last_epicshostarch + +dye make all + +[ -z $KERNEL_SRC ] && echo "Not building kernel modules (no -k option given)" +[ ! -z $KERNEL_SRC ] && dye make modules ARCH=$ARCH CROSS_COMPILE=${HOST:+${HOST#--host=}-} V=0 + + +# +# ========================================================================================================= +# +ARG_KERNVER_SHOW="$ARG_KERNVER" +[ -z $ARG_KERNVER_SHOW ] && ARG_KERNVER_SHOW="none" +echo -e "---------------------------------------------------------------------------------------------------------" +echo -e +echo -e " ARCH ${RED}$ARCH${NC}, EPICS_HOST_ARCH ${RED}$EPICS_HOST_ARCH${NC}, EtherCAT Master ${RED}${BOLD}$ARG_MODVER${NC}, Kernel ${RED}${BOLD}$ARG_KERNVER_SHOW${NC}" +echo -e +echo -e "---------------------------------------------------------------------------------------------------------" + +ROOT_TARGET_DIR=/ioc/NeedfulThings/EtherCAT/4epics +HOSTNAME=`hostname` +HOSTNAME=${HOSTNAME%%.*} + +if [ ! -d "$ROOT_TARGET_DIR" ] && [ ! -d "/import$ROOT_TARGET_DIR" ]; then + echo -e "Directory ${BOLD}$ROOT_TARGET_DIR${NC} does not exist here ($HOSTNAME)." + exit 1 +fi + +rm -rf .deploy +mkdir -p .deploy/include +mkdir -p .deploy/lib +[ "$DO_INSTALL_BIN" != "no" ] && mkdir -p .deploy/bin +[ ! -z $KERNEL_SRC ] && mkdir -p .deploy/kernel/${ARG_KERNVER} +LIBNAME=libethercat.so.${ETHVERSION} + +cp include/*.h .deploy/include +cp lib/.libs/$LIBNAME .deploy/lib +cp lib/.libs/libethercat.a .deploy/lib +[ ! -z $KERNEL_SRC ] && cp master/ec_master.ko .deploy/kernel/${ARG_KERNVER} +[ ! -z $KERNEL_SRC ] && cp devices/ec_generic.ko .deploy/kernel/${ARG_KERNVER} + + +if [ ${TEST} = 0 ]; then +ln -s $LIBNAME .deploy/lib/${LIBNAME%.*.*} +ln -s $LIBNAME .deploy/lib/${LIBNAME%.*.*.*} +fi + + +TARGET_DIR=${ROOT_TARGET_DIR}/$ARG_MODVER/$EPICS_HOST_ARCH +ARCHIVENAME=ethercat-$ARG_MODVER-$ARG_KERNVER-drv-4epics.tar + + +echo "" > .deploy/Readme.txt +echo "Created at : $(date)" >> .deploy/Readme.txt +echo "On : $(uname -a)" >> .deploy/Readme.txt +grep 'gitlab.' .git/config | head -1 | awk '{print "ORIGIN : " $3}' >> .deploy/Readme.txt +echo "" >> .deploy/Readme.txt + + +[ "$DO_INSTALL_BIN" != "no" ] && cp tool/ethercat .deploy/bin/ethercat +[ "$DO_INSTALL_BIN" != "no" ] && cp script/ethercatctl .deploy/bin/ethercatctl +[ "$DO_INSTALL_BIN" != "no" ] && chmod a+x .deploy/bin/ethercat* + +echo "# paths for this EtherCAT version" > .deploy/this-paths +echo "export PATH=\$PATH:$TARGET_DIR/bin" >> .deploy/this-paths +echo "export MODULE_PATH=$TARGET_DIR/kernel/$ARG_KERNVER" >> .deploy/this-paths +echo "#export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$TARGET_DIR/lib" >> .deploy/this-paths + + +# original ethercatctl needs modules to be installed in /lib/modules/... +sed -i "/^LSMOD=/i\ +. /ioc/NeedfulThings/EtherCAT/4epics/$ARG_MODVER/$EPICS_HOST_ARCH/this-paths\n\ +MODINS=/sbin/insmod +" .deploy/bin/ethercatctl +sed -i 's|${MODPROBE} ${MODPROBE_FLAGS} ec_master|${MODINS} ${MODPROBE_FLAGS} $MODULE_PATH/ec_master.ko|' .deploy/bin/ethercatctl +sed -i 's|${MODINFO} "${ECMODULE}"|${MODINFO} "$MODULE_PATH/${ECMODULE}.ko"|' .deploy/bin/ethercatctl +sed -i 's|${MODPROBE} ${MODPROBE_FLAGS} "${ECMODULE}"|${MODINS} ${MODPROBE_FLAGS} "$MODULE_PATH/${ECMODULE}.ko"|' .deploy/bin/ethercatctl +sed -i "s|/usr/local/bin/ethercat|/ioc/NeedfulThings/EtherCAT/4epics/$ARG_MODVER/$EPICS_HOST_ARCH/bin/ethercat|" .deploy/bin/ethercatctl + +echo -e "${BOLD}${CYAN}Creating .deploy/$ARCHIVENAME for copy/unpack at $TARGET_DIR on *-lc servers${NC}" + +echo "# load EtherCAT modules and start configured intercfaces" > .deploy/prepare-load-drvr-and-start-ethercat.sh +echo ". /ioc/NeedfulThings/EtherCAT/4epics/$ARG_MODVER/$EPICS_HOST_ARCH/this-paths" >> .deploy/prepare-load-drvr-and-start-ethercat.sh +echo "cp /ioc/NeedfulThings/EtherCAT/4epics/$ARG_MODVER/$EPICS_HOST_ARCH/gfa-ethercat.conf /etc/ethercat.conf" >> .deploy/prepare-load-drvr-and-start-ethercat.sh +echo "ethercatctl start" >> .deploy/prepare-load-drvr-and-start-ethercat.sh +chmod a+x .deploy/prepare-load-drvr-and-start-ethercat.sh + +# our version of /etc/ethercat.conf +cp ../../build-ethercat-4-yocto40-aarch64/gfa-ethercat.conf .deploy/gfa-ethercat.conf + +(cd .deploy; tar cvf ${ARCHIVENAME} --exclude ${ARCHIVENAME} .) + +#echo "======================= TAR FILE ========================="; tar tf .deploy/${ARCHIVENAME}; exit 0 + + + +[ "$DO_INSTALL" = "no" ] && echo "Will not install (-b option given)" +[ "$DO_INSTALL" = "no" ] && exit 0 + + +echo +echo -e "${BOLD}${GREEN}Build completed${NC}" +echo + + +echo -e "${CYAN}#${NC}" +echo -e "${CYAN}# Now copy and unpack on NFS servers${NC}" +echo -e "${CYAN}#${NC}" +echo -e "${CYAN}# for each sls-lc sf-lc hipa-lc proscan-lc ${NC}" +echo -e "${CYAN}# scp .deploy/${ARCHIVENAME} someuser@*-lc:/ioc/NeedfulThings/EtherCAT/install-packages/ ${NC}" +echo -e "${CYAN}# and unpack tar file also ${NC}" +echo -e "${CYAN}# at *-lc: ${NC}" +echo -e "${CYAN}# cd /ioc/NeedfulThings/EtherCAT " +echo -e "${CYAN}# mkdir -p 4epics/${ARG_MODVER}/${EPICS_HOST_ARCH} ${NC}" +echo -e "${CYAN}# cd 4epics/${ARG_MODVER}/${EPICS_HOST_ARCH} ${NC}" +echo -e "${CYAN}# tar xvf ../../../install-packages/${ARCHIVENAME} ${NC}" +echo -e "${CYAN}#${NC}" + diff --git a/build-ethercat-4-yocto40-aarch64/gfa-ethercat.conf b/build-ethercat-4-yocto40-aarch64/gfa-ethercat.conf new file mode 100644 index 0000000..ecd6784 --- /dev/null +++ b/build-ethercat-4-yocto40-aarch64/gfa-ethercat.conf @@ -0,0 +1,66 @@ +# ------------------------------------------------------------------------- +# Network devices to bind EtherCAT master +# +# master devices +# device kernel module +DEVICE_MODULES="generic" +#DEVICE_MODULES="igb" +# +# devices to enable +# +LINK_DEVICES="" +# end of link devices +# +# AD82 added on 27.09.2023 +# you can redefine: +# DEVICE_MODULES="generic" # this is default +# DEVICE_MODULES="igb" +# DEVICE_MODULES="igb generic" +# DEVICE_MODULES="or whichever drivers you want" +# +# AD82 added on 06.11.2024 - can also (re)define LINK_DEVICES and MAC addresses (MASTER*_DEVICE) +# +USEDTHERCATDRVRFN="" +MYCFGDIR="/ioc/hosts/`hostname`/cfg" +MYETHERCATDRVRFN="${MYCFGDIR}/ETHERCATDRVR" +if [ -f ${MYETHERCATDRVRFN} ] +then + USEDTHERCATDRVRFN=${MYETHERCATDRVRFN} +else + MYCFGDIR="/ioc/`hostname`/cfg" + MYETHERCATDRVRFN="${MYCFGDIR}/ETHERCATDRVR" + if [ -f ${MYETHERCATDRVRFN} ] + then + USEDTHERCATDRVRFN=${MYETHERCATDRVRFN} + fi +fi + +if [ -n "${USEDTHERCATDRVRFN}" ] +then + . ${USEDTHERCATDRVRFN} + + # echo "My DEVICE_MODULES=\"${DEVICE_MODULES}\" # see ${MYETHERCATDRVRFN}" + if [[ -n "$LINK_DEVICES" && -n "$LINK_DEVICE_MACS" ]] + then + # echo "Both LINK_DEVICES and LINK_DEVICE_MACS are not empty - will (re)define MASTER*_DEVICE vars" + + # unset any MASTER*_DEICE if already defined (should be none) + for var in $(compgen -v | grep -E '^MASTER[0-9]+_DEVICE$') + do + unset "$var" + done + + counter=0 + for mac in $LINK_DEVICE_MACS + do + eval "MASTER${counter}_DEVICE='$mac'" + ((counter++)) + done + + #echo "New ethercat vars:" + #echo "DEVICE_MODULES: $DEVICE_MODULES" + #echo "LINK_DEVICES: $LINK_DEVICES" + #echo "MASTER*_DEICE: $(compgen -v | grep -E '^MASTER[0-9]+_DEVICE$')" + + fi +fi