Bugfix: Absturz behoben, EEPROM-Infos.
authorFlorian Pose <fp@igh-essen.com>
Tue, 21 Mar 2006 15:00:50 +0000
changeset 121 1cd6f7a47b72
parent 120 e713e7420c4d
child 122 132c3ffc8dea
Bugfix: Absturz behoben, EEPROM-Infos.
master/slave.c
master/slave.h
--- a/master/slave.c	Tue Mar 21 14:35:52 2006 +0000
+++ b/master/slave.c	Tue Mar 21 15:00:50 2006 +0000
@@ -2,7 +2,7 @@
  *
  *  s l a v e . c
  *
- *  Methoden für einen EtherCAT-Slave.
+ *  Methoden fŽür einen EtherCAT-Slave.
  *
  *  $Id$
  *
@@ -53,7 +53,10 @@
     slave->registered = 0;
     slave->fmmu_count = 0;
 
-    INIT_LIST_HEAD(&slave->cat_strings);
+    INIT_LIST_HEAD(&slave->eeprom_strings);
+    slave->eeprom_name = NULL;
+    slave->eeprom_group = NULL;
+    slave->eeprom_desc = NULL;
 }
 
 /*****************************************************************************/
@@ -67,16 +70,20 @@
     ec_slave_string_t *string, *next;
 
     // Alle Strings freigeben
-    list_for_each_entry_safe(string, next, &slave->cat_strings, list) {
+    list_for_each_entry_safe(string, next, &slave->eeprom_strings, list) {
         list_del(&string->list);
         kfree(string);
     }
-}
-
-/*****************************************************************************/
-
-/**
-   Liest alle benötigten Informationen aus einem Slave.
+
+    if (slave->eeprom_name) kfree(slave->eeprom_name);
+    if (slave->eeprom_group) kfree(slave->eeprom_group);
+    if (slave->eeprom_desc) kfree(slave->eeprom_desc);
+}
+
+/*****************************************************************************/
+
+/**
+   Liest alle benŽötigten Informationen aus einem Slave.
 
    \return 0 wenn alles ok, < 0 bei Fehler.
 */
@@ -154,7 +161,7 @@
                       uint16_t offset,
                       /**< Adresse des zu lesenden SII-Registers */
                       uint32_t *target
-                      /**< Zeiger auf einen 4 Byte großen Speicher zum Ablegen
+                      /**< Zeiger auf einen 4 Byte groŽßen Speicher zum Ablegen
                          der Daten */
                       )
 {
@@ -175,7 +182,7 @@
     }
 
     // Der Slave legt die Informationen des Slave-Information-Interface
-    // in das Datenregister und löscht daraufhin ein Busy-Bit. Solange
+    // in das Datenregister und lŽöscht daraufhin ein Busy-Bit. Solange
     // den Status auslesen, bis das Bit weg ist.
 
     start = get_cycles();
@@ -244,7 +251,7 @@
     }
 
     // Der Slave legt die Informationen des Slave-Information-Interface
-    // in das Datenregister und löscht daraufhin ein Busy-Bit. Solange
+    // in das Datenregister und lŽöscht daraufhin ein Busy-Bit. Solange
     // den Status auslesen, bis das Bit weg ist.
 
     start = get_cycles();
@@ -399,17 +406,18 @@
     offset = 1;
     for (i = 0; i < string_count; i++) {
         size = data[offset];
-        // Speicher für String-Objekt und Daten in einem Rutsch allozieren
+        // Speicher fŽür String-Objekt und Daten in einem Rutsch allozieren
         if (!(string = (ec_slave_string_t *) kmalloc(sizeof(ec_slave_string_t)
                                                      + size + 1,
                                                      GFP_KERNEL))) {
             EC_ERR("Failed to allocate string memory.\n");
             return -1;
         }
-        string->data = (char *) (string + sizeof(ec_slave_string_t));
+        string->size = size;
+        string->data = (char *) string + sizeof(ec_slave_string_t);
         memcpy(string->data, data + offset + 1, size);
         string->data[size] = 0x00;
-        list_add_tail(&string->list, &slave->cat_strings);
+        list_add_tail(&string->list, &slave->eeprom_strings);
         offset += 1 + size;
     }
 
@@ -479,13 +487,13 @@
 /*****************************************************************************/
 
 /**
-   Bestätigt einen Fehler beim Zustandswechsel.
+   BestŽätigt einen Fehler beim Zustandswechsel.
 
    \todo Funktioniert noch nicht...
 */
 
 void ec_slave_state_ack(ec_slave_t *slave,
-                        /**< Slave, dessen Zustand geändert werden soll */
+                        /**< Slave, dessen Zustand geŽändert werden soll */
                         uint8_t state
                         /**< Alter Zustand */
                         )
@@ -543,13 +551,13 @@
 /*****************************************************************************/
 
 /**
-   Ändert den Zustand eines Slaves.
+   ŽÄndert den Zustand eines Slaves.
 
    \return 0 bei Erfolg, sonst < 0
 */
 
 int ec_slave_state_change(ec_slave_t *slave,
-                          /**< Slave, dessen Zustand geändert werden soll */
+                          /**< Slave, dessen Zustand geŽändert werden soll */
                           uint8_t state
                           /**< Neuer Zustand */
                           )
@@ -610,17 +618,17 @@
    Merkt eine FMMU-Konfiguration vor.
 
    Die FMMU wird so konfiguriert, dass sie den gesamten Datenbereich des
-   entsprechenden Sync-Managers abdeckt. Für jede Domäne werden separate
+   entsprechenden Sync-Managers abdeckt. FŽür jede DomŽäne werden separate
    FMMUs konfiguriert.
 
    Wenn die entsprechende FMMU bereits konfiguriert ist, wird dies als
-   Erfolg zurückgegeben.
+   Erfolg zurŽückgegeben.
 
    \return 0 bei Erfolg, sonst < 0
 */
 
 int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */
-                      const ec_domain_t *domain, /**< Domäne */
+                      const ec_domain_t *domain, /**< DomŽäne */
                       const ec_sync_t *sync  /**< Sync-Manager */
                       )
 {
@@ -650,13 +658,11 @@
 /*****************************************************************************/
 
 /**
-   Gibt alle Informationen über einen EtherCAT-Slave aus.
+   Gibt alle Informationen Žüber einen EtherCAT-Slave aus.
 */
 
 void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */)
 {
-    ec_slave_string_t *string;
-
     EC_INFO("--- EtherCAT slave information ---\n");
 
     if (slave->type) {
@@ -677,24 +683,25 @@
     EC_INFO("    Supported FMMUs: %i, Sync managers: %i\n",
             slave->base_fmmu_count, slave->base_sync_count);
 
-    EC_INFO("  Slave information interface:\n");
+    EC_INFO("  EEPROM data:\n");
     EC_INFO("    Configured station alias: 0x%04X (%i)\n", slave->sii_alias,
             slave->sii_alias);
     EC_INFO("    Vendor-ID: 0x%08X, Product code: 0x%08X\n",
             slave->sii_vendor_id, slave->sii_product_code);
     EC_INFO("    Revision number: 0x%08X, Serial number: 0x%08X\n",
             slave->sii_revision_number, slave->sii_serial_number);
-
-    EC_INFO("    EEPROM strings:\n");
-    list_for_each_entry(string, &slave->cat_strings, list) {
-        EC_INFO("      * \"%s\"\n", string->data);
-    }
-}
-
-/*****************************************************************************/
-
-/**
-   Gibt die Zählerstände der CRC-Fault-Counter aus und setzt diese zurück.
+    if (slave->eeprom_name)
+        EC_INFO("    Name: %s\n", slave->eeprom_name);
+    if (slave->eeprom_group)
+        EC_INFO("    Group: %s\n", slave->eeprom_group);
+    if (slave->eeprom_desc)
+        EC_INFO("    Description: %s\n", slave->eeprom_desc);
+}
+
+/*****************************************************************************/
+
+/**
+   Gibt die ZŽählerstŽände der CRC-Fault-Counter aus und setzt diese zurŽück.
 
    \return 0 bei Erfolg, sonst < 0
 */
--- a/master/slave.h	Tue Mar 21 14:35:52 2006 +0000
+++ b/master/slave.h	Tue Mar 21 15:00:50 2006 +0000
@@ -58,6 +58,7 @@
 typedef struct
 {
     struct list_head list;
+    size_t size;
     char *data;
 }
 ec_slave_string_t;
@@ -98,7 +99,11 @@
     ec_fmmu_t fmmus[EC_MAX_FMMUS]; /**< FMMU-Konfigurationen */
     uint8_t fmmu_count; /**< Wieviele FMMUs schon benutzt sind. */
 
-    struct list_head cat_strings; /**< Strings im EEPROM */
+    struct list_head eeprom_strings; /**< Strings im EEPROM */
+
+    const char *eeprom_name; /**< Slave-Name laut Hersteller */
+    const char *eeprom_group; /**< Slave-Beschreibung laut Hersteller */
+    const char *eeprom_desc; /**< Slave-Beschreibung laut Hersteller */
 };
 
 /*****************************************************************************/