Skip to content
Snippets Groups Projects
Commit 1a3b0776 authored by Florian Pose's avatar Florian Pose
Browse files

Added --enable-eoe conditional.

parent 2ec3091a
No related branches found
No related tags found
No related merge requests found
...@@ -413,6 +413,31 @@ AC_ARG_ENABLE([dummy], ...@@ -413,6 +413,31 @@ AC_ARG_ENABLE([dummy],
AM_CONDITIONAL(ENABLE_DUMMY, test "x$dummy" = "x1") 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 # Create config.kbuild
...@@ -433,6 +458,7 @@ RTAI_DIR := "${rtaidir}" ...@@ -433,6 +458,7 @@ RTAI_DIR := "${rtaidir}"
MSR_DIR := "${msrdir}" MSR_DIR := "${msrdir}"
ENABLE_DEBUG_IF := ${dbg} ENABLE_DEBUG_IF := ${dbg}
ENABLE_DUMMY := ${dummy} ENABLE_DUMMY := ${dummy}
ENABLE_EOE := ${eoe}
EOF EOF
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
......
...@@ -36,9 +36,12 @@ include $(src)/../config.kbuild ...@@ -36,9 +36,12 @@ include $(src)/../config.kbuild
obj-m := ec_master.o obj-m := ec_master.o
ec_master-objs := module.o master.o device.o pdo.o sync.o fmmu.o slave.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 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) ifeq ($(ENABLE_DEBUG_IF),1)
ec_master-objs += debug.o ec_master-objs += debug.o
endif endif
......
...@@ -41,7 +41,9 @@ ...@@ -41,7 +41,9 @@
#include "globals.h" #include "globals.h"
#include "master.h" #include "master.h"
#include "mailbox.h" #include "mailbox.h"
#ifdef EC_EOE
#include "ethernet.h" #include "ethernet.h"
#endif
#include "fsm_master.h" #include "fsm_master.h"
/*****************************************************************************/ /*****************************************************************************/
...@@ -238,8 +240,10 @@ void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machin ...@@ -238,8 +240,10 @@ void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machin
fsm->idle = 0; fsm->idle = 0;
fsm->scan_jiffies = jiffies; fsm->scan_jiffies = jiffies;
#ifdef EC_EOE
ec_master_eoe_stop(master); ec_master_eoe_stop(master);
ec_master_clear_eoe_handlers(master); ec_master_clear_eoe_handlers(master);
#endif
ec_master_destroy_slaves(master); ec_master_destroy_slaves(master);
master->slave_count = datagram->working_counter; master->slave_count = datagram->working_counter;
...@@ -812,6 +816,7 @@ void ec_fsm_master_state_scan_slaves( ...@@ -812,6 +816,7 @@ void ec_fsm_master_state_scan_slaves(
if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine
return; return;
#ifdef EC_EOE
if (slave->sii_mailbox_protocols & EC_MBOX_EOE) { if (slave->sii_mailbox_protocols & EC_MBOX_EOE) {
// create EoE handler for this slave // create EoE handler for this slave
ec_eoe_t *eoe; ec_eoe_t *eoe;
...@@ -828,6 +833,7 @@ void ec_fsm_master_state_scan_slaves( ...@@ -828,6 +833,7 @@ void ec_fsm_master_state_scan_slaves(
list_add_tail(&eoe->list, &master->eoe_handlers); list_add_tail(&eoe->list, &master->eoe_handlers);
} }
} }
#endif
// another slave to fetch? // another slave to fetch?
if (slave->list.next != &master->slaves) { if (slave->list.next != &master->slaves) {
...@@ -841,7 +847,9 @@ void ec_fsm_master_state_scan_slaves( ...@@ -841,7 +847,9 @@ void ec_fsm_master_state_scan_slaves(
(u32) (jiffies - fsm->scan_jiffies) * 1000 / HZ); (u32) (jiffies - fsm->scan_jiffies) * 1000 / HZ);
// check if EoE processing has to be started // check if EoE processing has to be started
#ifdef EC_EOE
ec_master_eoe_start(master); ec_master_eoe_start(master);
#endif
master->scan_state = EC_REQUEST_COMPLETE; master->scan_state = EC_REQUEST_COMPLETE;
wake_up_interruptible(&master->scan_queue); wake_up_interruptible(&master->scan_queue);
......
...@@ -50,7 +50,9 @@ ...@@ -50,7 +50,9 @@
#include "slave.h" #include "slave.h"
#include "device.h" #include "device.h"
#include "datagram.h" #include "datagram.h"
#ifdef EC_EOE
#include "ethernet.h" #include "ethernet.h"
#endif
/*****************************************************************************/ /*****************************************************************************/
...@@ -58,7 +60,9 @@ void ec_master_destroy_domains(ec_master_t *); ...@@ -58,7 +60,9 @@ void ec_master_destroy_domains(ec_master_t *);
void ec_master_sync_io(ec_master_t *); void ec_master_sync_io(ec_master_t *);
static int ec_master_idle_thread(ec_master_t *); static int ec_master_idle_thread(ec_master_t *);
static int ec_master_operation_thread(ec_master_t *); static int ec_master_operation_thread(ec_master_t *);
#ifdef EC_EOE
void ec_master_eoe_run(unsigned long); void ec_master_eoe_run(unsigned long);
#endif
void ec_master_check_sdo(unsigned long); void ec_master_check_sdo(unsigned long);
int ec_master_measure_bus_time(ec_master_t *); int ec_master_measure_bus_time(ec_master_t *);
ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *); 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 */ ...@@ -145,9 +149,12 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
for (i = 0; i < HZ; i++) { for (i = 0; i < HZ; i++) {
master->idle_cycle_times[i] = 0; master->idle_cycle_times[i] = 0;
#ifdef EC_EOE
master->eoe_cycle_times[i] = 0; master->eoe_cycle_times[i] = 0;
#endif
} }
master->idle_cycle_time_pos = 0; master->idle_cycle_time_pos = 0;
#ifdef EC_EOE
master->eoe_cycle_time_pos = 0; master->eoe_cycle_time_pos = 0;
init_timer(&master->eoe_timer); init_timer(&master->eoe_timer);
...@@ -155,6 +162,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ ...@@ -155,6 +162,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
master->eoe_timer.data = (unsigned long) master; master->eoe_timer.data = (unsigned long) master;
master->eoe_running = 0; master->eoe_running = 0;
INIT_LIST_HEAD(&master->eoe_handlers); INIT_LIST_HEAD(&master->eoe_handlers);
#endif
master->internal_lock = SPIN_LOCK_UNLOCKED; master->internal_lock = SPIN_LOCK_UNLOCKED;
master->request_cb = NULL; master->request_cb = NULL;
...@@ -228,7 +236,9 @@ void ec_master_clear( ...@@ -228,7 +236,9 @@ void ec_master_clear(
ec_master_t *master /**< EtherCAT master */ ec_master_t *master /**< EtherCAT master */
) )
{ {
#ifdef EC_EOE
ec_master_clear_eoe_handlers(master); ec_master_clear_eoe_handlers(master);
#endif
ec_master_destroy_slaves(master); ec_master_destroy_slaves(master);
ec_master_destroy_domains(master); ec_master_destroy_domains(master);
ec_fsm_master_clear(&master->fsm); ec_fsm_master_clear(&master->fsm);
...@@ -243,6 +253,7 @@ void ec_master_clear( ...@@ -243,6 +253,7 @@ void ec_master_clear(
/*****************************************************************************/ /*****************************************************************************/
#ifdef EC_EOE
/** /**
* Clear and free all EoE handlers. * Clear and free all EoE handlers.
*/ */
...@@ -259,6 +270,7 @@ void ec_master_clear_eoe_handlers( ...@@ -259,6 +270,7 @@ void ec_master_clear_eoe_handlers(
kfree(eoe); kfree(eoe);
} }
} }
#endif
/*****************************************************************************/ /*****************************************************************************/
...@@ -394,7 +406,9 @@ void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */) ...@@ -394,7 +406,9 @@ void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */)
{ {
master->mode = EC_MASTER_MODE_ORPHANED; master->mode = EC_MASTER_MODE_ORPHANED;
#ifdef EC_EOE
ec_master_eoe_stop(master); ec_master_eoe_stop(master);
#endif
ec_master_thread_stop(master); ec_master_thread_stop(master);
ec_master_destroy_slaves(master); ec_master_destroy_slaves(master);
} }
...@@ -408,7 +422,9 @@ void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT 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 */) int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
{ {
ec_slave_t *slave; ec_slave_t *slave;
#ifdef EC_EOE
ec_eoe_t *eoe; ec_eoe_t *eoe;
#endif
down(&master->config_sem); down(&master->config_sem);
master->allow_config = 0; // temporarily disable slave configuration master->allow_config = 0; // temporarily disable slave configuration
...@@ -442,11 +458,13 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */) ...@@ -442,11 +458,13 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
list_for_each_entry(slave, &master->slaves, list) { list_for_each_entry(slave, &master->slaves, list) {
ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
} }
#ifdef EC_EOE
// ... but set EoE slaves to OP // ... but set EoE slaves to OP
list_for_each_entry(eoe, &master->eoe_handlers, list) { list_for_each_entry(eoe, &master->eoe_handlers, list) {
if (ec_eoe_is_open(eoe)) if (ec_eoe_is_open(eoe))
ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP);
} }
#endif
if (master->debug_level) if (master->debug_level)
EC_DBG("Switching to operation mode.\n"); EC_DBG("Switching to operation mode.\n");
...@@ -475,11 +493,15 @@ void ec_master_leave_operation_mode(ec_master_t *master ...@@ -475,11 +493,15 @@ void ec_master_leave_operation_mode(ec_master_t *master
/**< EtherCAT master */) /**< EtherCAT master */)
{ {
ec_slave_t *slave; ec_slave_t *slave;
#ifdef EC_EOE
ec_eoe_t *eoe; ec_eoe_t *eoe;
#endif
master->mode = EC_MASTER_MODE_IDLE; master->mode = EC_MASTER_MODE_IDLE;
#ifdef EC_EOE
ec_master_eoe_stop(master); ec_master_eoe_stop(master);
#endif
ec_master_thread_stop(master); ec_master_thread_stop(master);
master->request_cb = ec_master_request_cb; master->request_cb = ec_master_request_cb;
...@@ -491,17 +513,21 @@ void ec_master_leave_operation_mode(ec_master_t *master ...@@ -491,17 +513,21 @@ void ec_master_leave_operation_mode(ec_master_t *master
ec_slave_reset(slave); ec_slave_reset(slave);
ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
} }
#ifdef EC_EOE
// ... but leave EoE slaves in OP // ... but leave EoE slaves in OP
list_for_each_entry(eoe, &master->eoe_handlers, list) { list_for_each_entry(eoe, &master->eoe_handlers, list) {
if (ec_eoe_is_open(eoe)) if (ec_eoe_is_open(eoe))
ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP);
} }
#endif
ec_master_destroy_domains(master); ec_master_destroy_domains(master);
if (ec_master_thread_start(master, ec_master_idle_thread)) if (ec_master_thread_start(master, ec_master_idle_thread))
EC_WARN("Failed to restart master thread!\n"); EC_WARN("Failed to restart master thread!\n");
#ifdef EC_EOE
ec_master_eoe_start(master); ec_master_eoe_start(master);
#endif
master->allow_scan = 1; master->allow_scan = 1;
master->allow_config = 1; master->allow_config = 1;
...@@ -941,7 +967,9 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ ...@@ -941,7 +967,9 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */
) )
{ {
off_t off = 0; off_t off = 0;
#ifdef EC_EOE
ec_eoe_t *eoe; ec_eoe_t *eoe;
#endif
uint32_t cur, sum, min, max, pos, i; uint32_t cur, sum, min, max, pos, i;
off += sprintf(buffer + off, "\nMode: "); off += sprintf(buffer + off, "\nMode: ");
...@@ -990,6 +1018,7 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ ...@@ -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", off += sprintf(buffer + off, " Idle cycle: %u / %u.%u / %u\n",
min, sum / HZ, (sum * 100 / HZ) % 100, max); min, sum / HZ, (sum * 100 / HZ) % 100, max);
#ifdef EC_EOE
sum = 0; sum = 0;
min = 0xFFFFFFFF; min = 0xFFFFFFFF;
max = 0; max = 0;
...@@ -1010,6 +1039,7 @@ ssize_t ec_master_info(ec_master_t *master, /**< EtherCAT master */ ...@@ -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->dev->name, eoe->rx_rate, eoe->tx_rate,
((eoe->rx_rate + eoe->tx_rate) / 8 + 512) / 1024); ((eoe->rx_rate + eoe->tx_rate) / 8 + 512) / 1024);
} }
#endif
off += sprintf(buffer + off, "\n"); off += sprintf(buffer + off, "\n");
...@@ -1079,6 +1109,7 @@ ssize_t ec_store_master_attribute(struct kobject *kobj, /**< slave's kobject */ ...@@ -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. Starts Ethernet-over-EtherCAT processing on demand.
*/ */
...@@ -1136,6 +1167,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */) ...@@ -1136,6 +1167,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */)
cycles_t cycles_start, cycles_end; cycles_t cycles_start, cycles_end;
unsigned long restart_jiffies; unsigned long restart_jiffies;
list_for_each_entry(eoe, &master->eoe_handlers, list) { list_for_each_entry(eoe, &master->eoe_handlers, list) {
if (ec_eoe_is_open(eoe)) { if (ec_eoe_is_open(eoe)) {
none_open = 0; none_open = 0;
...@@ -1173,6 +1205,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */) ...@@ -1173,6 +1205,7 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */)
master->eoe_timer.expires += restart_jiffies; master->eoe_timer.expires += restart_jiffies;
add_timer(&master->eoe_timer); add_timer(&master->eoe_timer);
} }
#endif
/*****************************************************************************/ /*****************************************************************************/
...@@ -1435,7 +1468,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */) ...@@ -1435,7 +1468,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
} }
// restart EoE process and master thread with new locking // restart EoE process and master thread with new locking
#ifdef EC_EOE
ec_master_eoe_stop(master); ec_master_eoe_stop(master);
#endif
ec_master_thread_stop(master); ec_master_thread_stop(master);
ec_master_prepare(master); // prepare asynchronous IO ec_master_prepare(master); // prepare asynchronous IO
...@@ -1453,7 +1488,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */) ...@@ -1453,7 +1488,9 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
EC_ERR("Failed to start master thread!\n"); EC_ERR("Failed to start master thread!\n");
return -1; return -1;
} }
#ifdef EC_EOE
ec_master_eoe_start(master); ec_master_eoe_start(master);
#endif
return 0; return 0;
} }
......
...@@ -145,11 +145,13 @@ struct ec_master ...@@ -145,11 +145,13 @@ struct ec_master
uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */ uint32_t idle_cycle_times[HZ]; /**< Idle cycle times ring */
unsigned int idle_cycle_time_pos; /**< time ring buffer position */ unsigned int idle_cycle_time_pos; /**< time ring buffer position */
#ifdef EC_EOE
struct timer_list eoe_timer; /**< EoE timer object */ struct timer_list eoe_timer; /**< EoE timer object */
unsigned int eoe_running; /**< non-zero, if EoE processing is active. */ unsigned int eoe_running; /**< non-zero, if EoE processing is active. */
struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */ struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */
uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */ uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */
unsigned int eoe_cycle_time_pos; /**< time ring buffer position */ unsigned int eoe_cycle_time_pos; /**< time ring buffer position */
#endif
spinlock_t internal_lock; /**< spinlock used in idle mode */ spinlock_t internal_lock; /**< spinlock used in idle mode */
int (*request_cb)(void *); /**< lock request callback */ int (*request_cb)(void *); /**< lock request callback */
...@@ -185,9 +187,11 @@ void ec_master_leave_idle_mode(ec_master_t *); ...@@ -185,9 +187,11 @@ void ec_master_leave_idle_mode(ec_master_t *);
int ec_master_enter_operation_mode(ec_master_t *); int ec_master_enter_operation_mode(ec_master_t *);
void ec_master_leave_operation_mode(ec_master_t *); void ec_master_leave_operation_mode(ec_master_t *);
#ifdef EC_EOE
// EoE // EoE
void ec_master_eoe_start(ec_master_t *); void ec_master_eoe_start(ec_master_t *);
void ec_master_eoe_stop(ec_master_t *); void ec_master_eoe_stop(ec_master_t *);
#endif
// datagram IO // datagram IO
void ec_master_receive_datagrams(ec_master_t *, const uint8_t *, size_t); 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 *); ...@@ -195,7 +199,9 @@ void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *);
// misc. // misc.
void ec_master_output_stats(ec_master_t *); void ec_master_output_stats(ec_master_t *);
#ifdef EC_EOE
void ec_master_clear_eoe_handlers(ec_master_t *); void ec_master_clear_eoe_handlers(ec_master_t *);
#endif
void ec_master_destroy_slaves(ec_master_t *); void ec_master_destroy_slaves(ec_master_t *);
/*****************************************************************************/ /*****************************************************************************/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment