rt/msr_module.c
changeset 104 052bc82d5442
parent 98 f564d0929292
child 106 d6679c77ad3f
--- a/rt/msr_module.c	Wed Mar 15 20:19:05 2006 +0000
+++ b/rt/msr_module.c	Fri Mar 17 14:21:35 2006 +0000
@@ -23,6 +23,7 @@
 #include <linux/ipipe.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
+#include <linux/delay.h>
 
 // RT_lib
 #include <msr_main.h>
@@ -34,8 +35,9 @@
 #include "msr_param.h"
 
 // EtherCAT
-#include "../include/EtherCAT_rt.h"
-#include "../include/EtherCAT_si.h"
+#include "../include/ecrt.h"
+
+//#define ASYNC
 
 // Defines/Makros
 #define HZREDUCTION (MSR_ABTASTFREQUENZ / HZ)
@@ -59,14 +61,17 @@
 
 uint32_t k_angle;
 uint32_t k_pos;
+uint32_t k_preio;
+uint32_t k_postio;
+uint32_t k_finished;
 
 ec_field_init_t domain1_fields[] = {
-    {&r_ssi,  "1", "Beckhoff", "EL5001", ec_ipvalue, 0, 1},
+    {&r_ssi,  "1", "Beckhoff", "EL5001", "InputValue", 0, 1},
     {}
 };
 
 ec_field_init_t domain2_fields[] = {
-    {&r_ssi2,  "1", "Beckhoff", "EL5001", ec_ipvalue, 0, 1},
+    {&r_ssi2,  "1", "Beckhoff", "EL5001", "InputValue", 0, 1},
     {}
 };
 
@@ -74,27 +79,48 @@
 
 static void msr_controller_run(void)
 {
+    cycles_t offset;
     static unsigned int counter = 0;
 
+    offset = get_cycles();
+
     if (counter) counter--;
     else {
         //EtherCAT_rt_master_debug(master, 2);
         counter = MSR_ABTASTFREQUENZ;
     }
 
-    // Prozessdaten lesen und schreiben
-    EtherCAT_rt_domain_queue(domain1);
-    EtherCAT_rt_domain_queue(domain2);
-
-    EtherCAT_rt_master_xio(master);
-
-    EtherCAT_rt_domain_process(domain1);
-    EtherCAT_rt_domain_process(domain2);
-
-    //k_angle = EC_READ_U16(r_inc);
+    k_preio = (uint32_t) (get_cycles() - offset) * 1e6 / cpu_khz;
+
+#ifdef ASYNC
+    // Empfangen
+    ecrt_master_async_receive(master);
+    ecrt_domain_process(domain1);
+    ecrt_domain_process(domain2);
+
+    // Prozessdaten verarbeiten
     k_pos = EC_READ_U32(r_ssi);
 
-    //EtherCAT_rt_master_debug(master, 0);
+    // Senden
+    ecrt_domain_queue(domain1);
+    ecrt_domain_queue(domain2);
+    ecrt_master_async_send(master);
+#else
+    // Senden und empfangen
+    ecrt_domain_queue(domain1);
+    ecrt_domain_queue(domain2);
+    ecrt_master_sync_io(master);
+    ecrt_domain_process(domain1);
+    ecrt_domain_process(domain2);
+
+    // Prozessdaten verarbeiten
+    k_pos = EC_READ_U32(r_ssi);
+#endif
+
+    k_postio = (uint32_t) (get_cycles() - offset) * 1e6 / cpu_khz;
+
+    //ecrt_master_debug(master, 0);
+    k_finished = (uint32_t) (get_cycles() - offset) * 1e6 / cpu_khz;
 }
 
 /*****************************************************************************/
@@ -104,6 +130,10 @@
     msr_reg_kanal("/angle0", "", &k_angle, TUINT);
     msr_reg_kanal("/pos0",   "", &k_pos,   TUINT);
 
+    msr_reg_kanal("/Timing/Pre-IO",   "ns", &k_preio,    TUINT);
+    msr_reg_kanal("/Timing/Post-IO",  "ns", &k_postio,   TUINT);
+    msr_reg_kanal("/Timing/Finished", "ns", &k_finished, TUINT);
+
     return 0;
 }
 
@@ -148,59 +178,63 @@
         goto out_return;
     }
 
-    if ((master = EtherCAT_rt_request_master(0)) == NULL) {
+    if ((master = ecrt_request_master(0)) == NULL) {
         printk(KERN_ERR "Error requesting master 0!\n");
         goto out_msr_cleanup;
     }
 
-    //EtherCAT_rt_master_print(master);
+    //ecrt_master_print(master);
 
     printk(KERN_INFO "Registering domains...\n");
 
-    if (!(domain1 = EtherCAT_rt_master_register_domain(master, ec_sync, 100)))
-    {
+    if (!(domain1 = ecrt_master_create_domain(master))) {
         printk(KERN_ERR "EtherCAT: Could not register domain!\n");
         goto out_release_master;
     }
 
-    if (!(domain2 = EtherCAT_rt_master_register_domain(master, ec_sync, 100)))
-    {
+    if (!(domain2 = ecrt_master_create_domain(master))) {
         printk(KERN_ERR "EtherCAT: Could not register domain!\n");
         goto out_release_master;
     }
 
     printk(KERN_INFO "Registering domain fields...\n");
 
-    if (EtherCAT_rt_register_domain_fields(domain1, domain1_fields)) {
+    if (ecrt_domain_register_field_list(domain1, domain1_fields)) {
         printk(KERN_ERR "Failed to register domain fields.\n");
         goto out_release_master;
     }
 
-    if (EtherCAT_rt_register_domain_fields(domain2, domain2_fields)) {
+    if (ecrt_domain_register_field_list(domain2, domain2_fields)) {
         printk(KERN_ERR "Failed to register domain fields.\n");
         goto out_release_master;
     }
 
     printk(KERN_INFO "Activating master...\n");
 
-    //EtherCAT_rt_master_debug(master, 2);
-
-    if (EtherCAT_rt_master_activate(master)) {
+    //ecrt_master_debug(master, 2);
+
+    if (ecrt_master_activate(master)) {
         printk(KERN_ERR "Could not activate master!\n");
         goto out_release_master;
     }
 
-    //EtherCAT_rt_master_debug(master, 0);
+    //ecrt_master_debug(master, 0);
 
 #if 1
-    if (EtherCAT_rt_canopen_sdo_addr_read(master, "6", 0x100A, 1,
-                                          &version)) {
+    if (ecrt_master_sdo_read(master, "6", 0x100A, 1, &version)) {
         printk(KERN_ERR "Could not read SSI version!\n");
         goto out_release_master;
     }
     printk(KERN_INFO "Software-version: %u\n", version);
 #endif
 
+#ifdef ASYNC
+    ecrt_domain_queue(domain1);
+    ecrt_domain_queue(domain2);
+    ecrt_master_async_send(master);
+    udelay(100);
+#endif
+
     ipipe_init_attr(&attr);
     attr.name = "IPIPE-MSR-MODULE";
     attr.priority = IPIPE_ROOT_PRIO + 1;
@@ -210,7 +244,7 @@
     return 0;
 
  out_release_master:
-    EtherCAT_rt_release_master(master);
+    ecrt_release_master(master);
 
  out_msr_cleanup:
     msr_rtlib_cleanup();
@@ -233,12 +267,8 @@
         printk(KERN_INFO "=== Stopping EtherCAT environment... ===\n");
 
         printk(KERN_INFO "Deactivating master...\n");
-
-        if (EtherCAT_rt_master_deactivate(master) < 0) {
-          printk(KERN_WARNING "Warning - Could not deactivate master!\n");
-        }
-
-        EtherCAT_rt_release_master(master);
+        ecrt_master_deactivate(master);
+        ecrt_release_master(master);
 
         printk(KERN_INFO "=== EtherCAT environment stopped. ===\n");
     }