master/master.c
changeset 56 36d1fa37f5e1
parent 55 059a9e712aa7
child 58 21b7342e2a90
--- a/master/master.c	Fri Jan 20 13:32:31 2006 +0000
+++ b/master/master.c	Fri Jan 20 16:04:10 2006 +0000
@@ -81,6 +81,35 @@
 /*****************************************************************************/
 
 /**
+   Setzt den Master in den Ausgangszustand.
+
+   Bei einem "release" sollte immer diese Funktion aufgerufen werden,
+   da sonst Slave-Liste, Domains, etc. weiter existieren.
+
+   @param master Zeiger auf den zurückzusetzenden Master
+*/
+
+void ec_master_reset(ec_master_t *master)
+{
+  if (master->bus_slaves) {
+    kfree(master->bus_slaves);
+    master->bus_slaves = NULL;
+  }
+
+  master->bus_slaves_count = 0;
+  master->command_index = 0;
+  master->tx_data_length = 0;
+  master->rx_data_length = 0;
+  master->domain_count = 0;
+  master->debug_level = 0;
+  master->bus_time = 0;
+  master->frames_lost = 0;
+  master->t_lost_output = 0;
+}
+
+/*****************************************************************************/
+
+/**
    Öffnet das EtherCAT-Geraet des Masters.
 
    @param master Der EtherCAT-Master
@@ -710,13 +739,18 @@
                                        unsigned int bus_index,
                                        const char *vendor_name,
                                        const char *product_name,
-                                       unsigned int domain)
+                                       int domain)
 {
   ec_slave_t *slave;
   const ec_slave_type_t *type;
   ec_domain_t *dom;
   unsigned int j;
 
+  if (domain < 0) {
+    printk(KERN_ERR "EtherCAT: Invalid domain: %i\n", domain);
+    return NULL;
+  }
+
   if (bus_index >= master->bus_slaves_count) {
     printk(KERN_ERR "EtherCAT: Illegal bus index! (%i / %i)\n", bus_index,
            master->bus_slaves_count);
@@ -734,7 +768,7 @@
 
   if (strcmp(vendor_name, type->vendor_name) ||
       strcmp(product_name, type->product_name)) {
-    printk(KERN_ERR "Invalid Slave Type! Requested: \"%s %s\", present: \"%s"
+    printk(KERN_ERR "Invalid Slave Type! Requested: \"%s %s\", found: \"%s"
            " %s\".\n", vendor_name, product_name, type->vendor_name,
            type->product_name);
     return NULL;
@@ -745,6 +779,7 @@
   for (j = 0; j < master->domain_count; j++) {
     if (domain == master->domains[j].number) {
       dom = master->domains + j;
+      break;
     }
   }
 
@@ -770,8 +805,10 @@
   }
 
   slave->process_data = dom->data + dom->data_size;
+  slave->logical_address = dom->data_size;
+  slave->registered = 1;
+
   dom->data_size += type->process_data_size;
-  slave->registered = 1;
 
   return slave;
 }
@@ -1029,8 +1066,8 @@
    @return 0 bei Erfolg, sonst < 0
 */
 
-int EtherCAT_rt_exchange_io(ec_master_t *master, unsigned int domain,
-                            unsigned int timeout_us)
+int EtherCAT_rt_domain_xio(ec_master_t *master, unsigned int domain,
+                           unsigned int timeout_us)
 {
   unsigned int i;
   ec_domain_t *dom;
@@ -1105,10 +1142,22 @@
 
 /*****************************************************************************/
 
+/**
+   Setzt die Debug-Ebene des Masters.
+*/
+
+void EtherCAT_rt_debug_level(ec_master_t *master, int level)
+{
+  master->debug_level = level;
+}
+
+/*****************************************************************************/
+
 EXPORT_SYMBOL(EtherCAT_rt_register_slave);
 EXPORT_SYMBOL(EtherCAT_rt_activate_slaves);
 EXPORT_SYMBOL(EtherCAT_rt_deactivate_slaves);
-EXPORT_SYMBOL(EtherCAT_rt_exchange_io);
+EXPORT_SYMBOL(EtherCAT_rt_domain_xio);
+EXPORT_SYMBOL(EtherCAT_rt_debug_level);
 
 /*****************************************************************************/