mini/ec_mini.c
branchkernel2.6
changeset 22 e8c2cd004e0b
parent 13 db0742533c10
child 23 39364fbcd069
--- 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);
 
 /*****************************************************************************/