fp@2689: #!/bin/bash fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: # fp@2192: # Start script for EtherCAT to use with systemd fp@2192: # fp@2192: # $Id$ fp@2192: # fp@2192: # Copyright (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH fp@2192: # fp@2192: # This file is part of the IgH EtherCAT Master. fp@2192: # fp@2192: # The IgH EtherCAT Master is free software; you can redistribute it and/or fp@2192: # modify it under the terms of the GNU General Public License version 2, as fp@2192: # published by the Free Software Foundation. fp@2192: # fp@2192: # The IgH EtherCAT Master is distributed in the hope that it will be useful, fp@2192: # but WITHOUT ANY WARRANTY; without even the implied warranty of fp@2192: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General fp@2192: # Public License for more details. fp@2192: # fp@2192: # You should have received a copy of the GNU General Public License along fp@2192: # with the IgH EtherCAT Master; if not, write to the Free Software fp@2192: # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA fp@2192: # fp@2192: # --- fp@2192: # fp@2192: # The license mentioned above concerns the source code only. Using the fp@2192: # EtherCAT technology and brand is only permitted in compliance with the fp@2192: # industrial property and similar rights of Beckhoff Automation GmbH. fp@2192: # fp@2192: # vim: expandtab sw=4 tw=78 fp@2192: # fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2543: LSMOD=/sbin/lsmod fp@2192: MODPROBE=/sbin/modprobe fp@2192: RMMOD=/sbin/rmmod fp@2192: MODINFO=/sbin/modinfo fp@2192: fp@2192: ETHERCAT=@prefix@/bin/ethercat fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: ETHERCAT_CONFIG=/etc/ethercat.conf fp@2192: fp@2192: if [ ! -r ${ETHERCAT_CONFIG} ]; then fp@2192: echo ${ETHERCAT_CONFIG} not existing; fp@2192: exit 6 fp@2192: fi fp@2192: fp@2192: . ${ETHERCAT_CONFIG} fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: parse_mac_address() { fp@2192: if [ -z "${1}" ]; then fp@2192: MAC="" fp@2192: elif echo ${1} | grep -qE '^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$'; then fp@2192: MAC=${1} fp@2192: else fp@2192: echo Invalid MAC address \"${1}\" in ${ETHERCAT_CONFIG} fp@2192: exit 1 fp@2192: fi fp@2192: } fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: case "${1}" in fp@2192: fp@2192: start) fp@2192: # construct DEVICES and BACKUPS from configuration variables fp@2192: DEVICES="" fp@2192: BACKUPS="" fp@2192: MASTER_INDEX=0 fp@2192: fp@2192: while true; do fp@2192: DEVICE=$(eval echo "\${MASTER${MASTER_INDEX}_DEVICE}") fp@2192: BACKUP=$(eval echo "\${MASTER${MASTER_INDEX}_BACKUP}") fp@2192: if [ -z "${DEVICE}" ]; then break; fi fp@2192: fp@2192: if [ ${MASTER_INDEX} -gt 0 ]; then fp@2192: DEVICES=${DEVICES}, fp@2192: BACKUPS=${BACKUPS}, fp@2192: fi fp@2192: fp@2192: parse_mac_address ${DEVICE} fp@2192: DEVICES=${DEVICES}${MAC} fp@2192: fp@2192: parse_mac_address ${BACKUP} fp@2192: BACKUPS=${BACKUPS}${MAC} fp@2192: fp@2192: MASTER_INDEX=$(expr ${MASTER_INDEX} + 1) fp@2192: done fp@2192: fp@2192: # load master module fp@2192: if ! ${MODPROBE} ${MODPROBE_FLAGS} ec_master \ fp@2192: main_devices=${DEVICES} backup_devices=${BACKUPS}; then fp@2192: exit 1 fp@2192: fi fp@2192: fp@2192: LOADED_MODULES=ec_master fp@2192: fp@2192: # check for modules to replace fp@2192: for MODULE in ${DEVICE_MODULES}; do fp@2192: ECMODULE=ec_${MODULE} fp@2192: if ! ${MODINFO} ${ECMODULE} > /dev/null; then fp@2192: continue # ec_* module not found fp@2192: fi fp@2192: edouard@2710: if [ ${MODULE} != "generic" -a ${MODULE} != "rtdmnet" -a ${MODULE} != "ccat" ]; then fp@2192: # try to unload standard module fp@2543: if ${LSMOD} | grep "^${MODULE} " > /dev/null; then fp@2192: if ! ${RMMOD} ${MODULE}; then fp@2192: ${RMMOD} ${LOADED_MODULES} fp@2192: exit 1 fp@2192: fi fp@2192: fi fp@2192: fi fp@2192: fp@2192: if ! ${MODPROBE} ${MODPROBE_FLAGS} ${ECMODULE}; then edouard@2710: if [ ${MODULE} != "generic" -a ${MODULE} != "rtdmnet" -a ${MODULE} != "ccat" ]; then fp@2192: ${MODPROBE} ${MODPROBE_FLAGS} ${MODULE} # try to restore fp@2192: fi fp@2192: ${RMMOD} ${LOADED_MODULES} fp@2192: exit 1 fp@2192: fi fp@2192: fp@2193: LOADED_MODULES="${ECMODULE} ${LOADED_MODULES}" fp@2192: done fp@2192: fp@2192: exit 0 fp@2192: ;; fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: stop) fp@2192: # unload EtherCAT device modules fp@2192: for MODULE in ${DEVICE_MODULES} master; do fp@2192: ECMODULE=ec_${MODULE} fp@2543: if ! ${LSMOD} | grep -q "^${ECMODULE} "; then fp@2192: continue # ec_* module not loaded fp@2192: fi fp@2192: if ! ${RMMOD} ${ECMODULE}; then fp@2192: exit 1 fp@2192: fi; fp@2192: done fp@2192: fp@2192: sleep 1 fp@2192: fp@2192: # load standard modules again fp@2192: for MODULE in ${DEVICE_MODULES}; do edouard@2710: if [ ${MODULE} == "generic" -o ${MODULE} == "rtdmnet" -o ${MODULE} == "ccat" ]; then fp@2192: continue fp@2192: fi fp@2192: ${MODPROBE} ${MODPROBE_FLAGS} ${MODULE} fp@2192: done fp@2192: fp@2192: exit 0 fp@2192: ;; fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: restart) fp@2192: $0 stop || exit 1 fp@2192: sleep 1 fp@2192: $0 start fp@2192: ;; fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: status) fp@2192: echo "Checking for EtherCAT master @VERSION@ " fp@2192: fp@2192: # count masters in configuration file fp@2192: MASTER_COUNT=0 fp@2192: while true; do fp@2192: DEVICE=$(eval echo "\${MASTER${MASTER_COUNT}_DEVICE}") fp@2192: if [ -z "${DEVICE}" ]; then break; fi fp@2192: MASTER_COUNT=$(expr ${MASTER_COUNT} + 1) fp@2192: done fp@2192: fp@2192: RESULT=0 fp@2192: fp@2192: for i in `seq 0 $(expr ${MASTER_COUNT} - 1)`; do fp@2192: echo -n "Master${i} " fp@2192: fp@2192: # Check if the master is in idle or operation phase fp@2192: ${ETHERCAT} master --master ${i} 2>/dev/null | \ fp@2192: grep -qE 'Phase:[[:space:]]*Idle|Phase:[[:space:]]*Operation' fp@2192: EXITCODE=$? fp@2192: fp@2192: if [ ${EXITCODE} -eq 0 ]; then fp@2192: echo " running" fp@2192: else fp@2192: echo " dead" fp@2192: RESULT=1 fp@2192: fi fp@2192: done fp@2192: fp@2192: exit ${RESULT} fp@2192: ;; fp@2192: fp@2192: #------------------------------------------------------------------------------ fp@2192: fp@2192: *) fp@2192: echo "USAGE: $0 {start|stop|restart|status}" fp@2192: exit 1 fp@2192: ;; fp@2192: esac fp@2192: fp@2192: #------------------------------------------------------------------------------