From 1a3b0776cb2af961ccb63905bdbea5d0da29dbbc Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Wed, 12 Sep 2007 13:10:15 +0000 Subject: [PATCH] Added --enable-eoe conditional. --- configure.ac | 26 ++++++++++++++++++++++++++ master/Kbuild | 5 ++++- master/fsm_master.c | 8 ++++++++ master/master.c | 37 +++++++++++++++++++++++++++++++++++++ master/master.h | 6 ++++++ 5 files changed, 81 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index f7d67f0e..67c0ae7d 100644 --- a/configure.ac +++ b/configure.ac @@ -413,6 +413,31 @@ AC_ARG_ENABLE([dummy], AM_CONDITIONAL(ENABLE_DUMMY, test "x$dummy" = "x1") +#------------------------------------------------------------------------------ +# Ethernet-over-EtherCAT support +#------------------------------------------------------------------------------ + +AC_ARG_ENABLE([eoe], + AS_HELP_STRING([--enable-eoe], + [Enable EoE support (default: yes)]), + [ + case "${enableval}" in + yes) eoe=1 + ;; + no) eoe=0 + ;; + *) AC_MSG_ERROR([Invalid value for --enable-eoe]) + ;; + esac + ], + [eoe=1] +) + +if test "x${eoe}" = "x1"; then + AC_DEFINE([EC_EOE], [1], [EoE support enabled]) +fi +AM_CONDITIONAL(ENABLE_EOE, test "x$eoe" = "x1") + #------------------------------------------------------------------------------ # Create config.kbuild @@ -433,6 +458,7 @@ RTAI_DIR := "${rtaidir}" MSR_DIR := "${msrdir}" ENABLE_DEBUG_IF := ${dbg} ENABLE_DUMMY := ${dummy} +ENABLE_EOE := ${eoe} EOF #------------------------------------------------------------------------------ diff --git a/master/Kbuild b/master/Kbuild index 8c50d05f..93aa0d75 100644 --- a/master/Kbuild +++ b/master/Kbuild @@ -36,9 +36,12 @@ include $(src)/../config.kbuild obj-m := ec_master.o ec_master-objs := module.o master.o device.o pdo.o sync.o fmmu.o slave.o \ - datagram.o domain.o mailbox.o canopen.o ethernet.o fsm_sii.o fsm_change.o \ + datagram.o domain.o mailbox.o canopen.o fsm_sii.o fsm_change.o \ fsm_coe.o fsm_mapping.o fsm_slave.o fsm_master.o xmldev.o +ifeq ($(ENABLE_EOE),1) + ec_master-objs += ethernet.o +endif ifeq ($(ENABLE_DEBUG_IF),1) ec_master-objs += debug.o endif diff --git a/master/fsm_master.c b/master/fsm_master.c index ef72d8f7..df5a5b25 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -41,7 +41,9 @@ #include "globals.h" #include "master.h" #include "mailbox.h" +#ifdef EC_EOE #include "ethernet.h" +#endif #include "fsm_master.h" /*****************************************************************************/ @@ -238,8 +240,10 @@ void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machin fsm->idle = 0; fsm->scan_jiffies = jiffies; +#ifdef EC_EOE ec_master_eoe_stop(master); ec_master_clear_eoe_handlers(master); +#endif ec_master_destroy_slaves(master); master->slave_count = datagram->working_counter; @@ -812,6 +816,7 @@ void ec_fsm_master_state_scan_slaves( if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine return; +#ifdef EC_EOE if (slave->sii_mailbox_protocols & EC_MBOX_EOE) { // create EoE handler for this slave ec_eoe_t *eoe; @@ -828,6 +833,7 @@ void ec_fsm_master_state_scan_slaves( list_add_tail(&eoe->list, &master->eoe_handlers); } } +#endif // another slave to fetch? if (slave->list.next != &master->slaves) { @@ -841,7 +847,9 @@ void ec_fsm_master_state_scan_slaves( (u32) (jiffies - fsm->scan_jiffies) * 1000 / HZ); // check if EoE processing has to be started +#ifdef EC_EOE ec_master_eoe_start(master); +#endif master->scan_state = EC_REQUEST_COMPLETE; wake_up_interruptible(&master->scan_queue); diff --git a/master/master.c b/master/master.c index a0b787b4..690340bd 100644 --- a/master/master.c +++ b/master/master.c @@ -50,7 +50,9 @@ #include "slave.h" #include "device.h" #include "datagram.h" +#ifdef EC_EOE #include "ethernet.h" +#endif /*****************************************************************************/ @@ -58,7 +60,9 @@ void ec_master_destroy_domains(ec_master_t *); void ec_master_sync_io(ec_master_t *); static int ec_master_idle_thread(ec_master_t *); static int ec_master_operation_thread(ec_master_t *); +#ifdef EC_EOE void ec_master_eoe_run(unsigned long); +#endif void ec_master_check_sdo(unsigned long); int ec_master_measure_bus_time(ec_master_t *); ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); @@ -145,9 +149,12 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ for (i = 0; i < HZ; i++) { master->idle_cycle_times[i] = 0; +#ifdef EC_EOE master->eoe_cycle_times[i] = 0; +#endif } master->idle_cycle_time_pos = 0; +#ifdef EC_EOE master->eoe_cycle_time_pos = 0; init_timer(&master->eoe_timer); @@ -155,6 +162,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ master->eoe_timer.data = (unsigned long) master; master->eoe_running = 0; INIT_LIST_HEAD(&master->eoe_handlers); +#endif master->internal_lock = SPIN_LOCK_UNLOCKED; master->request_cb = NULL; @@ -228,7 +236,9 @@ void ec_master_clear( ec_master_t *master /**< EtherCAT master */ ) { +#ifdef EC_EOE ec_master_clear_eoe_handlers(master); +#endif ec_master_destroy_slaves(master); ec_master_destroy_domains(master); ec_fsm_master_clear(&master->fsm); @@ -243,6 +253,7 @@ void ec_master_clear( /*****************************************************************************/ +#ifdef EC_EOE /** * Clear and free all EoE handlers. */ @@ -259,6 +270,7 @@ void ec_master_clear_eoe_handlers( kfree(eoe); } } +#endif /*****************************************************************************/ @@ -394,7 +406,9 @@ void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */) { master->mode = EC_MASTER_MODE_ORPHANED; +#ifdef EC_EOE ec_master_eoe_stop(master); +#endif ec_master_thread_stop(master); ec_master_destroy_slaves(master); } @@ -408,7 +422,9 @@ void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */) int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */) { ec_slave_t *slave; +#ifdef EC_EOE ec_eoe_t *eoe; +#endif down(&master->config_sem); master->allow_config = 0; // temporarily disable slave configuration @@ -442,11 +458,13 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */) list_for_each_entry(slave, &master->slaves, list) { ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); } +#ifdef EC_EOE // ... but set EoE slaves to OP list_for_each_entry(eoe, &master->eoe_handlers, list) { if (ec_eoe_is_open(eoe)) ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); } +#endif if (master->debug_level) EC_DBG("Switching to operation mode.\n"); @@ -475,11 +493,15 @@ void ec_master_leave_operation_mode(ec_master_t *master /**< EtherCAT master */) { ec_slave_t *slave; +#ifdef EC_EOE ec_eoe_t *eoe; +#endif master->mode = EC_MASTER_MODE_IDLE; +#ifdef EC_EOE ec_master_eoe_stop(master); +#endif ec_master_thread_stop(master); master->request_cb = ec_master_request_cb; @@ -491,17 +513,21 @@ void ec_master_leave_operation_mode(ec_master_t *master ec_slave_reset(slave); ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); } +#ifdef EC_EOE // ... but leave EoE slaves in OP list_for_each_entry(eoe, &master->eoe_handlers, list) { if (ec_eoe_is_open(eoe)) ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); } +#endif ec_master_destroy_domains(master); if (ec_master_thread_start(master, ec_master_idle_thread)) EC_WARN("Failed to restart master thread!\n"); +#ifdef EC_EOE ec_master_eoe_start(master); +#endif master->allow_scan = 1; master->allow_config = 1; @@ -941,7 +967,9 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ ) { off_t off = 0; +#ifdef EC_EOE ec_eoe_t *eoe; +#endif uint32_t cur, sum, min, max, pos, i; off += sprintf(buffer + off, "\nMode: "); @@ -990,6 +1018,7 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ off += sprintf(buffer + off, " Idle cycle: %u / %u.%u / %u\n", min, sum / HZ, (sum * 100 / HZ) % 100, max); +#ifdef EC_EOE sum = 0; min = 0xFFFFFFFF; max = 0; @@ -1010,6 +1039,7 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ eoe->dev->name, eoe->rx_rate, eoe->tx_rate, ((eoe->rx_rate + eoe->tx_rate) / 8 + 512) / 1024); } +#endif off += sprintf(buffer + off, "\n"); @@ -1079,6 +1109,7 @@ ssize_t ec_store_master_attribute(struct kobject *kobj, /**< slave's kobject */ /*****************************************************************************/ +#ifdef EC_EOE /** Starts Ethernet-over-EtherCAT processing on demand. */ @@ -1136,6 +1167,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */) cycles_t cycles_start, cycles_end; unsigned long restart_jiffies; + list_for_each_entry(eoe, &master->eoe_handlers, list) { if (ec_eoe_is_open(eoe)) { none_open = 0; @@ -1173,6 +1205,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */) master->eoe_timer.expires += restart_jiffies; add_timer(&master->eoe_timer); } +#endif /*****************************************************************************/ @@ -1435,7 +1468,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */) } // restart EoE process and master thread with new locking +#ifdef EC_EOE ec_master_eoe_stop(master); +#endif ec_master_thread_stop(master); ec_master_prepare(master); // prepare asynchronous IO @@ -1453,7 +1488,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */) EC_ERR("Failed to start master thread!\n"); return -1; } +#ifdef EC_EOE ec_master_eoe_start(master); +#endif return 0; } diff --git a/master/master.h b/master/master.h index 11b51325..31c31f51 100644 --- a/master/master.h +++ b/master/master.h @@ -145,11 +145,13 @@ struct ec_master uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */ unsigned int idle_cycle_time_pos; /**< time ring buffer position */ +#ifdef EC_EOE struct timer_list eoe_timer; /**< EoE timer object */ unsigned int eoe_running; /**< non-zero, if EoE processing is active. */ struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */ uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */ unsigned int eoe_cycle_time_pos; /**< time ring buffer position */ +#endif spinlock_t internal_lock; /**< spinlock used in idle mode */ int (*request_cb)(void *); /**< lock request callback */ @@ -185,9 +187,11 @@ void ec_master_leave_idle_mode(ec_master_t *); int ec_master_enter_operation_mode(ec_master_t *); void ec_master_leave_operation_mode(ec_master_t *); +#ifdef EC_EOE // EoE void ec_master_eoe_start(ec_master_t *); void ec_master_eoe_stop(ec_master_t *); +#endif // datagram IO void ec_master_receive_datagrams(ec_master_t *, const uint8_t *, size_t); @@ -195,7 +199,9 @@ void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *); // misc. void ec_master_output_stats(ec_master_t *); +#ifdef EC_EOE void ec_master_clear_eoe_handlers(ec_master_t *); +#endif void ec_master_destroy_slaves(ec_master_t *); /*****************************************************************************/ -- GitLab