--- a/mini/ec_mini.c Fri Nov 25 10:16:50 2005 +0000
+++ b/mini/ec_mini.c Fri Nov 25 14:52:34 2005 +0000
@@ -9,10 +9,9 @@
******************************************************************************/
#include <linux/module.h>
-#include <linux/tqueue.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/completion.h>
+//#include <linux/slab.h>
+//#include <linux/delay.h>
+#include <linux/timer.h>
#include "../drivers/ec_master.h"
#include "../drivers/ec_device.h"
@@ -21,6 +20,8 @@
/******************************************************************************/
+#define ECAT
+
#define ECAT_OPEN
#define ECAT_MASTER
#define ECAT_SLAVES
@@ -28,6 +29,8 @@
/******************************************************************************/
+#ifdef ECAT
+
extern EtherCAT_device_t rtl_ecat_dev;
#ifdef ECAT_MASTER
@@ -38,61 +41,66 @@
static EtherCAT_slave_t ecat_slaves[] =
{
#if 0
- // Block 1
- ECAT_INIT_SLAVE(Beckhoff_EK1100),
- ECAT_INIT_SLAVE(Beckhoff_EL4102),
- ECAT_INIT_SLAVE(Beckhoff_EL3162),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL3102),
- ECAT_INIT_SLAVE(Beckhoff_EL4102),
- ECAT_INIT_SLAVE(Beckhoff_EL4102),
- ECAT_INIT_SLAVE(Beckhoff_EL4102),
- ECAT_INIT_SLAVE(Beckhoff_EL3162),
- ECAT_INIT_SLAVE(Beckhoff_EL3162),
- ECAT_INIT_SLAVE(Beckhoff_EL3162),
- ECAT_INIT_SLAVE(Beckhoff_EL3102),
- ECAT_INIT_SLAVE(Beckhoff_EL3102),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
-#endif
-
- // Block 2
- ECAT_INIT_SLAVE(Beckhoff_EK1100),
- ECAT_INIT_SLAVE(Beckhoff_EL4102),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL3162),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL3102),
-
- // Block 3
- ECAT_INIT_SLAVE(Beckhoff_EK1100),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL2004),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014),
- ECAT_INIT_SLAVE(Beckhoff_EL1014)
+ // Block 1
+ ECAT_INIT_SLAVE(Beckhoff_EK1100),
+ ECAT_INIT_SLAVE(Beckhoff_EL4102),
+ ECAT_INIT_SLAVE(Beckhoff_EL3162),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL3102),
+ ECAT_INIT_SLAVE(Beckhoff_EL4102),
+ ECAT_INIT_SLAVE(Beckhoff_EL4102),
+ ECAT_INIT_SLAVE(Beckhoff_EL4102),
+ ECAT_INIT_SLAVE(Beckhoff_EL3162),
+ ECAT_INIT_SLAVE(Beckhoff_EL3162),
+ ECAT_INIT_SLAVE(Beckhoff_EL3162),
+ ECAT_INIT_SLAVE(Beckhoff_EL3102),
+ ECAT_INIT_SLAVE(Beckhoff_EL3102),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+#endif
+
+ // Block 2
+ ECAT_INIT_SLAVE(Beckhoff_EK1100),
+ ECAT_INIT_SLAVE(Beckhoff_EL4102),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL3162),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL3102),
+
+ // Block 3
+ ECAT_INIT_SLAVE(Beckhoff_EK1100),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL2004),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014),
+ ECAT_INIT_SLAVE(Beckhoff_EL1014)
};
#define ECAT_SLAVES_COUNT (sizeof(ecat_slaves) / sizeof(EtherCAT_slave_t))
-#endif
+
+#endif // ECAT_SLAVES
+
+#endif // ECAT
#ifdef ECAT_CYCLIC_DATA
+
double value;
int dig1;
-struct tq_struct cyclic_task;
-struct clientdata {task_queue *queue;} cyclic_data;
-static DECLARE_COMPLETION(on_exit);
-#endif
+
+struct timer_list timer;
+unsigned long last_start_jiffies;
+
+#endif // ECAT_CYCLIC_DATA
/******************************************************************************
*
@@ -100,31 +108,34 @@
*
*****************************************************************************/
+#ifdef ECAT
#ifdef ECAT_CYCLIC_DATA
+
static int next2004(int *wrap)
{
- static int i = 0;
- unsigned int j = 0;
-
- *wrap = 0;
-
- for (j = 0; j < ECAT_SLAVES_COUNT; j++)
- {
- i++;
-
- i %= ECAT_SLAVES_COUNT;
-
- if (i == 0) *wrap = 1;
-
- if (ecat_slaves[i].desc == Beckhoff_EL2004)
- {
- return i;
- }
- }
-
- return -1;
+ static int i = 0;
+ unsigned int j = 0;
+
+ *wrap = 0;
+
+ for (j = 0; j < ECAT_SLAVES_COUNT; j++)
+ {
+ i++;
+
+ i %= ECAT_SLAVES_COUNT;
+
+ if (i == 0) *wrap = 1;
+
+ if (ecat_slaves[i].desc == Beckhoff_EL2004)
+ {
+ return i;
+ }
+ }
+
+ return -1;
}
#endif
+#endif
/******************************************************************************
*
@@ -135,248 +146,266 @@
*****************************************************************************/
#ifdef ECAT_CYCLIC_DATA
-void run(void *ptr)
+
+static void run(unsigned long data)
{
- struct clientdata *data = (struct clientdata *) ptr;
-
-#if 1
- static int ms = 0;
- static int cnt = 0;
- static unsigned long int k = 0;
- static int firstrun = 1;
-
- static int klemme = 12;
- static int kanal = 0;
- static int up_down = 0;
- int wrap = 0;
-
- ms++;
- ms %= 1000;
+#ifdef ECAT
+ static int ms = 0;
+ static int cnt = 0;
+ static unsigned long int k = 0;
+ static int firstrun = 1;
+
+ static int klemme = 12;
+ static int kanal = 0;
+ static int up_down = 0;
+ int wrap = 0;
+
+ ms++;
+ ms %= 1000;
#if 0
- ecat_tx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->tx_time-k))
- / (current_cpu_data.loops_per_jiffy / 10);
- ecat_rx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->rx_time-k))
- / (current_cpu_data.loops_per_jiffy / 10);
-
- rx_intr = ecat_master->dev->rx_intr_cnt;
- tx_intr = ecat_master->dev->tx_intr_cnt;
- total_intr = ecat_master->dev->intr_cnt;
-#endif
-
- // Prozessdaten lesen
- if (!firstrun)
- {
- klemme = next2004(&wrap);
-
- EtherCAT_read_process_data(ecat_master);
-
- // Daten lesen und skalieren
- value = EtherCAT_read_value(&ecat_master->slaves[5], 0) / 3276.7;
- dig1 = EtherCAT_read_value(&ecat_master->slaves[3], 0);
- }
+ ecat_tx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->tx_time-k))
+ / (current_cpu_data.loops_per_jiffy / 10);
+ ecat_rx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->rx_time-k))
+ / (current_cpu_data.loops_per_jiffy / 10);
+
+ rx_intr = ecat_master->dev->rx_intr_cnt;
+ tx_intr = ecat_master->dev->tx_intr_cnt;
+ total_intr = ecat_master->dev->intr_cnt;
+#endif
+
+ // Prozessdaten lesen
+ if (!firstrun)
+ {
+ klemme = next2004(&wrap);
+
+ EtherCAT_read_process_data(ecat_master);
+
+ // Daten lesen und skalieren
+ value = EtherCAT_read_value(&ecat_master->slaves[5], 0) / 3276.7;
+ dig1 = EtherCAT_read_value(&ecat_master->slaves[3], 0);
+ }
#if 0
- // Daten schreiben
- EtherCAT_write_value(&ecat_master->slaves[4], 0, ms > 500 ? 1 : 0);
- EtherCAT_write_value(&ecat_master->slaves[4], 1, ms > 500 ? 0 : 1);
- EtherCAT_write_value(&ecat_master->slaves[4], 2, ms > 500 ? 0 : 1);
- EtherCAT_write_value(&ecat_master->slaves[4], 3, ms > 500 ? 1 : 0);
-#endif
-
- if (cnt++ > 20)
- {
- cnt = 0;
-
- if (++kanal > 3)
- {
- kanal = 0;
- klemme = next2004(&wrap);
-
- if (wrap == 1)
- {
- if (up_down == 1) up_down = 0;
- else up_down = 1;
- }
- }
- }
-
- if (klemme >= 0)
- EtherCAT_write_value(&ecat_master->slaves[klemme], kanal,up_down);
+ // Daten schreiben
+ EtherCAT_write_value(&ecat_master->slaves[4], 0, ms > 500 ? 1 : 0);
+ EtherCAT_write_value(&ecat_master->slaves[4], 1, ms > 500 ? 0 : 1);
+ EtherCAT_write_value(&ecat_master->slaves[4], 2, ms > 500 ? 0 : 1);
+ EtherCAT_write_value(&ecat_master->slaves[4], 3, ms > 500 ? 1 : 0);
+#endif
+
+ if (cnt++ > 20)
+ {
+ cnt = 0;
+
+ if (++kanal > 3)
+ {
+ kanal = 0;
+ klemme = next2004(&wrap);
+
+ if (wrap == 1)
+ {
+ if (up_down == 1) up_down = 0;
+ else up_down = 1;
+ }
+ }
+ }
+
+ if (klemme >= 0)
+ EtherCAT_write_value(&ecat_master->slaves[klemme], kanal,up_down);
#if 0
- EtherCAT_write_value(&ecat_master->slaves[13], 1, ms > 500 ? 0 : 1);
- EtherCAT_write_value(&ecat_master->slaves[14], 2, ms > 500 ? 0 : 1);
- EtherCAT_write_value(&ecat_master->slaves[15], 3, ms > 500 ? 1 : 0);
-#endif
-
- // Prozessdaten schreiben
- rdtscl(k);
- EtherCAT_write_process_data(ecat_master);
- firstrun = 0;
-#endif
-
- if (data->queue)
- {
- // Neu in die Taskqueue eintragen
- queue_task(&cyclic_task, data->queue);
- }
- else
- {
- //last_queue_finished = 0;
- complete(&on_exit);
- }
+ EtherCAT_write_value(&ecat_master->slaves[13], 1, ms > 500 ? 0 : 1);
+ EtherCAT_write_value(&ecat_master->slaves[14], 2, ms > 500 ? 0 : 1);
+ EtherCAT_write_value(&ecat_master->slaves[15], 3, ms > 500 ? 1 : 0);
+#endif
+
+ // Prozessdaten schreiben
+ rdtscl(k);
+ EtherCAT_write_process_data(ecat_master);
+ firstrun = 0;
+#endif
+
+ timer.expires += HZ / 100;
+ add_timer(&timer);
}
-#endif
+
+#endif // ECAT_CYCLIC_DATA
/******************************************************************************
-*
-* Function: init
-*
-******************************************************************************/
-
-int init()
+ *
+ * Function: init
+ *
+ ******************************************************************************/
+
+int __init init_module()
{
+#ifdef ECAT
#ifdef ECAT_OPEN
- int rv = -1;
-#endif
-
- EC_DBG(KERN_INFO "=== Starting Minimal EtherCAT environment... ===\n");
-
- EtherCAT_device_debug(&rtl_ecat_dev);
- //mdelay(5000);
+ int rv = -1;
+#endif
+#endif
+
+ EC_DBG(KERN_INFO "=== Starting Minimal EtherCAT environment... ===\n");
+
+#ifdef ECAT
+
+ EtherCAT_device_debug(&rtl_ecat_dev);
#ifdef ECAT_OPEN
- EC_DBG("Opening EtherCAT device.\n");
-
- // HIER PASSIERT DER FEHLER:
- if (EtherCAT_device_open(&rtl_ecat_dev) < 0)
- {
- EC_DBG(KERN_ERR "msr_modul: Could not initialize EtherCAT NIC.\n");
- goto out_nothing;
- }
-
- if (!rtl_ecat_dev.dev) // Es gibt kein EtherCAT-Device
- {
- EC_DBG(KERN_ERR "msr_modul: No EtherCAT device!\n");
- goto out_close;
- }
-#endif
+ EC_DBG("Opening EtherCAT device.\n");
+
+ // HIER PASSIERT DER FEHLER:
+ if (EtherCAT_device_open(&rtl_ecat_dev) < 0)
+ {
+ EC_DBG(KERN_ERR "msr_modul: Could not initialize EtherCAT NIC.\n");
+ goto out_nothing;
+ }
+
+ if (!rtl_ecat_dev.dev) // Es gibt kein EtherCAT-Device
+ {
+ EC_DBG(KERN_ERR "msr_modul: No EtherCAT device!\n");
+ goto out_close;
+ }
+#endif // ECAT_OPEN
#ifdef ECAT_MASTER
- EC_DBG("Initialising EtherCAT master\n");
-
- if ((ecat_master = (EtherCAT_master_t *) kmalloc(sizeof(EtherCAT_master_t), GFP_KERNEL)) == 0)
- {
- EC_DBG(KERN_ERR "msr_modul: Could not alloc memory for EtherCAT master!\n");
- goto out_close;
- }
-
- if (EtherCAT_master_init(ecat_master, &rtl_ecat_dev) < 0)
- {
- EC_DBG(KERN_ERR "EtherCAT could not init master!\n");
- goto out_master;
- }
-
- //ecat_master->debug_level = 1;
-#endif
+ EC_DBG("Initialising EtherCAT master\n");
+
+ if ((ecat_master = (EtherCAT_master_t *) kmalloc(sizeof(EtherCAT_master_t), GFP_KERNEL)) == 0)
+ {
+ EC_DBG(KERN_ERR "msr_modul: Could not alloc memory for EtherCAT master!\n");
+ goto out_close;
+ }
+
+ if (EtherCAT_master_init(ecat_master, &rtl_ecat_dev) < 0)
+ {
+ EC_DBG(KERN_ERR "EtherCAT could not init master!\n");
+ goto out_master;
+ }
+
+ //ecat_master->debug_level = 1;
+
+#endif // ECAT_MASTER
#ifdef ECAT_SLAVES
- EC_DBG("Checking EtherCAT slaves.\n");
-
- if (EtherCAT_check_slaves(ecat_master, ecat_slaves, ECAT_SLAVES_COUNT) != 0)
- {
- EC_DBG(KERN_ERR "EtherCAT: Could not init slaves!\n");
- goto out_masterclear;
- }
-
- EC_DBG("Activating all EtherCAT slaves.\n");
-
- if (EtherCAT_activate_all_slaves(ecat_master) != 0)
- {
- EC_DBG(KERN_ERR "EtherCAT: Could not activate slaves!\n");
- goto out_masterclear;
- }
-#endif
+ EC_DBG("Checking EtherCAT slaves.\n");
+
+ if (EtherCAT_check_slaves(ecat_master, ecat_slaves, ECAT_SLAVES_COUNT) != 0)
+ {
+ EC_DBG(KERN_ERR "EtherCAT: Could not init slaves!\n");
+ goto out_masterclear;
+ }
+
+ EC_DBG("Activating all EtherCAT slaves.\n");
+
+ if (EtherCAT_activate_all_slaves(ecat_master) != 0)
+ {
+ EC_DBG(KERN_ERR "EtherCAT: Could not activate slaves!\n");
+ goto out_masterclear;
+ }
+#endif
+
+#endif // ECAT
#ifdef ECAT_CYCLIC_DATA
- EC_DBG("Starting cyclic sample thread.\n");
-
- cyclic_task.routine = run;
- cyclic_task.data = (void *) &cyclic_data;
- cyclic_data.queue = &tq_timer;
- queue_task(&cyclic_task, &tq_timer);
-
- EC_DBG("Initialised sample thread.\n");
-#endif
-
- EC_DBG(KERN_INFO "=== Minimal EtherCAT environment started. ===\n");
-
- return 0;
+ EC_DBG("Starting cyclic sample thread.\n");
+
+ init_timer(&timer);
+
+ timer.function = run;
+ timer.data = 0;
+ timer.expires = jiffies; // Das erste Mal sofort feuern
+ last_start_jiffies = timer.expires;
+ add_timer(&timer);
+
+ EC_DBG("Initialised sample thread.\n");
+#endif
+
+ EC_DBG(KERN_INFO "=== Minimal EtherCAT environment started. ===\n");
+
+ return 0;
+
+#ifdef ECAT
#ifdef ECAT_SLAVES
out_masterclear:
- EC_DBG(KERN_INFO "Clearing EtherCAT master.\n");
- EtherCAT_master_clear(ecat_master);
+ EC_DBG(KERN_INFO "Clearing EtherCAT master.\n");
+ EtherCAT_master_clear(ecat_master);
#endif
#ifdef ECAT_MASTER
out_master:
- EC_DBG(KERN_INFO "Freeing EtherCAT master.\n");
- kfree(ecat_master);
+ EC_DBG(KERN_INFO "Freeing EtherCAT master.\n");
+ kfree(ecat_master);
#endif
#ifdef ECAT_OPEN
out_close:
- EC_DBG(KERN_INFO "Closing device.\n");
- EtherCAT_device_close(&rtl_ecat_dev);
+ EC_DBG(KERN_INFO "Closing device.\n");
+ EtherCAT_device_close(&rtl_ecat_dev);
out_nothing:
- return rv;
-#endif
+ return rv;
+#endif
+
+#endif // ECAT
}
/******************************************************************************
-*
-* Function: cleanup
-*
-******************************************************************************/
-
-void cleanup()
+ *
+ * Function: cleanup
+ *
+ ******************************************************************************/
+
+void __exit cleanup_module()
{
- EC_DBG(KERN_INFO "=== Stopping Minimal EtherCAT environment... ===\n");
+ EC_DBG(KERN_INFO "=== Stopping Minimal EtherCAT environment... ===\n");
#ifdef ECAT_MASTER
- if (ecat_master)
- {
- //ecat_master->debug_level = 1;
+
+#ifdef ECAT
+ if (ecat_master)
+ {
+#endif
+ //ecat_master->debug_level = 1;
#ifdef ECAT_CYCLIC_DATA
- cyclic_data.queue = NULL;
- wait_for_completion(&on_exit);
- EtherCAT_clear_process_data(ecat_master);
-#endif
+
+ del_timer_sync(&timer);
+
+#ifdef ECAT
+ EtherCAT_clear_process_data(ecat_master);
+#endif
+
+#endif // ECAT_CYCLIC_DATA
+
+#ifdef ECAT
#ifdef ECAT_SLAVES
- EC_DBG(KERN_INFO "Deactivating slaves.\n");
- EtherCAT_deactivate_all_slaves(ecat_master);
-#endif
-
- EC_DBG(KERN_INFO "Clearing EtherCAT master.\n");
- EtherCAT_master_clear(ecat_master);
-
- EC_DBG(KERN_INFO "Freeing EtherCAT master.\n");
- kfree(ecat_master);
- ecat_master = NULL;
- }
-#endif
-
+ EC_DBG(KERN_INFO "Deactivating slaves.\n");
+ EtherCAT_deactivate_all_slaves(ecat_master);
+#endif
+
+ EC_DBG(KERN_INFO "Clearing EtherCAT master.\n");
+ EtherCAT_master_clear(ecat_master);
+
+ EC_DBG(KERN_INFO "Freeing EtherCAT master.\n");
+ kfree(ecat_master);
+ ecat_master = NULL;
+ }
+#endif // ECAT
+
+#endif // ECAT_MASTER
+
+#ifdef ECAT
#ifdef ECAT_OPEN
- EC_DBG(KERN_INFO "Closing device.\n");
- EtherCAT_device_close(&rtl_ecat_dev);
-#endif
-
- EC_DBG(KERN_INFO "=== Minimal EtherCAT environment stopped. ===\n");
+ EC_DBG(KERN_INFO "Closing device.\n");
+ EtherCAT_device_close(&rtl_ecat_dev);
+#endif
+#endif
+
+ EC_DBG(KERN_INFO "=== Minimal EtherCAT environment stopped. ===\n");
}
/*****************************************************************************/
@@ -385,7 +414,7 @@
MODULE_AUTHOR ("Florian Pose <fp@igh-essen.com>");
MODULE_DESCRIPTION ("Minimal EtherCAT environment");
-module_init(init);
-module_exit(cleanup);
+module_init(init_module);
+module_exit(cleanup_module);
/*****************************************************************************/